solargraph 0.47.2 → 0.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.github/workflows/plugins.yml +40 -0
- data/.github/workflows/rspec.yml +4 -8
- data/.github/workflows/typecheck.yml +34 -0
- data/.yardopts +2 -2
- data/CHANGELOG.md +166 -3
- data/LICENSE +1 -1
- data/README.md +19 -16
- data/SPONSORS.md +2 -9
- data/lib/solargraph/api_map/cache.rb +50 -20
- data/lib/solargraph/api_map/source_to_yard.rb +17 -10
- data/lib/solargraph/api_map/store.rb +68 -15
- data/lib/solargraph/api_map.rb +238 -112
- data/lib/solargraph/bench.rb +3 -2
- data/lib/solargraph/cache.rb +77 -0
- data/lib/solargraph/complex_type/type_methods.rb +116 -35
- data/lib/solargraph/complex_type/unique_type.rb +261 -33
- data/lib/solargraph/complex_type.rb +149 -30
- data/lib/solargraph/convention/rakefile.rb +17 -0
- data/lib/solargraph/convention.rb +2 -3
- data/lib/solargraph/converters/dd.rb +5 -0
- data/lib/solargraph/converters/dl.rb +3 -0
- data/lib/solargraph/converters/dt.rb +3 -0
- data/lib/solargraph/diagnostics/rubocop.rb +23 -8
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +4 -1
- data/lib/solargraph/diagnostics/type_check.rb +1 -0
- data/lib/solargraph/diagnostics.rb +2 -2
- data/lib/solargraph/doc_map.rb +187 -0
- data/lib/solargraph/gem_pins.rb +72 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
- data/lib/solargraph/language_server/host/dispatch.rb +22 -5
- data/lib/solargraph/language_server/host/message_worker.rb +4 -0
- data/lib/solargraph/language_server/host/sources.rb +8 -65
- data/lib/solargraph/language_server/host.rb +88 -93
- data/lib/solargraph/language_server/message/base.rb +1 -1
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
- data/lib/solargraph/language_server/message/extended/download_core.rb +1 -5
- data/lib/solargraph/language_server/message/initialize.rb +27 -0
- data/lib/solargraph/language_server/message/initialized.rb +1 -0
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +4 -1
- data/lib/solargraph/language_server/message/text_document/formatting.rb +5 -4
- data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -6
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
- data/lib/solargraph/language_server/message/text_document.rb +1 -1
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +10 -3
- data/lib/solargraph/language_server/message.rb +1 -0
- data/lib/solargraph/language_server/progress.rb +118 -0
- data/lib/solargraph/language_server/transport/adapter.rb +16 -1
- data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
- data/lib/solargraph/language_server.rb +1 -0
- data/lib/solargraph/library.rb +231 -104
- data/lib/solargraph/location.rb +1 -0
- data/lib/solargraph/page.rb +6 -0
- data/lib/solargraph/parser/comment_ripper.rb +4 -0
- data/lib/solargraph/parser/node_methods.rb +47 -7
- data/lib/solargraph/parser/node_processor/base.rb +11 -1
- data/lib/solargraph/parser/node_processor.rb +1 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -9
- data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +57 -41
- data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +53 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +14 -4
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/cvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +7 -20
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +2 -2
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +47 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +7 -5
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -0
- data/lib/solargraph/parser/region.rb +1 -1
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +9 -10
- data/lib/solargraph/pin/base.rb +69 -11
- data/lib/solargraph/pin/base_variable.rb +40 -7
- data/lib/solargraph/pin/block.rb +81 -33
- data/lib/solargraph/pin/closure.rb +17 -2
- data/lib/solargraph/pin/common.rb +7 -3
- data/lib/solargraph/pin/conversions.rb +34 -8
- data/lib/solargraph/pin/delegated_method.rb +101 -0
- data/lib/solargraph/pin/documenting.rb +25 -32
- data/lib/solargraph/pin/instance_variable.rb +4 -0
- data/lib/solargraph/pin/local_variable.rb +13 -1
- data/lib/solargraph/pin/method.rb +273 -17
- data/lib/solargraph/pin/namespace.rb +17 -1
- data/lib/solargraph/pin/parameter.rb +40 -28
- data/lib/solargraph/pin/reference/override.rb +2 -2
- data/lib/solargraph/pin/reference.rb +8 -0
- data/lib/solargraph/pin/search.rb +4 -4
- data/lib/solargraph/pin/signature.rb +143 -0
- data/lib/solargraph/pin.rb +2 -1
- data/lib/solargraph/range.rb +4 -6
- data/lib/solargraph/rbs_map/conversions.rb +607 -0
- data/lib/solargraph/rbs_map/core_fills.rb +50 -0
- data/lib/solargraph/rbs_map/core_map.rb +28 -0
- data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
- data/lib/solargraph/rbs_map.rb +92 -0
- data/lib/solargraph/shell.rb +85 -59
- data/lib/solargraph/source/chain/array.rb +32 -0
- data/lib/solargraph/source/chain/block_symbol.rb +13 -0
- data/lib/solargraph/source/chain/call.rb +125 -61
- data/lib/solargraph/source/chain/constant.rb +15 -1
- data/lib/solargraph/source/chain/if.rb +23 -0
- data/lib/solargraph/source/chain/link.rb +8 -2
- data/lib/solargraph/source/chain/or.rb +1 -1
- data/lib/solargraph/source/chain/z_super.rb +3 -3
- data/lib/solargraph/source/chain.rb +64 -14
- data/lib/solargraph/source/change.rb +3 -0
- data/lib/solargraph/source/cursor.rb +2 -0
- data/lib/solargraph/source/source_chainer.rb +8 -5
- data/lib/solargraph/source/updater.rb +1 -0
- data/lib/solargraph/source.rb +18 -63
- data/lib/solargraph/source_map/clip.rb +31 -23
- data/lib/solargraph/source_map/mapper.rb +23 -7
- data/lib/solargraph/source_map.rb +36 -11
- data/lib/solargraph/type_checker/checks.rb +10 -2
- data/lib/solargraph/type_checker.rb +229 -100
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/environment.erb +2 -2
- data/lib/solargraph/workspace/config.rb +15 -11
- data/lib/solargraph/workspace.rb +41 -17
- data/lib/solargraph/yard_map/cache.rb +6 -0
- data/lib/solargraph/yard_map/helpers.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_method.rb +23 -7
- data/lib/solargraph/yard_map/mapper.rb +1 -1
- data/lib/solargraph/yard_map/to_method.rb +11 -4
- data/lib/solargraph/yard_map.rb +1 -443
- data/lib/solargraph/yard_tags.rb +20 -0
- data/lib/solargraph/yardoc.rb +52 -0
- data/lib/solargraph.rb +8 -6
- data/solargraph.gemspec +19 -8
- metadata +164 -99
- data/.travis.yml +0 -19
- data/lib/solargraph/api_map/bundler_methods.rb +0 -22
- data/lib/solargraph/compat.rb +0 -37
- data/lib/solargraph/convention/rspec.rb +0 -30
- data/lib/solargraph/documentor.rb +0 -76
- data/lib/solargraph/language_server/host/cataloger.rb +0 -56
- data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
- data/lib/solargraph/parser/legacy.rb +0 -12
- data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
- data/lib/solargraph/parser/rubyvm.rb +0 -40
- data/lib/solargraph/yard_map/core_docs.rb +0 -170
- data/lib/solargraph/yard_map/core_fills.rb +0 -208
- data/lib/solargraph/yard_map/core_gen.rb +0 -76
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
- data/lib/yard-solargraph.rb +0 -33
- data/yardoc/2.2.2.tar.gz +0 -0
@@ -3,38 +3,78 @@ module Solargraph
|
|
3
3
|
class NodeMethods
|
4
4
|
module_function
|
5
5
|
|
6
|
+
# @abstract
|
7
|
+
# @param node [Parser::AST::Node]
|
8
|
+
# @return [String]
|
6
9
|
def unpack_name node
|
7
10
|
raise NotImplementedError
|
8
11
|
end
|
9
12
|
|
10
|
-
|
13
|
+
# @abstract
|
14
|
+
# @todo Temporarily here for testing. Move to Solargraph::Parser.
|
15
|
+
# @param node [Parser::AST::Node]
|
16
|
+
# @return [Array<Parser::AST::Node>]
|
17
|
+
def call_nodes_from node
|
11
18
|
raise NotImplementedError
|
12
19
|
end
|
13
20
|
|
14
|
-
|
21
|
+
# Find all the nodes within the provided node that potentially return a
|
22
|
+
# value.
|
23
|
+
#
|
24
|
+
# The node parameter typically represents a method's logic, e.g., the
|
25
|
+
# second child (after the :args node) of a :def node. A simple one-line
|
26
|
+
# method would typically return itself, while a node with conditions
|
27
|
+
# would return the resulting node from each conditional branch. Nodes
|
28
|
+
# that follow a :return node are assumed to be unreachable. Nil values
|
29
|
+
# are converted to nil node types.
|
30
|
+
#
|
31
|
+
# @abstract
|
32
|
+
# @param node [Parser::AST::Node]
|
33
|
+
# @return [Array<Parser::AST::Node>]
|
34
|
+
def returns_from_method_body node
|
15
35
|
raise NotImplementedError
|
16
36
|
end
|
17
37
|
|
18
|
-
|
38
|
+
# @abstract
|
39
|
+
# @param node [Parser::AST::Node]
|
40
|
+
#
|
41
|
+
# @return [Array<Parser::AST::Node>]
|
42
|
+
def const_nodes_from node
|
19
43
|
raise NotImplementedError
|
20
44
|
end
|
21
45
|
|
22
|
-
|
46
|
+
# @abstract
|
47
|
+
# @param cursor [Solargraph::Source::Cursor]
|
48
|
+
# @return [Parser::AST::Node, nil]
|
49
|
+
def find_recipient_node cursor
|
23
50
|
raise NotImplementedError
|
24
51
|
end
|
25
52
|
|
26
|
-
|
53
|
+
# @abstract
|
54
|
+
# @param node [Parser::AST::Node]
|
55
|
+
# @return [Array<AST::Node>] low-level value nodes in
|
56
|
+
# value position. Does not include explicit return
|
57
|
+
# statements
|
58
|
+
def value_position_nodes_only(node)
|
27
59
|
raise NotImplementedError
|
28
60
|
end
|
29
61
|
|
30
|
-
|
62
|
+
# @abstract
|
63
|
+
# @param nodes [Enumerable<Parser::AST::Node>]
|
64
|
+
def any_splatted_call?(nodes)
|
31
65
|
raise NotImplementedError
|
32
66
|
end
|
33
67
|
|
34
|
-
|
68
|
+
# @abstract
|
69
|
+
# @param node [Parser::AST::Node]
|
70
|
+
# @return [void]
|
71
|
+
def process node
|
35
72
|
raise NotImplementedError
|
36
73
|
end
|
37
74
|
|
75
|
+
# @abstract
|
76
|
+
# @param node [Parser::AST::Node]
|
77
|
+
# @return [Hash{Parser::AST::Node => Chain}]
|
38
78
|
def convert_hash node
|
39
79
|
raise NotImplementedError
|
40
80
|
end
|
@@ -13,12 +13,13 @@ module Solargraph
|
|
13
13
|
# @return [Array<Pin::Base>]
|
14
14
|
attr_reader :pins
|
15
15
|
|
16
|
-
# @return [Array<Pin::
|
16
|
+
# @return [Array<Pin::BaseVariable>]
|
17
17
|
attr_reader :locals
|
18
18
|
|
19
19
|
# @param node [Parser::AST::Node]
|
20
20
|
# @param region [Region]
|
21
21
|
# @param pins [Array<Pin::Base>]
|
22
|
+
# @param locals [Array<Pin::LocalVariable>]
|
22
23
|
def initialize node, region, pins, locals
|
23
24
|
@node = node
|
24
25
|
@region = region
|
@@ -54,20 +55,29 @@ module Solargraph
|
|
54
55
|
Location.new(region.filename, range)
|
55
56
|
end
|
56
57
|
|
58
|
+
# @param node [Parser::AST::Node]
|
59
|
+
# @return [String, nil]
|
57
60
|
def comments_for(node)
|
58
61
|
region.source.comments_for(node)
|
59
62
|
end
|
60
63
|
|
64
|
+
# @param position [Solargraph::Position]
|
65
|
+
# @return [Pin::Closure, nil]
|
61
66
|
def named_path_pin position
|
62
67
|
pins.select{|pin| pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)}.last
|
63
68
|
end
|
64
69
|
|
65
70
|
# @todo Candidate for deprecation
|
71
|
+
# @param position [Solargraph::Position]
|
72
|
+
# @return [Pin::Closure, nil]
|
66
73
|
def block_pin position
|
74
|
+
# @todo determine if this can return a Pin::Block
|
67
75
|
pins.select{|pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position)}.last
|
68
76
|
end
|
69
77
|
|
70
78
|
# @todo Candidate for deprecation
|
79
|
+
# @param position [Solargraph::Position]
|
80
|
+
# @return [Pin::Closure, nil]
|
71
81
|
def closure_pin position
|
72
82
|
pins.select{|pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position)}.last
|
73
83
|
end
|
@@ -24,6 +24,7 @@ module Solargraph
|
|
24
24
|
# @param node [Parser::AST::Node]
|
25
25
|
# @param region [Region]
|
26
26
|
# @param pins [Array<Pin::Base>]
|
27
|
+
# @param locals [Array<Pin::BaseVariable>]
|
27
28
|
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
|
28
29
|
def self.process node, region = Region.new, pins = [], locals = []
|
29
30
|
if pins.empty?
|
@@ -1,12 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'parser/current'
|
4
|
+
require 'parser/source/buffer'
|
2
5
|
|
3
6
|
module Solargraph
|
4
7
|
module Parser
|
5
|
-
module
|
8
|
+
module ParserGem
|
6
9
|
module ClassMethods
|
7
10
|
# @param code [String]
|
8
|
-
# @param filename [String]
|
9
|
-
# @return [Array(Parser::AST::Node,
|
11
|
+
# @param filename [String, nil]
|
12
|
+
# @return [Array(Parser::AST::Node, Hash{Integer => String})]
|
10
13
|
def parse_with_comments code, filename = nil
|
11
14
|
buffer = ::Parser::Source::Buffer.new(filename, 0)
|
12
15
|
buffer.source = code
|
@@ -29,7 +32,7 @@ module Solargraph
|
|
29
32
|
raise Parser::SyntaxError, e.message
|
30
33
|
end
|
31
34
|
|
32
|
-
# @return [Parser::Base]
|
35
|
+
# @return [::Parser::Base]
|
33
36
|
def parser
|
34
37
|
# @todo Consider setting an instance variable. We might not need to
|
35
38
|
# recreate the parser every time we use it.
|
@@ -39,19 +42,26 @@ module Solargraph
|
|
39
42
|
parser
|
40
43
|
end
|
41
44
|
|
45
|
+
# @param source [Source]
|
46
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
|
42
47
|
def map source
|
43
48
|
NodeProcessor.process(source.node, Region.new(source: source))
|
44
49
|
end
|
45
50
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
51
|
+
# @param source [Source]
|
52
|
+
# @param name [String]
|
53
|
+
# @return [Array<Location>]
|
50
54
|
def references source, name
|
51
55
|
if name.end_with?("=")
|
52
56
|
reg = /#{Regexp.escape name[0..-2]}\s*=/
|
57
|
+
# @param code [String]
|
58
|
+
# @param offset [Integer]
|
59
|
+
# @return [Array(Integer, Integer), Array(nil, nil)]
|
53
60
|
extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
|
54
61
|
else
|
62
|
+
# @param code [String]
|
63
|
+
# @param offset [Integer]
|
64
|
+
# @return [Array(Integer, Integer), Array(nil, nil)]
|
55
65
|
extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
|
56
66
|
end
|
57
67
|
inner_node_references(name, source.node).map do |n|
|
@@ -80,36 +90,48 @@ module Solargraph
|
|
80
90
|
result
|
81
91
|
end
|
82
92
|
|
93
|
+
# @return [Source::Chain]
|
83
94
|
def chain *args
|
84
95
|
NodeChainer.chain *args
|
85
96
|
end
|
86
97
|
|
98
|
+
# @return [Source::Chain]
|
87
99
|
def chain_string *args
|
88
100
|
NodeChainer.load_string *args
|
89
101
|
end
|
90
102
|
|
103
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
|
91
104
|
def process_node *args
|
92
105
|
Solargraph::Parser::NodeProcessor.process *args
|
93
106
|
end
|
94
107
|
|
108
|
+
# @param node [Parser::AST::Node]
|
109
|
+
# @return [String, nil]
|
95
110
|
def infer_literal_node_type node
|
96
111
|
NodeMethods.infer_literal_node_type node
|
97
112
|
end
|
98
113
|
|
114
|
+
# @return [Integer]
|
99
115
|
def version
|
100
116
|
parser.version
|
101
117
|
end
|
102
118
|
|
119
|
+
# @param node [BasicObject]
|
120
|
+
# @return [Boolean]
|
103
121
|
def is_ast_node? node
|
104
122
|
node.is_a?(::Parser::AST::Node)
|
105
123
|
end
|
106
124
|
|
125
|
+
# @param node [Parser::AST::Node]
|
126
|
+
# @return [Range]
|
107
127
|
def node_range node
|
108
128
|
st = Position.new(node.loc.line, node.loc.column)
|
109
129
|
en = Position.new(node.loc.last_line, node.loc.last_column)
|
110
130
|
Range.new(st, en)
|
111
131
|
end
|
112
132
|
|
133
|
+
# @param node [Parser::AST::Node]
|
134
|
+
# @return [Array<Range>]
|
113
135
|
def string_ranges node
|
114
136
|
return [] unless is_ast_node?(node)
|
115
137
|
result = []
|
@@ -128,7 +150,7 @@ module Solargraph
|
|
128
150
|
end
|
129
151
|
end
|
130
152
|
result
|
131
|
-
end
|
153
|
+
end
|
132
154
|
end
|
133
155
|
end
|
134
156
|
end
|
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
module Solargraph
|
4
4
|
module Parser
|
5
|
-
module
|
5
|
+
module ParserGem
|
6
6
|
# A custom builder for source parsers that ignores character encoding
|
7
7
|
# issues in literal strings.
|
8
8
|
#
|
9
9
|
class FlawedBuilder < ::Parser::Builders::Default
|
10
|
+
# @param token [::Parser::AST::Node]
|
11
|
+
# @return [String]
|
10
12
|
def string_value(token)
|
11
13
|
value(token)
|
12
14
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Solargraph
|
4
4
|
module Parser
|
5
|
-
module
|
5
|
+
module ParserGem
|
6
6
|
# A factory for generating chains from nodes.
|
7
7
|
#
|
8
8
|
class NodeChainer
|
@@ -10,11 +10,12 @@ module Solargraph
|
|
10
10
|
Chain = Source::Chain
|
11
11
|
|
12
12
|
# @param node [Parser::AST::Node]
|
13
|
-
# @param filename [String]
|
14
|
-
|
13
|
+
# @param filename [String, nil]
|
14
|
+
# @param parent [Parser::AST::Node, nil]
|
15
|
+
def initialize node, filename = nil, parent = nil
|
15
16
|
@node = node
|
16
17
|
@filename = filename
|
17
|
-
@
|
18
|
+
@parent = parent
|
18
19
|
end
|
19
20
|
|
20
21
|
# @return [Source::Chain]
|
@@ -25,10 +26,11 @@ module Solargraph
|
|
25
26
|
|
26
27
|
class << self
|
27
28
|
# @param node [Parser::AST::Node]
|
28
|
-
# @param filename [String]
|
29
|
+
# @param filename [String, nil]
|
30
|
+
# @param parent [Parser::AST::Node, nil]
|
29
31
|
# @return [Source::Chain]
|
30
|
-
def chain node, filename = nil,
|
31
|
-
NodeChainer.new(node, filename,
|
32
|
+
def chain node, filename = nil, parent = nil
|
33
|
+
NodeChainer.new(node, filename, parent).chain
|
32
34
|
end
|
33
35
|
|
34
36
|
# @param code [String]
|
@@ -47,54 +49,43 @@ module Solargraph
|
|
47
49
|
# @return [Array<Chain::Link>]
|
48
50
|
def generate_links n
|
49
51
|
return [] unless n.is_a?(::Parser::AST::Node)
|
50
|
-
return generate_links(n.children[0]) if n.type == :begin
|
51
52
|
return generate_links(n.children[0]) if n.type == :splat
|
53
|
+
# @type [Array<Chain::Link>]
|
52
54
|
result = []
|
53
55
|
if n.type == :block
|
54
|
-
@
|
55
|
-
result.concat generate_links(n.children[0])
|
56
|
-
@in_block -= 1
|
56
|
+
result.concat NodeChainer.chain(n.children[0], @filename, n).links
|
57
57
|
elsif n.type == :send
|
58
58
|
if n.children[0].is_a?(::Parser::AST::Node)
|
59
59
|
result.concat generate_links(n.children[0])
|
60
|
-
|
61
|
-
n.children[2..-1].each do |c|
|
62
|
-
args.push NodeChainer.chain(c)
|
63
|
-
end
|
64
|
-
result.push Chain::Call.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
|
60
|
+
result.push Chain::Call.new(n.children[1].to_s, node_args(n), passed_block(n))
|
65
61
|
elsif n.children[0].nil?
|
66
62
|
args = []
|
67
63
|
n.children[2..-1].each do |c|
|
68
|
-
args.push NodeChainer.chain(c)
|
64
|
+
args.push NodeChainer.chain(c, @filename, n)
|
69
65
|
end
|
70
|
-
result.push Chain::Call.new(n.children[1].to_s,
|
66
|
+
result.push Chain::Call.new(n.children[1].to_s, node_args(n), passed_block(n))
|
71
67
|
else
|
72
68
|
raise "No idea what to do with #{n}"
|
73
69
|
end
|
74
70
|
elsif n.type == :csend
|
75
71
|
if n.children[0].is_a?(::Parser::AST::Node)
|
76
72
|
result.concat generate_links(n.children[0])
|
77
|
-
|
78
|
-
n.children[2..-1].each do |c|
|
79
|
-
args.push NodeChainer.chain(c)
|
80
|
-
end
|
81
|
-
result.push Chain::QCall.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
|
73
|
+
result.push Chain::QCall.new(n.children[1].to_s, node_args(n))
|
82
74
|
elsif n.children[0].nil?
|
83
|
-
|
84
|
-
n.children[2..-1].each do |c|
|
85
|
-
args.push NodeChainer.chain(c)
|
86
|
-
end
|
87
|
-
result.push Chain::QCall.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
|
75
|
+
result.push Chain::QCall.new(n.children[1].to_s, node_args(n))
|
88
76
|
else
|
89
77
|
raise "No idea what to do with #{n}"
|
90
78
|
end
|
91
79
|
elsif n.type == :self
|
92
80
|
result.push Chain::Head.new('self')
|
93
81
|
elsif n.type == :zsuper
|
94
|
-
result.push Chain::ZSuper.new('super'
|
82
|
+
result.push Chain::ZSuper.new('super')
|
95
83
|
elsif n.type == :super
|
96
|
-
args = n.children.map { |c| NodeChainer.chain(c) }
|
97
|
-
result.push Chain::Call.new('super', args
|
84
|
+
args = n.children.map { |c| NodeChainer.chain(c, @filename, n) }
|
85
|
+
result.push Chain::Call.new('super', args)
|
86
|
+
elsif n.type == :yield
|
87
|
+
args = n.children.map { |c| NodeChainer.chain(c, @filename, n) }
|
88
|
+
result.push Chain::Call.new('yield', args)
|
98
89
|
elsif n.type == :const
|
99
90
|
const = unpack_name(n)
|
100
91
|
result.push Chain::Constant.new(const)
|
@@ -114,24 +105,37 @@ module Solargraph
|
|
114
105
|
elsif n.type == :and
|
115
106
|
result.concat generate_links(n.children.last)
|
116
107
|
elsif n.type == :or
|
117
|
-
result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename)])
|
108
|
+
result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename, n)])
|
109
|
+
elsif n.type == :if
|
110
|
+
result.push Chain::If.new([NodeChainer.chain(n.children[1], @filename), NodeChainer.chain(n.children[2], @filename, n)])
|
118
111
|
elsif [:begin, :kwbegin].include?(n.type)
|
119
|
-
result.concat generate_links(n.children
|
112
|
+
result.concat generate_links(n.children.last)
|
120
113
|
elsif n.type == :block_pass
|
121
|
-
|
114
|
+
block_variable_name_node = n.children[0]
|
115
|
+
if block_variable_name_node.nil?
|
116
|
+
# anonymous block forwarding (e.g., "&")
|
117
|
+
# added in Ruby 3.1 - https://bugs.ruby-lang.org/issues/11256
|
118
|
+
result.push Chain::BlockVariable.new(nil)
|
119
|
+
else
|
120
|
+
if block_variable_name_node.type == :sym
|
121
|
+
result.push Chain::BlockSymbol.new("#{block_variable_name_node.children[0].to_s}")
|
122
|
+
else
|
123
|
+
result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0].to_s}")
|
124
|
+
end
|
125
|
+
end
|
122
126
|
elsif n.type == :hash
|
123
127
|
result.push Chain::Hash.new('::Hash', hash_is_splatted?(n))
|
128
|
+
elsif n.type == :array
|
129
|
+
chained_children = n.children.map { |c| NodeChainer.chain(c) }
|
130
|
+
result.push Source::Chain::Array.new(chained_children)
|
124
131
|
else
|
125
132
|
lit = infer_literal_node_type(n)
|
126
|
-
|
127
|
-
# result.push Chain::Hash.new(lit, hash_is_splatted?(n))
|
128
|
-
# else
|
129
|
-
result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
|
130
|
-
# end
|
133
|
+
result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
|
131
134
|
end
|
132
135
|
result
|
133
136
|
end
|
134
137
|
|
138
|
+
# @param node [Parser::AST::Node]
|
135
139
|
def hash_is_splatted? node
|
136
140
|
return false unless Parser.is_ast_node?(node) && node.type == :hash
|
137
141
|
return false unless Parser.is_ast_node?(node.children.last) && node.children.last.type == :kwsplat
|
@@ -139,8 +143,20 @@ module Solargraph
|
|
139
143
|
true
|
140
144
|
end
|
141
145
|
|
142
|
-
|
143
|
-
|
146
|
+
# @param node [Parser::AST::Node]
|
147
|
+
# @return [Source::Chain, nil]
|
148
|
+
def passed_block node
|
149
|
+
return unless node == @node && @parent&.type == :block
|
150
|
+
|
151
|
+
NodeChainer.chain(@parent.children[2], @filename)
|
152
|
+
end
|
153
|
+
|
154
|
+
# @param node [Parser::AST::Node]
|
155
|
+
# @return [Array<Source::Chain>]
|
156
|
+
def node_args node
|
157
|
+
node.children[2..-1].map do |child|
|
158
|
+
NodeChainer.chain(child, @filename, node)
|
159
|
+
end
|
144
160
|
end
|
145
161
|
end
|
146
162
|
end
|