solargraph 0.56.0 → 0.58.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.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +183 -7
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.gitignore +6 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +92 -1
  14. data/README.md +8 -4
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -175
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -266
  22. data/lib/solargraph/api_map.rb +945 -973
  23. data/lib/solargraph/bench.rb +1 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -222
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -475
  26. data/lib/solargraph/complex_type.rb +444 -423
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +17 -0
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemspec.rb +3 -2
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -60
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -100
  35. data/lib/solargraph/convention/struct_definition.rb +164 -101
  36. data/lib/solargraph/convention.rb +32 -2
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  38. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  41. data/lib/solargraph/doc_map.rb +439 -405
  42. data/lib/solargraph/environ.rb +9 -2
  43. data/lib/solargraph/equality.rb +34 -33
  44. data/lib/solargraph/gem_pins.rb +98 -88
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  47. data/lib/solargraph/language_server/host/message_worker.rb +112 -109
  48. data/lib/solargraph/language_server/host/sources.rb +99 -99
  49. data/lib/solargraph/language_server/host.rb +878 -871
  50. data/lib/solargraph/language_server/message/base.rb +2 -1
  51. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  52. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  53. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  54. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  55. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  56. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  57. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  58. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  59. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  60. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  61. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  62. data/lib/solargraph/language_server/progress.rb +8 -0
  63. data/lib/solargraph/language_server/request.rb +4 -1
  64. data/lib/solargraph/library.rb +683 -666
  65. data/lib/solargraph/location.rb +82 -79
  66. data/lib/solargraph/logging.rb +37 -28
  67. data/lib/solargraph/page.rb +3 -0
  68. data/lib/solargraph/parser/comment_ripper.rb +69 -62
  69. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -227
  70. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  71. data/lib/solargraph/parser/node_processor.rb +62 -46
  72. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
  73. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  74. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  75. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -497
  76. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
  77. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  78. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  79. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -45
  80. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +1 -21
  81. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  82. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -21
  83. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  84. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  85. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  86. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +0 -22
  87. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -41
  88. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  89. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -37
  90. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
  91. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -271
  92. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +1 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  94. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -66
  95. data/lib/solargraph/parser/region.rb +69 -66
  96. data/lib/solargraph/parser/snippet.rb +17 -15
  97. data/lib/solargraph/pin/base.rb +729 -651
  98. data/lib/solargraph/pin/base_variable.rb +126 -125
  99. data/lib/solargraph/pin/block.rb +104 -103
  100. data/lib/solargraph/pin/breakable.rb +9 -9
  101. data/lib/solargraph/pin/callable.rb +231 -218
  102. data/lib/solargraph/pin/closure.rb +72 -74
  103. data/lib/solargraph/pin/common.rb +79 -75
  104. data/lib/solargraph/pin/constant.rb +2 -0
  105. data/lib/solargraph/pin/conversions.rb +123 -123
  106. data/lib/solargraph/pin/delegated_method.rb +120 -120
  107. data/lib/solargraph/pin/documenting.rb +114 -114
  108. data/lib/solargraph/pin/instance_variable.rb +34 -34
  109. data/lib/solargraph/pin/keyword.rb +20 -20
  110. data/lib/solargraph/pin/local_variable.rb +75 -76
  111. data/lib/solargraph/pin/method.rb +672 -651
  112. data/lib/solargraph/pin/method_alias.rb +34 -31
  113. data/lib/solargraph/pin/namespace.rb +115 -115
  114. data/lib/solargraph/pin/parameter.rb +275 -261
  115. data/lib/solargraph/pin/proxy_type.rb +39 -35
  116. data/lib/solargraph/pin/reference/override.rb +47 -33
  117. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  118. data/lib/solargraph/pin/reference.rb +39 -22
  119. data/lib/solargraph/pin/search.rb +61 -56
  120. data/lib/solargraph/pin/signature.rb +61 -59
  121. data/lib/solargraph/pin/symbol.rb +53 -48
  122. data/lib/solargraph/pin/until.rb +18 -18
  123. data/lib/solargraph/pin/while.rb +18 -18
  124. data/lib/solargraph/pin.rb +44 -44
  125. data/lib/solargraph/pin_cache.rb +245 -185
  126. data/lib/solargraph/position.rb +132 -116
  127. data/lib/solargraph/range.rb +112 -107
  128. data/lib/solargraph/rbs_map/conversions.rb +823 -773
  129. data/lib/solargraph/rbs_map/core_fills.rb +18 -0
  130. data/lib/solargraph/rbs_map/core_map.rb +58 -51
  131. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  132. data/lib/solargraph/rbs_map.rb +163 -150
  133. data/lib/solargraph/shell.rb +352 -268
  134. data/lib/solargraph/source/chain/call.rb +337 -333
  135. data/lib/solargraph/source/chain/constant.rb +26 -89
  136. data/lib/solargraph/source/chain/hash.rb +34 -34
  137. data/lib/solargraph/source/chain/if.rb +28 -28
  138. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  139. data/lib/solargraph/source/chain/link.rb +11 -2
  140. data/lib/solargraph/source/chain/literal.rb +48 -48
  141. data/lib/solargraph/source/chain/or.rb +23 -23
  142. data/lib/solargraph/source/chain.rb +291 -282
  143. data/lib/solargraph/source/change.rb +82 -82
  144. data/lib/solargraph/source/cursor.rb +166 -167
  145. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  146. data/lib/solargraph/source/source_chainer.rb +194 -194
  147. data/lib/solargraph/source/updater.rb +55 -55
  148. data/lib/solargraph/source.rb +498 -495
  149. data/lib/solargraph/source_map/clip.rb +226 -234
  150. data/lib/solargraph/source_map/data.rb +34 -30
  151. data/lib/solargraph/source_map/mapper.rb +259 -259
  152. data/lib/solargraph/source_map.rb +212 -200
  153. data/lib/solargraph/type_checker/checks.rb +124 -124
  154. data/lib/solargraph/type_checker/param_def.rb +37 -35
  155. data/lib/solargraph/type_checker/problem.rb +32 -32
  156. data/lib/solargraph/type_checker/rules.rb +84 -62
  157. data/lib/solargraph/type_checker.rb +814 -699
  158. data/lib/solargraph/version.rb +5 -5
  159. data/lib/solargraph/workspace/config.rb +255 -239
  160. data/lib/solargraph/workspace/require_paths.rb +97 -0
  161. data/lib/solargraph/workspace.rb +220 -249
  162. data/lib/solargraph/yard_map/helpers.rb +44 -16
  163. data/lib/solargraph/yard_map/mapper/to_constant.rb +5 -5
  164. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -134
  165. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
  166. data/lib/solargraph/yard_map/mapper.rb +79 -79
  167. data/lib/solargraph/yard_map/to_method.rb +89 -88
  168. data/lib/solargraph/yardoc.rb +87 -49
  169. data/lib/solargraph.rb +105 -90
  170. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  171. data/rbs/fills/open3/0/open3.rbs +172 -0
  172. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  173. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  174. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  175. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  176. data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +2 -3
  177. data/rbs/shims/ast/0/node.rbs +5 -0
  178. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  179. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  180. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  181. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  182. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  183. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  184. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  185. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  186. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  187. data/rbs_collection.yaml +4 -4
  188. data/solargraph.gemspec +26 -5
  189. metadata +187 -15
  190. data/lib/.rubocop.yml +0 -22
  191. data/lib/solargraph/parser/node_methods.rb +0 -97
@@ -1,53 +1,59 @@
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
- def process
11
- # Example:
12
- #
13
- # s(:masgn,
14
- # s(:mlhs,
15
- # s(:send,
16
- # s(:send, nil, :a), :b=),
17
- # s(:lvasgn, :b),
18
- # s(:ivasgn, :@c)),
19
- # s(:array,
20
- # s(:int, 1),
21
- # s(:int, 2),
22
- # s(:int, 3)))
23
- masgn = node
24
- mlhs = masgn.children.fetch(0)
25
- lhs_arr = mlhs.children
26
- mass_rhs = node.children.fetch(1)
27
-
28
- # Get pins created for the mlhs node
29
- process_children
30
-
31
- lhs_arr.each_with_index do |lhs, i|
32
- location = get_node_location(lhs)
33
- pin = if lhs.type == :lvasgn
34
- # lvasgn is a local variable
35
- locals.find { |l| l.location == location }
36
- else
37
- # e.g., ivasgn is an instance variable, etc
38
- pins.find { |iv| iv.location == location && iv.is_a?(Pin::BaseVariable) }
39
- end
40
- # @todo in line below, nothing in typechecking alerts
41
- # when a non-existant method is called on 'l'
42
- if pin.nil?
43
- Solargraph.logger.debug { "Could not find local for masgn= value in location #{location.inspect} in #{lhs_arr} - masgn = #{masgn}, lhs.type = #{lhs.type}" }
44
- next
45
- end
46
- pin.mass_assignment = [mass_rhs, i]
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
53
- 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
+ else
41
+ # e.g., ivasgn is an instance variable, etc
42
+ pins.find { |iv| iv.location == location && iv.is_a?(Pin::BaseVariable) }
43
+ end
44
+ # @todo in line below, nothing in typechecking alerts
45
+ # when a non-existant method is called on 'l'
46
+ if pin.nil?
47
+ Solargraph.logger.debug do
48
+ "Could not find local for masgn= value in location #{location.inspect} in #{lhs_arr} - masgn = #{masgn}, lhs.type = #{lhs.type}"
49
+ end
50
+ next
51
+ end
52
+ pin.mass_assignment = [mass_rhs, i]
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -11,17 +11,6 @@ module Solargraph
11
11
  superclass_name = nil
12
12
  superclass_name = unpack_name(node.children[1]) if node.type == :class && node.children[1]&.type == :const
13
13
 
14
- if Convention::StructDefinition::StructDefintionNode.valid?(node)
15
- process_struct_definition
16
- else
17
- process_namespace(superclass_name)
18
- end
19
- end
20
-
21
- private
22
-
23
- # @param superclass_name [String, nil]
24
- def process_namespace(superclass_name)
25
14
  loc = get_node_location(node)
26
15
  nspin = Solargraph::Pin::Namespace.new(
27
16
  type: node.type,
@@ -44,17 +33,6 @@ module Solargraph
44
33
  end
45
34
  process_children region.update(closure: nspin, visibility: :public)
46
35
  end
47
-
48
- # @todo Move this out of [NamespaceNode] once [Solargraph::Parser::NodeProcessor] supports
49
- # multiple processors.
50
- def process_struct_definition
51
- processor_klass = Convention::StructDefinition::NodeProcessors::StructNode
52
- processor = processor_klass.new(node, region, pins, locals)
53
- processor.process
54
-
55
- @pins = processor.pins
56
- @locals = processor.locals
57
- end
58
36
  end
59
37
  end
60
38
  end
@@ -1,41 +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
- def process
11
- # Parser::CurrentRuby.parse("a += 2")
12
- # => s(:op_asgn,
13
- # s(:lvasgn, :a), :+,
14
- # s(:int, 2))
15
- asgn = node.children[0]
16
- variable_name = asgn.children[0]
17
- operator = node.children[1]
18
- argument = node.children[2]
19
- # for lvasgn, gvasgn, cvasgn, convert to lvar, gvar, cvar
20
- # [6] pry(main)> Parser::CurrentRuby.parse("a = a + 1")
21
- # => s(:lvasgn, :a,
22
- # s(:send,
23
- # s(:lvar, :a), :+,
24
- # s(:int, 1)))
25
- # [7] pry(main)>
26
- variable_reference_type = asgn.type.to_s.sub(/vasgn$/, 'var').to_sym
27
- variable_reference = node.updated(variable_reference_type, asgn.children)
28
- send_children = [
29
- variable_reference,
30
- operator,
31
- argument
32
- ]
33
- send_node = node.updated(:send, send_children)
34
- new_asgn = node.updated(asgn.type, [variable_name, send_node])
35
- NodeProcessor.process(new_asgn, region, pins, locals)
36
- end
37
- end
38
- end
39
- end
40
- end
41
- 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)
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,16 +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
- def process
9
- new_node = node.updated(node.children[0].type, node.children[0].children + [node.children[1]])
10
- NodeProcessor.process(new_node, region, pins, locals)
11
- end
12
- end
13
- end
14
- end
15
- end
16
- 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)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,37 +1,38 @@
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
- def process
11
- if node.children[1] # Exception local variable name
12
- here = get_node_start_position(node.children[1])
13
- presence = Range.new(here, region.closure.location.range.ending)
14
- loc = get_node_location(node.children[1])
15
- types = if node.children[0].nil?
16
- ['Exception']
17
- else
18
- node.children[0].children.map do |child|
19
- unpack_name(child)
20
- end
21
- end
22
- locals.push Solargraph::Pin::LocalVariable.new(
23
- location: loc,
24
- closure: region.closure,
25
- name: node.children[1].children[0].to_s,
26
- comments: "@type [#{types.join(',')}]",
27
- presence: presence,
28
- source: :parser
29
- )
30
- end
31
- NodeProcessor.process(node.children[2], region, pins, locals)
32
- end
33
- end
34
- end
35
- end
36
- end
37
- 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
+ presence = Range.new(here, region.closure.location.range.ending)
15
+ loc = get_node_location(node.children[1])
16
+ types = if node.children[0].nil?
17
+ ['Exception']
18
+ else
19
+ node.children[0].children.map do |child|
20
+ unpack_name(child)
21
+ end
22
+ end
23
+ locals.push Solargraph::Pin::LocalVariable.new(
24
+ location: loc,
25
+ closure: region.closure,
26
+ name: node.children[1].children[0].to_s,
27
+ comments: "@type [#{types.join(',')}]",
28
+ presence: presence,
29
+ source: :parser
30
+ )
31
+ end
32
+ NodeProcessor.process(node.children[2], region, pins, locals)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,43 +1,52 @@
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
- def process
9
- sclass = node.children[0]
10
- if sclass.is_a?(AST::Node) && sclass.type == :self
11
- closure = region.closure
12
- elsif sclass.is_a?(AST::Node) && sclass.type == :casgn
13
- names = [region.closure.namespace, region.closure.name]
14
- if sclass.children[0].nil? && names.last != sclass.children[1].to_s
15
- names << sclass.children[1].to_s
16
- else
17
- names.concat [NodeMethods.unpack_name(sclass.children[0]), sclass.children[1].to_s]
18
- end
19
- name = names.reject(&:empty?).join('::')
20
- closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
21
- elsif sclass.is_a?(AST::Node) && sclass.type == :const
22
- names = [region.closure.namespace, region.closure.name]
23
- also = NodeMethods.unpack_name(sclass)
24
- if also != region.closure.name
25
- names << also
26
- end
27
- name = names.reject(&:empty?).join('::')
28
- closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
29
- else
30
- return
31
- end
32
- pins.push Solargraph::Pin::Singleton.new(
33
- location: get_node_location(node),
34
- closure: closure,
35
- source: :parser,
36
- )
37
- process_children region.update(visibility: :public, scope: :class, closure: pins.last)
38
- end
39
- end
40
- end
41
- end
42
- end
43
- 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
+ def process
9
+ sclass = node.children[0]
10
+ # @todo Changing Parser::AST::Node to AST::Node below will
11
+ # cause type errors at strong level because the combined
12
+ # pin for AST::Node#children has return type
13
+ # "Array<AST::Node>, Array". YARD annotations in AST
14
+ # provided the Array, RBS for Array<AST::Node>. We
15
+ # should probably have a rule to combine "A, A<T>""
16
+ # types to "A<T>" if the "A" comes from YARD, with the
17
+ # rationale that folks tend to be less formal with types in
18
+ # YARD.
19
+ if sclass.is_a?(::Parser::AST::Node) && sclass.type == :self
20
+ closure = region.closure
21
+ elsif sclass.is_a?(::Parser::AST::Node) && sclass.type == :casgn
22
+ names = [region.closure.namespace, region.closure.name]
23
+ if sclass.children[0].nil? && names.last != sclass.children[1].to_s
24
+ names << sclass.children[1].to_s
25
+ else
26
+ names.concat [NodeMethods.unpack_name(sclass.children[0]), sclass.children[1].to_s]
27
+ end
28
+ name = names.reject(&:empty?).join('::')
29
+ closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
30
+ elsif sclass.is_a?(::Parser::AST::Node) && sclass.type == :const
31
+ names = [region.closure.namespace, region.closure.name]
32
+ also = NodeMethods.unpack_name(sclass)
33
+ if also != region.closure.name
34
+ names << also
35
+ end
36
+ name = names.reject(&:empty?).join('::')
37
+ closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
38
+ else
39
+ return
40
+ end
41
+ pins.push Solargraph::Pin::Singleton.new(
42
+ location: get_node_location(node),
43
+ closure: closure,
44
+ source: :parser,
45
+ )
46
+ process_children region.update(visibility: :public, scope: :class, closure: pins.last)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end