solargraph 0.58.1 → 0.59.0.dev.1
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 +4 -5
- data/.github/workflows/plugins.yml +40 -36
- data/.github/workflows/rspec.yml +45 -13
- data/.github/workflows/typecheck.yml +2 -2
- data/.rubocop_todo.yml +27 -49
- data/README.md +3 -3
- data/Rakefile +1 -0
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +289 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +109 -97
- data/lib/solargraph/api_map/store.rb +387 -384
- data/lib/solargraph/api_map.rb +1000 -945
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +242 -228
- data/lib/solargraph/complex_type/unique_type.rb +632 -482
- data/lib/solargraph/complex_type.rb +549 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
- data/lib/solargraph/convention/data_definition.rb +108 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
- data/lib/solargraph/convention/struct_definition.rb +168 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
- data/lib/solargraph/diagnostics/rubocop.rb +119 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
- data/lib/solargraph/diagnostics/type_check.rb +56 -55
- data/lib/solargraph/doc_map.rb +200 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +97 -98
- data/lib/solargraph/language_server/host/dispatch.rb +131 -130
- data/lib/solargraph/language_server/host/message_worker.rb +113 -112
- data/lib/solargraph/language_server/host/sources.rb +100 -99
- data/lib/solargraph/language_server/host.rb +883 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
- data/lib/solargraph/library.rb +729 -683
- data/lib/solargraph/location.rb +87 -82
- data/lib/solargraph/logging.rb +57 -37
- data/lib/solargraph/parser/comment_ripper.rb +76 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
- data/lib/solargraph/parser/node_processor/base.rb +122 -92
- data/lib/solargraph/parser/node_processor.rb +63 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +761 -729
- data/lib/solargraph/pin/base_variable.rb +418 -126
- data/lib/solargraph/pin/block.rb +126 -104
- data/lib/solargraph/pin/breakable.rb +13 -9
- data/lib/solargraph/pin/callable.rb +278 -231
- data/lib/solargraph/pin/closure.rb +68 -72
- data/lib/solargraph/pin/common.rb +94 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/conversions.rb +124 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +115 -114
- data/lib/solargraph/pin/instance_variable.rb +38 -34
- data/lib/solargraph/pin/keyword.rb +16 -20
- data/lib/solargraph/pin/local_variable.rb +31 -75
- data/lib/solargraph/pin/method.rb +720 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +121 -115
- data/lib/solargraph/pin/parameter.rb +338 -275
- data/lib/solargraph/pin/proxy_type.rb +40 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference.rb +41 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +69 -61
- data/lib/solargraph/pin/symbol.rb +53 -53
- data/lib/solargraph/pin/until.rb +18 -18
- data/lib/solargraph/pin/while.rb +18 -18
- data/lib/solargraph/pin.rb +46 -44
- data/lib/solargraph/pin_cache.rb +665 -245
- data/lib/solargraph/position.rb +118 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +846 -823
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
- data/lib/solargraph/rbs_map.rb +217 -163
- data/lib/solargraph/shell.rb +397 -352
- data/lib/solargraph/source/chain/call.rb +372 -337
- data/lib/solargraph/source/chain/constant.rb +28 -26
- data/lib/solargraph/source/chain/hash.rb +35 -34
- data/lib/solargraph/source/chain/if.rb +29 -28
- data/lib/solargraph/source/chain/instance_variable.rb +34 -13
- data/lib/solargraph/source/chain/literal.rb +53 -48
- data/lib/solargraph/source/chain/or.rb +31 -23
- data/lib/solargraph/source/chain.rb +294 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/source_chainer.rb +204 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +524 -498
- data/lib/solargraph/source_map/clip.rb +237 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +282 -259
- data/lib/solargraph/source_map.rb +220 -212
- data/lib/solargraph/type_checker/problem.rb +34 -32
- data/lib/solargraph/type_checker/rules.rb +157 -84
- data/lib/solargraph/type_checker.rb +895 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +257 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +362 -220
- data/lib/solargraph/yard_map/helpers.rb +45 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yardoc.rb +97 -87
- data/lib/solargraph.rb +126 -105
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/rbs_collection.yaml +1 -1
- data/solargraph.gemspec +2 -1
- metadata +22 -17
- 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/sig/shims/ast/0/node.rbs +0 -5
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
|
@@ -1,59 +1,61 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Parser
|
|
5
|
-
module ParserGem
|
|
6
|
-
module NodeProcessors
|
|
7
|
-
class MasgnNode < Parser::NodeProcessor::Base
|
|
8
|
-
include ParserGem::NodeMethods
|
|
9
|
-
|
|
10
|
-
# @return [void]
|
|
11
|
-
def process
|
|
12
|
-
# Example:
|
|
13
|
-
#
|
|
14
|
-
# s(:masgn,
|
|
15
|
-
# s(:mlhs,
|
|
16
|
-
# s(:send,
|
|
17
|
-
# s(:send, nil, :a), :b=),
|
|
18
|
-
# s(:lvasgn, :b),
|
|
19
|
-
# s(:ivasgn, :@c)),
|
|
20
|
-
# s(:array,
|
|
21
|
-
# s(:int, 1),
|
|
22
|
-
# s(:int, 2),
|
|
23
|
-
# s(:int, 3)))
|
|
24
|
-
masgn = node
|
|
25
|
-
# @type [Parser::AST::Node]
|
|
26
|
-
mlhs = masgn.children.fetch(0)
|
|
27
|
-
# @type [Array<Parser::AST::Node>]
|
|
28
|
-
lhs_arr = mlhs.children
|
|
29
|
-
# @type [Parser::AST::Node]
|
|
30
|
-
mass_rhs = node.children.fetch(1)
|
|
31
|
-
|
|
32
|
-
# Get pins created for the mlhs node
|
|
33
|
-
process_children
|
|
34
|
-
|
|
35
|
-
lhs_arr.each_with_index do |lhs, i|
|
|
36
|
-
location = get_node_location(lhs)
|
|
37
|
-
pin = if lhs.type == :lvasgn
|
|
38
|
-
# lvasgn is a local variable
|
|
39
|
-
locals.find { |l| l.location == location }
|
|
40
|
-
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
module ParserGem
|
|
6
|
+
module NodeProcessors
|
|
7
|
+
class MasgnNode < Parser::NodeProcessor::Base
|
|
8
|
+
include ParserGem::NodeMethods
|
|
9
|
+
|
|
10
|
+
# @return [void]
|
|
11
|
+
def process
|
|
12
|
+
# Example:
|
|
13
|
+
#
|
|
14
|
+
# s(:masgn,
|
|
15
|
+
# s(:mlhs,
|
|
16
|
+
# s(:send,
|
|
17
|
+
# s(:send, nil, :a), :b=),
|
|
18
|
+
# s(:lvasgn, :b),
|
|
19
|
+
# s(:ivasgn, :@c)),
|
|
20
|
+
# s(:array,
|
|
21
|
+
# s(:int, 1),
|
|
22
|
+
# s(:int, 2),
|
|
23
|
+
# s(:int, 3)))
|
|
24
|
+
masgn = node
|
|
25
|
+
# @type [Parser::AST::Node]
|
|
26
|
+
mlhs = masgn.children.fetch(0)
|
|
27
|
+
# @type [Array<Parser::AST::Node>]
|
|
28
|
+
lhs_arr = mlhs.children
|
|
29
|
+
# @type [Parser::AST::Node]
|
|
30
|
+
mass_rhs = node.children.fetch(1)
|
|
31
|
+
|
|
32
|
+
# Get pins created for the mlhs node
|
|
33
|
+
process_children
|
|
34
|
+
|
|
35
|
+
lhs_arr.each_with_index do |lhs, i|
|
|
36
|
+
location = get_node_location(lhs)
|
|
37
|
+
pin = if lhs.type == :lvasgn
|
|
38
|
+
# lvasgn is a local variable
|
|
39
|
+
locals.find { |l| l.location == location }
|
|
40
|
+
elsif lhs.type == :ivasgn
|
|
41
|
+
# ivasgn is an instance variable assignment
|
|
42
|
+
ivars.find { |iv| iv.location == location }
|
|
43
|
+
else
|
|
44
|
+
pins.find { |iv| iv.location == location && iv.is_a?(Pin::BaseVariable) }
|
|
45
|
+
end
|
|
46
|
+
# @todo in line below, nothing in typechecking alerts
|
|
47
|
+
# when a non-existant method is called on 'l'
|
|
48
|
+
if pin.nil?
|
|
49
|
+
Solargraph.logger.debug do
|
|
50
|
+
"Could not find local for masgn= value in location #{location.inspect} in #{lhs_arr} - masgn = #{masgn}, lhs.type = #{lhs.type}"
|
|
51
|
+
end
|
|
52
|
+
next
|
|
53
|
+
end
|
|
54
|
+
pin.mass_assignment = [mass_rhs, i]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'parser'
|
|
4
|
-
|
|
5
|
-
module Solargraph
|
|
6
|
-
module Parser
|
|
7
|
-
module ParserGem
|
|
8
|
-
module NodeProcessors
|
|
9
|
-
class OpasgnNode < Parser::NodeProcessor::Base
|
|
10
|
-
# @return [void]
|
|
11
|
-
def process
|
|
12
|
-
target = node.children[0]
|
|
13
|
-
operator = node.children[1]
|
|
14
|
-
argument = node.children[2]
|
|
15
|
-
if target.type == :send
|
|
16
|
-
# @sg-ignore Need a downcast here
|
|
17
|
-
process_send_target(target, operator, argument)
|
|
18
|
-
elsif target.type.to_s.end_with?('vasgn')
|
|
19
|
-
# @sg-ignore Need a downcast here
|
|
20
|
-
process_vasgn_target(target, operator, argument)
|
|
21
|
-
else
|
|
22
|
-
Solargraph.assert_or_log(:opasgn_unknown_target,
|
|
23
|
-
"Unexpected op_asgn target type: #{target.type}")
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# @param call [Parser::AST::Node] the target of the assignment
|
|
28
|
-
# @param operator [Symbol] the operator, e.g. :+
|
|
29
|
-
# @param argument [Parser::AST::Node] the argument of the operation
|
|
30
|
-
#
|
|
31
|
-
# @return [void]
|
|
32
|
-
def process_send_target call, operator, argument
|
|
33
|
-
# if target is a call:
|
|
34
|
-
# [10] pry(main)> Parser::CurrentRuby.parse("Foo.bar += baz")
|
|
35
|
-
# => s(:op_asgn,
|
|
36
|
-
# s(:send, # call
|
|
37
|
-
# s(:const, nil, :Foo), # calee
|
|
38
|
-
# :bar), # call_method
|
|
39
|
-
# :+, # operator
|
|
40
|
-
# s(:send, nil, :baz)) # argument
|
|
41
|
-
# [11] pry(main)>
|
|
42
|
-
callee = call.children[0]
|
|
43
|
-
call_method = call.children[1]
|
|
44
|
-
asgn_method = :"#{call_method}="
|
|
45
|
-
|
|
46
|
-
# [8] pry(main)> Parser::CurrentRuby.parse("Foo.bar = Foo.bar + baz")
|
|
47
|
-
# => s(:send,
|
|
48
|
-
# s(:const, nil, :Foo), # callee
|
|
49
|
-
# :bar=, # asgn_method
|
|
50
|
-
# s(:send,
|
|
51
|
-
# s(:send,
|
|
52
|
-
# s(:const, nil, :Foo), # callee
|
|
53
|
-
# :bar), # call_method
|
|
54
|
-
# :+, # operator
|
|
55
|
-
# s(:send, nil, :baz))) # argument
|
|
56
|
-
new_send = node.updated(:send,
|
|
57
|
-
[callee,
|
|
58
|
-
asgn_method,
|
|
59
|
-
node.updated(:send, [call, operator, argument])])
|
|
60
|
-
NodeProcessor.process(new_send, region, pins, locals)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# @param asgn [Parser::AST::Node] the target of the assignment
|
|
64
|
-
# @param operator [Symbol] the operator, e.g. :+
|
|
65
|
-
# @param argument [Parser::AST::Node] the argument of the operation
|
|
66
|
-
#
|
|
67
|
-
# @return [void]
|
|
68
|
-
def process_vasgn_target asgn, operator, argument
|
|
69
|
-
# => s(:op_asgn,
|
|
70
|
-
# s(:lvasgn, :a), # asgn
|
|
71
|
-
# :+, # operator
|
|
72
|
-
# s(:int, 2)) # argument
|
|
73
|
-
|
|
74
|
-
# @type [Parser::AST::Node]
|
|
75
|
-
variable_name = asgn.children[0]
|
|
76
|
-
# for lvasgn, gvasgn, cvasgn, convert to lvar, gvar, cvar
|
|
77
|
-
# [6] pry(main)> Parser::CurrentRuby.parse("a = a + 1")
|
|
78
|
-
# => s(:lvasgn, :a,
|
|
79
|
-
# s(:send,
|
|
80
|
-
# s(:lvar, :a), :+,
|
|
81
|
-
# s(:int, 1)))
|
|
82
|
-
# [7] pry(main)>
|
|
83
|
-
variable_reference_type = asgn.type.to_s.sub(/vasgn$/, 'var').to_sym
|
|
84
|
-
target_reference = node.updated(variable_reference_type, asgn.children)
|
|
85
|
-
send_children = [
|
|
86
|
-
target_reference,
|
|
87
|
-
operator,
|
|
88
|
-
argument
|
|
89
|
-
]
|
|
90
|
-
send_node = node.updated(:send, send_children)
|
|
91
|
-
new_asgn = node.updated(asgn.type, [variable_name, send_node])
|
|
92
|
-
NodeProcessor.process(new_asgn, region, pins, locals)
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'parser'
|
|
4
|
+
|
|
5
|
+
module Solargraph
|
|
6
|
+
module Parser
|
|
7
|
+
module ParserGem
|
|
8
|
+
module NodeProcessors
|
|
9
|
+
class OpasgnNode < Parser::NodeProcessor::Base
|
|
10
|
+
# @return [void]
|
|
11
|
+
def process
|
|
12
|
+
target = node.children[0]
|
|
13
|
+
operator = node.children[1]
|
|
14
|
+
argument = node.children[2]
|
|
15
|
+
if target.type == :send
|
|
16
|
+
# @sg-ignore Need a downcast here
|
|
17
|
+
process_send_target(target, operator, argument)
|
|
18
|
+
elsif target.type.to_s.end_with?('vasgn')
|
|
19
|
+
# @sg-ignore Need a downcast here
|
|
20
|
+
process_vasgn_target(target, operator, argument)
|
|
21
|
+
else
|
|
22
|
+
Solargraph.assert_or_log(:opasgn_unknown_target,
|
|
23
|
+
"Unexpected op_asgn target type: #{target.type}")
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @param call [Parser::AST::Node] the target of the assignment
|
|
28
|
+
# @param operator [Symbol] the operator, e.g. :+
|
|
29
|
+
# @param argument [Parser::AST::Node] the argument of the operation
|
|
30
|
+
#
|
|
31
|
+
# @return [void]
|
|
32
|
+
def process_send_target call, operator, argument
|
|
33
|
+
# if target is a call:
|
|
34
|
+
# [10] pry(main)> Parser::CurrentRuby.parse("Foo.bar += baz")
|
|
35
|
+
# => s(:op_asgn,
|
|
36
|
+
# s(:send, # call
|
|
37
|
+
# s(:const, nil, :Foo), # calee
|
|
38
|
+
# :bar), # call_method
|
|
39
|
+
# :+, # operator
|
|
40
|
+
# s(:send, nil, :baz)) # argument
|
|
41
|
+
# [11] pry(main)>
|
|
42
|
+
callee = call.children[0]
|
|
43
|
+
call_method = call.children[1]
|
|
44
|
+
asgn_method = :"#{call_method}="
|
|
45
|
+
|
|
46
|
+
# [8] pry(main)> Parser::CurrentRuby.parse("Foo.bar = Foo.bar + baz")
|
|
47
|
+
# => s(:send,
|
|
48
|
+
# s(:const, nil, :Foo), # callee
|
|
49
|
+
# :bar=, # asgn_method
|
|
50
|
+
# s(:send,
|
|
51
|
+
# s(:send,
|
|
52
|
+
# s(:const, nil, :Foo), # callee
|
|
53
|
+
# :bar), # call_method
|
|
54
|
+
# :+, # operator
|
|
55
|
+
# s(:send, nil, :baz))) # argument
|
|
56
|
+
new_send = node.updated(:send,
|
|
57
|
+
[callee,
|
|
58
|
+
asgn_method,
|
|
59
|
+
node.updated(:send, [call, operator, argument])])
|
|
60
|
+
NodeProcessor.process(new_send, region, pins, locals, ivars)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @param asgn [Parser::AST::Node] the target of the assignment
|
|
64
|
+
# @param operator [Symbol] the operator, e.g. :+
|
|
65
|
+
# @param argument [Parser::AST::Node] the argument of the operation
|
|
66
|
+
#
|
|
67
|
+
# @return [void]
|
|
68
|
+
def process_vasgn_target asgn, operator, argument
|
|
69
|
+
# => s(:op_asgn,
|
|
70
|
+
# s(:lvasgn, :a), # asgn
|
|
71
|
+
# :+, # operator
|
|
72
|
+
# s(:int, 2)) # argument
|
|
73
|
+
|
|
74
|
+
# @type [Parser::AST::Node]
|
|
75
|
+
variable_name = asgn.children[0]
|
|
76
|
+
# for lvasgn, gvasgn, cvasgn, convert to lvar, gvar, cvar
|
|
77
|
+
# [6] pry(main)> Parser::CurrentRuby.parse("a = a + 1")
|
|
78
|
+
# => s(:lvasgn, :a,
|
|
79
|
+
# s(:send,
|
|
80
|
+
# s(:lvar, :a), :+,
|
|
81
|
+
# s(:int, 1)))
|
|
82
|
+
# [7] pry(main)>
|
|
83
|
+
variable_reference_type = asgn.type.to_s.sub(/vasgn$/, 'var').to_sym
|
|
84
|
+
target_reference = node.updated(variable_reference_type, asgn.children)
|
|
85
|
+
send_children = [
|
|
86
|
+
target_reference,
|
|
87
|
+
operator,
|
|
88
|
+
argument
|
|
89
|
+
]
|
|
90
|
+
send_node = node.updated(:send, send_children)
|
|
91
|
+
new_asgn = node.updated(asgn.type, [variable_name, send_node])
|
|
92
|
+
NodeProcessor.process(new_asgn, region, pins, locals, ivars)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
module ParserGem
|
|
6
|
+
module NodeProcessors
|
|
7
|
+
class OrNode < Parser::NodeProcessor::Base
|
|
8
|
+
include ParserGem::NodeMethods
|
|
9
|
+
|
|
10
|
+
def process
|
|
11
|
+
process_children
|
|
12
|
+
|
|
13
|
+
FlowSensitiveTyping.new(locals,
|
|
14
|
+
ivars,
|
|
15
|
+
enclosing_breakable_pin,
|
|
16
|
+
enclosing_compound_statement_pin).process_or(node)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Parser
|
|
5
|
-
module ParserGem
|
|
6
|
-
module NodeProcessors
|
|
7
|
-
class OrasgnNode < Parser::NodeProcessor::Base
|
|
8
|
-
# @return [void]
|
|
9
|
-
def process
|
|
10
|
-
new_node = node.updated(node.children[0].type, node.children[0].children + [node.children[1]])
|
|
11
|
-
NodeProcessor.process(new_node, region, pins, locals)
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
module ParserGem
|
|
6
|
+
module NodeProcessors
|
|
7
|
+
class OrasgnNode < Parser::NodeProcessor::Base
|
|
8
|
+
# @return [void]
|
|
9
|
+
def process
|
|
10
|
+
new_node = node.updated(node.children[0].type, node.children[0].children + [node.children[1]])
|
|
11
|
+
NodeProcessor.process(new_node, region, pins, locals, ivars)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -1,38 +1,39 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Parser
|
|
5
|
-
module ParserGem
|
|
6
|
-
module NodeProcessors
|
|
7
|
-
class ResbodyNode < Parser::NodeProcessor::Base
|
|
8
|
-
include ParserGem::NodeMethods
|
|
9
|
-
|
|
10
|
-
# @return [void]
|
|
11
|
-
def process
|
|
12
|
-
if node.children[1] # Exception local variable name
|
|
13
|
-
here = get_node_start_position(node.children[1])
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
module ParserGem
|
|
6
|
+
module NodeProcessors
|
|
7
|
+
class ResbodyNode < Parser::NodeProcessor::Base
|
|
8
|
+
include ParserGem::NodeMethods
|
|
9
|
+
|
|
10
|
+
# @return [void]
|
|
11
|
+
def process
|
|
12
|
+
if node.children[1] # Exception local variable name
|
|
13
|
+
here = get_node_start_position(node.children[1])
|
|
14
|
+
# @sg-ignore Need to add nil check here
|
|
15
|
+
presence = Range.new(here, region.closure.location.range.ending)
|
|
16
|
+
loc = get_node_location(node.children[1])
|
|
17
|
+
types = if node.children[0].nil?
|
|
18
|
+
['Exception']
|
|
19
|
+
else
|
|
20
|
+
node.children[0].children.map do |child|
|
|
21
|
+
unpack_name(child)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
locals.push Solargraph::Pin::LocalVariable.new(
|
|
25
|
+
location: loc,
|
|
26
|
+
closure: region.closure,
|
|
27
|
+
name: node.children[1].children[0].to_s,
|
|
28
|
+
comments: "@type [#{types.join(',')}]",
|
|
29
|
+
presence: presence,
|
|
30
|
+
source: :parser
|
|
31
|
+
)
|
|
32
|
+
end
|
|
33
|
+
NodeProcessor.process(node.children[2], region, pins, locals, ivars)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -1,52 +1,53 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Parser
|
|
5
|
-
module ParserGem
|
|
6
|
-
module NodeProcessors
|
|
7
|
-
class SclassNode < Parser::NodeProcessor::Base
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
module ParserGem
|
|
6
|
+
module NodeProcessors
|
|
7
|
+
class SclassNode < Parser::NodeProcessor::Base
|
|
8
|
+
# @sg-ignore @override is adding, not overriding
|
|
9
|
+
def process
|
|
10
|
+
sclass = node.children[0]
|
|
11
|
+
# @todo Changing Parser::AST::Node to AST::Node below will
|
|
12
|
+
# cause type errors at strong level because the combined
|
|
13
|
+
# pin for AST::Node#children has return type
|
|
14
|
+
# "Array<AST::Node>, Array". YARD annotations in AST
|
|
15
|
+
# provided the Array, RBS for Array<AST::Node>. We
|
|
16
|
+
# should probably have a rule to combine "A, A<T>""
|
|
17
|
+
# types to "A<T>" if the "A" comes from YARD, with the
|
|
18
|
+
# rationale that folks tend to be less formal with types in
|
|
19
|
+
# YARD.
|
|
20
|
+
if sclass.is_a?(::Parser::AST::Node) && sclass.type == :self
|
|
21
|
+
closure = region.closure
|
|
22
|
+
elsif sclass.is_a?(::Parser::AST::Node) && sclass.type == :casgn
|
|
23
|
+
names = [region.closure.namespace, region.closure.name]
|
|
24
|
+
if sclass.children[0].nil? && names.last != sclass.children[1].to_s
|
|
25
|
+
names << sclass.children[1].to_s
|
|
26
|
+
else
|
|
27
|
+
names.concat [NodeMethods.unpack_name(sclass.children[0]), sclass.children[1].to_s]
|
|
28
|
+
end
|
|
29
|
+
name = names.reject(&:empty?).join('::')
|
|
30
|
+
closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
|
|
31
|
+
elsif sclass.is_a?(::Parser::AST::Node) && sclass.type == :const
|
|
32
|
+
names = [region.closure.namespace, region.closure.name]
|
|
33
|
+
also = NodeMethods.unpack_name(sclass)
|
|
34
|
+
if also != region.closure.name
|
|
35
|
+
names << also
|
|
36
|
+
end
|
|
37
|
+
name = names.reject(&:empty?).join('::')
|
|
38
|
+
closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
|
|
39
|
+
else
|
|
40
|
+
return
|
|
41
|
+
end
|
|
42
|
+
pins.push Solargraph::Pin::Singleton.new(
|
|
43
|
+
location: get_node_location(node),
|
|
44
|
+
closure: closure,
|
|
45
|
+
source: :parser,
|
|
46
|
+
)
|
|
47
|
+
process_children region.update(visibility: :public, scope: :class, closure: pins.last)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|