solargraph 0.58.3 → 0.59.2
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/.envrc +3 -0
- data/.github/workflows/linting.yml +12 -5
- data/.github/workflows/plugins.yml +54 -34
- data/.github/workflows/rspec.yml +15 -28
- data/.github/workflows/typecheck.yml +6 -3
- data/.rubocop.yml +38 -6
- data/.rubocop_todo.yml +53 -966
- data/CHANGELOG.md +24 -0
- data/Gemfile +3 -1
- data/README.md +3 -3
- data/Rakefile +26 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/cache.rb +3 -3
- data/lib/solargraph/api_map/constants.rb +12 -3
- data/lib/solargraph/api_map/index.rb +29 -18
- data/lib/solargraph/api_map/source_to_yard.rb +22 -9
- data/lib/solargraph/api_map/store.rb +40 -30
- data/lib/solargraph/api_map.rb +160 -78
- data/lib/solargraph/bench.rb +2 -3
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +31 -18
- data/lib/solargraph/complex_type/unique_type.rb +221 -63
- data/lib/solargraph/complex_type.rb +173 -59
- data/lib/solargraph/convention/active_support_concern.rb +111 -111
- data/lib/solargraph/convention/base.rb +50 -50
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +1 -1
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
- data/lib/solargraph/convention/data_definition.rb +5 -2
- data/lib/solargraph/convention/gemfile.rb +1 -1
- data/lib/solargraph/convention/gemspec.rb +1 -1
- data/lib/solargraph/convention/rakefile.rb +1 -1
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +2 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
- data/lib/solargraph/convention/struct_definition.rb +8 -4
- data/lib/solargraph/convention.rb +2 -2
- data/lib/solargraph/converters/dd.rb +2 -0
- data/lib/solargraph/converters/dl.rb +2 -0
- data/lib/solargraph/converters/dt.rb +2 -0
- data/lib/solargraph/converters/misc.rb +2 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
- data/lib/solargraph/diagnostics/rubocop.rb +11 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
- data/lib/solargraph/diagnostics/type_check.rb +11 -10
- data/lib/solargraph/diagnostics/update_errors.rb +4 -8
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/doc_map.rb +38 -39
- data/lib/solargraph/environ.rb +52 -52
- data/lib/solargraph/equality.rb +4 -4
- data/lib/solargraph/gem_pins.rb +4 -15
- data/lib/solargraph/language_server/error_codes.rb +10 -10
- data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
- data/lib/solargraph/language_server/host/dispatch.rb +3 -3
- data/lib/solargraph/language_server/host/message_worker.rb +4 -3
- data/lib/solargraph/language_server/host/sources.rb +2 -1
- data/lib/solargraph/language_server/host.rb +35 -28
- data/lib/solargraph/language_server/message/base.rb +1 -1
- data/lib/solargraph/language_server/message/client/register_capability.rb +1 -3
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +6 -8
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +12 -18
- data/lib/solargraph/language_server/message/extended/document.rb +1 -0
- data/lib/solargraph/language_server/message/extended/document_gems.rb +7 -7
- data/lib/solargraph/language_server/message/extended/download_core.rb +2 -1
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
- data/lib/solargraph/language_server/message/extended/search.rb +1 -1
- data/lib/solargraph/language_server/message/initialize.rb +20 -14
- data/lib/solargraph/language_server/message/initialized.rb +28 -28
- data/lib/solargraph/language_server/message/text_document/completion.rb +10 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +17 -10
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -19
- data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +5 -5
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +13 -6
- data/lib/solargraph/language_server/message/text_document/references.rb +17 -10
- data/lib/solargraph/language_server/message/text_document/rename.rb +20 -13
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +3 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
- data/lib/solargraph/language_server/message/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +34 -28
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +38 -30
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +23 -17
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
- data/lib/solargraph/language_server/message.rb +1 -1
- data/lib/solargraph/language_server/progress.rb +143 -143
- data/lib/solargraph/language_server/request.rb +4 -2
- data/lib/solargraph/language_server/transport/adapter.rb +68 -68
- data/lib/solargraph/language_server/transport/data_reader.rb +11 -13
- data/lib/solargraph/language_server/uri_helpers.rb +2 -2
- data/lib/solargraph/language_server.rb +20 -20
- data/lib/solargraph/library.rb +57 -38
- data/lib/solargraph/location.rb +17 -14
- data/lib/solargraph/logging.rb +22 -4
- data/lib/solargraph/page.rb +1 -1
- data/lib/solargraph/parser/comment_ripper.rb +19 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +324 -108
- data/lib/solargraph/parser/node_processor/base.rb +34 -4
- data/lib/solargraph/parser/node_processor.rb +8 -7
- data/lib/solargraph/parser/parser_gem/class_methods.rb +30 -14
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +51 -25
- data/lib/solargraph/parser/parser_gem/node_methods.rb +181 -73
- data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +24 -24
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -12
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +36 -36
- data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +24 -24
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +9 -8
- data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +24 -24
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +40 -40
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
- data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
- data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
- data/lib/solargraph/parser/parser_gem.rb +2 -0
- data/lib/solargraph/parser/region.rb +9 -3
- data/lib/solargraph/parser/snippet.rb +3 -1
- data/lib/solargraph/parser.rb +2 -0
- data/lib/solargraph/pin/base.rb +126 -82
- data/lib/solargraph/pin/base_variable.rb +273 -24
- data/lib/solargraph/pin/block.rb +29 -6
- data/lib/solargraph/pin/breakable.rb +7 -1
- data/lib/solargraph/pin/callable.rb +65 -21
- data/lib/solargraph/pin/closure.rb +7 -10
- data/lib/solargraph/pin/common.rb +24 -6
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/constant.rb +3 -5
- data/lib/solargraph/pin/conversions.rb +10 -4
- data/lib/solargraph/pin/delegated_method.rb +19 -8
- data/lib/solargraph/pin/documenting.rb +4 -2
- data/lib/solargraph/pin/instance_variable.rb +5 -1
- data/lib/solargraph/pin/keyword.rb +0 -4
- data/lib/solargraph/pin/local_variable.rb +15 -59
- data/lib/solargraph/pin/method.rb +158 -104
- data/lib/solargraph/pin/method_alias.rb +8 -0
- data/lib/solargraph/pin/namespace.rb +19 -12
- data/lib/solargraph/pin/parameter.rb +102 -36
- data/lib/solargraph/pin/proxy_type.rb +4 -1
- data/lib/solargraph/pin/reference/override.rb +1 -1
- data/lib/solargraph/pin/reference/require.rb +14 -14
- data/lib/solargraph/pin/reference/superclass.rb +2 -0
- data/lib/solargraph/pin/reference/type_alias.rb +16 -0
- data/lib/solargraph/pin/reference.rb +20 -0
- data/lib/solargraph/pin/search.rb +8 -7
- data/lib/solargraph/pin/signature.rb +15 -12
- data/lib/solargraph/pin/singleton.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +2 -1
- data/lib/solargraph/pin/until.rb +2 -4
- data/lib/solargraph/pin/while.rb +2 -4
- data/lib/solargraph/pin.rb +2 -0
- data/lib/solargraph/pin_cache.rb +22 -19
- data/lib/solargraph/position.rb +17 -10
- data/lib/solargraph/range.rb +16 -15
- data/lib/solargraph/rbs_map/conversions.rb +367 -231
- data/lib/solargraph/rbs_map/core_fills.rb +18 -11
- data/lib/solargraph/rbs_map/core_map.rb +24 -17
- data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
- data/lib/solargraph/rbs_map.rb +76 -32
- data/lib/solargraph/server_methods.rb +1 -1
- data/lib/solargraph/shell.rb +258 -66
- data/lib/solargraph/source/chain/array.rb +3 -12
- data/lib/solargraph/source/chain/block_symbol.rb +13 -13
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +96 -56
- data/lib/solargraph/source/chain/class_variable.rb +1 -1
- data/lib/solargraph/source/chain/constant.rb +5 -1
- data/lib/solargraph/source/chain/global_variable.rb +1 -1
- data/lib/solargraph/source/chain/hash.rb +8 -5
- data/lib/solargraph/source/chain/head.rb +19 -19
- data/lib/solargraph/source/chain/if.rb +12 -10
- data/lib/solargraph/source/chain/instance_variable.rb +24 -1
- data/lib/solargraph/source/chain/link.rb +12 -22
- data/lib/solargraph/source/chain/literal.rb +22 -15
- data/lib/solargraph/source/chain/or.rb +10 -4
- data/lib/solargraph/source/chain/q_call.rb +2 -0
- data/lib/solargraph/source/chain/variable.rb +3 -1
- data/lib/solargraph/source/chain/z_super.rb +1 -3
- data/lib/solargraph/source/chain.rb +51 -38
- data/lib/solargraph/source/change.rb +12 -5
- data/lib/solargraph/source/cursor.rb +33 -18
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +56 -32
- data/lib/solargraph/source/updater.rb +5 -1
- data/lib/solargraph/source.rb +59 -35
- data/lib/solargraph/source_map/clip.rb +54 -30
- data/lib/solargraph/source_map/data.rb +4 -1
- data/lib/solargraph/source_map/mapper.rb +69 -42
- data/lib/solargraph/source_map.rb +21 -9
- data/lib/solargraph/type_checker/problem.rb +3 -1
- data/lib/solargraph/type_checker/rules.rb +81 -8
- data/lib/solargraph/type_checker.rb +196 -122
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +14 -11
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +1 -0
- data/lib/solargraph/workspace.rb +50 -28
- data/lib/solargraph/yard_map/cache.rb +25 -25
- data/lib/solargraph/yard_map/helpers.rb +8 -3
- data/lib/solargraph/yard_map/mapper/to_constant.rb +28 -28
- data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
- data/lib/solargraph/yard_map/mapper.rb +13 -8
- data/lib/solargraph/yard_map.rb +17 -18
- data/lib/solargraph/yard_tags.rb +2 -2
- data/lib/solargraph/yardoc.rb +7 -4
- data/lib/solargraph.rb +33 -10
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/shims/ast/0/node.rbs +1 -1
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/solargraph.gemspec +37 -35
- metadata +41 -42
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- data/lib/solargraph/yard_map/to_method.rb +0 -89
- data/rbs/fills/tuple/tuple.rbs +0 -149
|
@@ -35,27 +35,28 @@ module Solargraph
|
|
|
35
35
|
# @param node [Parser::AST::Node]
|
|
36
36
|
# @param region [Region]
|
|
37
37
|
# @param pins [Array<Pin::Base>]
|
|
38
|
-
# @param locals [Array<Pin::
|
|
39
|
-
# @
|
|
40
|
-
|
|
38
|
+
# @param locals [Array<Pin::LocalVariable>]
|
|
39
|
+
# @param ivars [Array<Pin::InstanceVariable>]
|
|
40
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>, Array<Pin::InstanceVariable>)]
|
|
41
|
+
def self.process node, region = Region.new, pins = [], locals = [], ivars = []
|
|
41
42
|
if pins.empty?
|
|
42
43
|
pins.push Pin::Namespace.new(
|
|
43
44
|
location: region.source.location,
|
|
44
45
|
name: '',
|
|
45
|
-
source: :parser
|
|
46
|
+
source: :parser
|
|
46
47
|
)
|
|
47
48
|
end
|
|
48
|
-
return [pins, locals] unless Parser.is_ast_node?(node)
|
|
49
|
+
return [pins, locals, ivars] unless Parser.is_ast_node?(node)
|
|
49
50
|
node_processor_classes = @@processors[node.type] || [NodeProcessor::Base]
|
|
50
51
|
|
|
51
52
|
node_processor_classes.each do |klass|
|
|
52
|
-
processor = klass.new(node, region, pins, locals)
|
|
53
|
+
processor = klass.new(node, region, pins, locals, ivars)
|
|
53
54
|
process_next = processor.process
|
|
54
55
|
|
|
55
56
|
break unless process_next
|
|
56
57
|
end
|
|
57
58
|
|
|
58
|
-
[pins, locals]
|
|
59
|
+
[pins, locals, ivars]
|
|
59
60
|
end
|
|
60
61
|
end
|
|
61
62
|
end
|
|
@@ -8,19 +8,23 @@ module Solargraph
|
|
|
8
8
|
module ClassMethods
|
|
9
9
|
# @param code [String]
|
|
10
10
|
# @param filename [String, nil]
|
|
11
|
+
# @param starting_line [Integer] must be provided so that we
|
|
12
|
+
# can find relevant local variables later even if this is just
|
|
13
|
+
# a subset of the file in question
|
|
11
14
|
# @return [Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})]
|
|
12
|
-
def parse_with_comments code, filename = nil
|
|
13
|
-
node = parse(code, filename)
|
|
15
|
+
def parse_with_comments code, filename = nil, starting_line = 0
|
|
16
|
+
node = parse(code, filename, starting_line)
|
|
14
17
|
comments = CommentRipper.new(code, filename, 0).parse
|
|
15
18
|
[node, comments]
|
|
16
19
|
end
|
|
17
20
|
|
|
18
21
|
# @param code [String]
|
|
19
22
|
# @param filename [String, nil]
|
|
20
|
-
# @param
|
|
23
|
+
# @param starting_line [Integer]
|
|
24
|
+
# @sg-ignore need to understand that raise does not return
|
|
21
25
|
# @return [Parser::AST::Node]
|
|
22
|
-
def parse code, filename = nil,
|
|
23
|
-
buffer = ::Parser::Source::Buffer.new(filename,
|
|
26
|
+
def parse code, filename = nil, starting_line = 0
|
|
27
|
+
buffer = ::Parser::Source::Buffer.new(filename, starting_line)
|
|
24
28
|
buffer.source = code
|
|
25
29
|
parser.parse(buffer)
|
|
26
30
|
rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
|
|
@@ -36,29 +40,35 @@ module Solargraph
|
|
|
36
40
|
end
|
|
37
41
|
|
|
38
42
|
# @param source [Source]
|
|
39
|
-
# @return [Array(Array<Pin::Base>, Array<Pin::
|
|
43
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>)]
|
|
40
44
|
def map source
|
|
41
|
-
|
|
45
|
+
# @sg-ignore Need to add nil check here
|
|
46
|
+
pins, locals, ivars = NodeProcessor.process(source.node, Region.new(source: source))
|
|
47
|
+
pins.concat(ivars)
|
|
48
|
+
[pins, locals]
|
|
42
49
|
end
|
|
43
50
|
|
|
44
51
|
# @param source [Source]
|
|
45
52
|
# @param name [String]
|
|
46
53
|
# @return [Array<Location>]
|
|
47
54
|
def references source, name
|
|
48
|
-
if name.end_with?(
|
|
55
|
+
if name.end_with?('=')
|
|
49
56
|
reg = /#{Regexp.escape name[0..-2]}\s*=/
|
|
50
57
|
# @param code [String]
|
|
51
58
|
# @param offset [Integer]
|
|
52
59
|
# @return [Array(Integer, Integer), Array(nil, nil)]
|
|
60
|
+
# @sg-ignore Need to add nil check here
|
|
53
61
|
extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
|
|
54
62
|
else
|
|
55
63
|
# @param code [String]
|
|
56
64
|
# @param offset [Integer]
|
|
57
65
|
# @return [Array(Integer, Integer), Array(nil, nil)]
|
|
66
|
+
# @sg-ignore Need to add nil check here
|
|
58
67
|
extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
|
|
59
68
|
end
|
|
60
69
|
inner_node_references(name, source.node).map do |n|
|
|
61
70
|
rng = Range.from_node(n)
|
|
71
|
+
# @sg-ignore Need to add nil check here
|
|
62
72
|
offset = Position.to_offset(source.code, rng.start)
|
|
63
73
|
soff, eoff = extract_offset[source.code, offset]
|
|
64
74
|
Location.new(
|
|
@@ -86,20 +96,20 @@ module Solargraph
|
|
|
86
96
|
|
|
87
97
|
# @return [Source::Chain]
|
|
88
98
|
def chain *args
|
|
89
|
-
NodeChainer.chain
|
|
99
|
+
NodeChainer.chain(*args)
|
|
90
100
|
end
|
|
91
101
|
|
|
92
102
|
# @return [Source::Chain]
|
|
93
103
|
def chain_string *args
|
|
94
|
-
NodeChainer.load_string
|
|
104
|
+
NodeChainer.load_string(*args)
|
|
95
105
|
end
|
|
96
106
|
|
|
97
107
|
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
|
|
98
108
|
def process_node *args
|
|
99
|
-
Solargraph::Parser::NodeProcessor.process
|
|
109
|
+
Solargraph::Parser::NodeProcessor.process(*args)
|
|
100
110
|
end
|
|
101
111
|
|
|
102
|
-
# @param node [Parser::AST::Node]
|
|
112
|
+
# @param node [Parser::AST::Node, nil]
|
|
103
113
|
# @return [String, nil]
|
|
104
114
|
def infer_literal_node_type node
|
|
105
115
|
NodeMethods.infer_literal_node_type node
|
|
@@ -110,7 +120,7 @@ module Solargraph
|
|
|
110
120
|
parser.version
|
|
111
121
|
end
|
|
112
122
|
|
|
113
|
-
# @param node [BasicObject]
|
|
123
|
+
# @param node [BasicObject, nil]
|
|
114
124
|
# @return [Boolean]
|
|
115
125
|
def is_ast_node? node
|
|
116
126
|
node.is_a?(::Parser::AST::Node)
|
|
@@ -124,19 +134,25 @@ module Solargraph
|
|
|
124
134
|
Range.new(st, en)
|
|
125
135
|
end
|
|
126
136
|
|
|
127
|
-
# @param node [Parser::AST::Node]
|
|
137
|
+
# @param node [Parser::AST::Node, nil]
|
|
128
138
|
# @return [Array<Range>]
|
|
129
139
|
def string_ranges node
|
|
130
140
|
return [] unless is_ast_node?(node)
|
|
131
141
|
result = []
|
|
142
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
132
143
|
result.push Range.from_node(node) if node.type == :str
|
|
144
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
133
145
|
node.children.each do |child|
|
|
134
146
|
result.concat string_ranges(child)
|
|
135
147
|
end
|
|
148
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
136
149
|
if node.type == :dstr && node.children.last.nil?
|
|
150
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
137
151
|
last = node.children[-2]
|
|
152
|
+
# @sg-ignore Need to add nil check here
|
|
138
153
|
unless last.nil?
|
|
139
154
|
rng = Range.from_node(last)
|
|
155
|
+
# @sg-ignore Need to add nil check here
|
|
140
156
|
pos = Position.new(rng.ending.line, rng.ending.column - 1)
|
|
141
157
|
result.push Range.new(pos, pos)
|
|
142
158
|
end
|
|
@@ -22,7 +22,7 @@ module Solargraph
|
|
|
22
22
|
# @return [Source::Chain]
|
|
23
23
|
def chain
|
|
24
24
|
links = generate_links(@node)
|
|
25
|
-
Chain.new(links, @node,
|
|
25
|
+
Chain.new(links, @node, Parser.is_ast_node?(@node) && @node.type == :splat)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
class << self
|
|
@@ -35,9 +35,12 @@ module Solargraph
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# @param code [String]
|
|
38
|
+
# @param filename [String]
|
|
39
|
+
# @param starting_line [Integer]
|
|
40
|
+
#
|
|
38
41
|
# @return [Source::Chain]
|
|
39
|
-
def load_string
|
|
40
|
-
node = Parser.parse(code.sub(/\.$/, ''))
|
|
42
|
+
def load_string code, filename, starting_line
|
|
43
|
+
node = Parser.parse(code.sub(/\.$/, ''), filename, starting_line)
|
|
41
44
|
chain = NodeChainer.new(node).chain
|
|
42
45
|
chain.links.push(Chain::Link.new) if code.end_with?('.')
|
|
43
46
|
chain
|
|
@@ -60,9 +63,9 @@ module Solargraph
|
|
|
60
63
|
result.concat generate_links(n.children[0])
|
|
61
64
|
result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
|
|
62
65
|
elsif n.children[0].nil?
|
|
63
|
-
|
|
64
|
-
n.children[2
|
|
65
|
-
|
|
66
|
+
# @sg-ignore Need to add nil check here
|
|
67
|
+
n.children[2..].map do |c|
|
|
68
|
+
NodeChainer.chain(c, @filename, n)
|
|
66
69
|
end
|
|
67
70
|
result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
|
|
68
71
|
else
|
|
@@ -90,27 +93,46 @@ module Solargraph
|
|
|
90
93
|
elsif n.type == :const
|
|
91
94
|
const = unpack_name(n)
|
|
92
95
|
result.push Chain::Constant.new(const)
|
|
93
|
-
elsif [
|
|
96
|
+
elsif %i[lvar lvasgn].include?(n.type)
|
|
94
97
|
result.push Chain::Call.new(n.children[0].to_s, Location.from_node(n))
|
|
95
|
-
elsif [
|
|
96
|
-
result.push Chain::InstanceVariable.new(n.children[0].to_s)
|
|
97
|
-
elsif [
|
|
98
|
+
elsif %i[ivar ivasgn].include?(n.type)
|
|
99
|
+
result.push Chain::InstanceVariable.new(n.children[0].to_s, n, Location.from_node(n))
|
|
100
|
+
elsif %i[cvar cvasgn].include?(n.type)
|
|
98
101
|
result.push Chain::ClassVariable.new(n.children[0].to_s)
|
|
99
|
-
elsif [
|
|
102
|
+
elsif %i[gvar gvasgn].include?(n.type)
|
|
100
103
|
result.push Chain::GlobalVariable.new(n.children[0].to_s)
|
|
101
104
|
elsif n.type == :or_asgn
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
+
# @bar ||= 123 translates to:
|
|
106
|
+
#
|
|
107
|
+
# s(:or_asgn,
|
|
108
|
+
# s(:ivasgn, :@bar),
|
|
109
|
+
# s(:int, 123))
|
|
110
|
+
lhs_chain = NodeChainer.chain n.children[0] # s(:ivasgn, :@bar)
|
|
111
|
+
rhs_chain = NodeChainer.chain n.children[1] # s(:int, 123)
|
|
112
|
+
or_link = Chain::Or.new([lhs_chain, rhs_chain])
|
|
113
|
+
# this is just for a call chain, so we don't need to record the assignment
|
|
114
|
+
result.push(or_link)
|
|
115
|
+
elsif %i[class module def defs].include?(n.type)
|
|
105
116
|
# @todo Undefined or what?
|
|
106
117
|
result.push Chain::UNDEFINED_CALL
|
|
107
118
|
elsif n.type == :and
|
|
108
119
|
result.concat generate_links(n.children.last)
|
|
109
120
|
elsif n.type == :or
|
|
110
|
-
result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename),
|
|
121
|
+
result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename),
|
|
122
|
+
NodeChainer.chain(n.children[1], @filename, n)])
|
|
111
123
|
elsif n.type == :if
|
|
112
|
-
|
|
113
|
-
|
|
124
|
+
then_clause = if n.children[1]
|
|
125
|
+
NodeChainer.chain(n.children[1], @filename, n)
|
|
126
|
+
else
|
|
127
|
+
Source::Chain.new([Source::Chain::Literal.new('nil', nil)], n)
|
|
128
|
+
end
|
|
129
|
+
else_clause = if n.children[2]
|
|
130
|
+
NodeChainer.chain(n.children[2], @filename, n)
|
|
131
|
+
else
|
|
132
|
+
Source::Chain.new([Source::Chain::Literal.new('nil', nil)], n)
|
|
133
|
+
end
|
|
134
|
+
result.push Chain::If.new([then_clause, else_clause])
|
|
135
|
+
elsif %i[begin kwbegin].include?(n.type)
|
|
114
136
|
result.concat generate_links(n.children.last)
|
|
115
137
|
elsif n.type == :block_pass
|
|
116
138
|
block_variable_name_node = n.children[0]
|
|
@@ -118,12 +140,10 @@ module Solargraph
|
|
|
118
140
|
# anonymous block forwarding (e.g., "&")
|
|
119
141
|
# added in Ruby 3.1 - https://bugs.ruby-lang.org/issues/11256
|
|
120
142
|
result.push Chain::BlockVariable.new(nil)
|
|
143
|
+
elsif block_variable_name_node.type == :sym
|
|
144
|
+
result.push Chain::BlockSymbol.new(block_variable_name_node.children[0].to_s)
|
|
121
145
|
else
|
|
122
|
-
|
|
123
|
-
result.push Chain::BlockSymbol.new("#{block_variable_name_node.children[0].to_s}")
|
|
124
|
-
else
|
|
125
|
-
result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0].to_s}")
|
|
126
|
-
end
|
|
146
|
+
result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0]}")
|
|
127
147
|
end
|
|
128
148
|
elsif n.type == :hash
|
|
129
149
|
result.push Chain::Hash.new('::Hash', n, hash_is_splatted?(n))
|
|
@@ -132,7 +152,8 @@ module Solargraph
|
|
|
132
152
|
result.push Source::Chain::Array.new(chained_children, n)
|
|
133
153
|
else
|
|
134
154
|
lit = infer_literal_node_type(n)
|
|
135
|
-
result.push
|
|
155
|
+
result.push(lit ? Chain::Literal.new(lit, n) : Chain::Link.new)
|
|
156
|
+
# result.push Chain::Link.new
|
|
136
157
|
end
|
|
137
158
|
result
|
|
138
159
|
end
|
|
@@ -141,7 +162,9 @@ module Solargraph
|
|
|
141
162
|
def hash_is_splatted? node
|
|
142
163
|
return false unless Parser.is_ast_node?(node) && node.type == :hash
|
|
143
164
|
return false unless Parser.is_ast_node?(node.children.last) && node.children.last.type == :kwsplat
|
|
144
|
-
|
|
165
|
+
if Parser.is_ast_node?(node.children.last.children[0]) && node.children.last.children[0].type == :hash
|
|
166
|
+
return false
|
|
167
|
+
end
|
|
145
168
|
true
|
|
146
169
|
end
|
|
147
170
|
|
|
@@ -150,13 +173,16 @@ module Solargraph
|
|
|
150
173
|
def passed_block node
|
|
151
174
|
return unless node == @node && @parent&.type == :block
|
|
152
175
|
|
|
176
|
+
# @sg-ignore Need to add nil check here
|
|
153
177
|
NodeChainer.chain(@parent.children[2], @filename)
|
|
154
178
|
end
|
|
155
179
|
|
|
156
180
|
# @param node [Parser::AST::Node]
|
|
181
|
+
# @sg-ignore Need to add nil check here
|
|
157
182
|
# @return [Array<Source::Chain>]
|
|
158
183
|
def node_args node
|
|
159
|
-
|
|
184
|
+
# @sg-ignore Need to add nil check here
|
|
185
|
+
node.children[2..].map do |child|
|
|
160
186
|
NodeChainer.chain(child, @filename, node)
|
|
161
187
|
end
|
|
162
188
|
end
|