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,271 +1,291 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module ParserGem
6
- module NodeProcessors
7
- class SendNode < Parser::NodeProcessor::Base
8
- include ParserGem::NodeMethods
9
-
10
- def process
11
- if node.children[0].nil?
12
- if [:private, :public, :protected].include?(node.children[1])
13
- process_visibility
14
- elsif node.children[1] == :module_function
15
- process_module_function
16
- elsif [:attr_reader, :attr_writer, :attr_accessor].include?(node.children[1])
17
- process_attribute
18
- elsif node.children[1] == :include
19
- process_include
20
- elsif node.children[1] == :extend
21
- process_extend
22
- elsif node.children[1] == :prepend
23
- process_prepend
24
- elsif node.children[1] == :require
25
- process_require
26
- elsif node.children[1] == :autoload
27
- process_autoload
28
- elsif node.children[1] == :private_constant
29
- process_private_constant
30
- elsif node.children[1] == :alias_method && node.children[2] && node.children[2] && node.children[2].type == :sym && node.children[3] && node.children[3].type == :sym
31
- process_alias_method
32
- elsif node.children[1] == :private_class_method && node.children[2].is_a?(AST::Node)
33
- # Processing a private class can potentially handle children on its own
34
- return if process_private_class_method
35
- end
36
- elsif node.children[1] == :require && node.children[0].to_s == '(const nil :Bundler)'
37
- pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require', source: :parser)
38
- end
39
- process_children
40
- end
41
-
42
- private
43
-
44
- # @return [void]
45
- def process_visibility
46
- if (node.children.length > 2)
47
- node.children[2..-1].each do |child|
48
- if child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
49
- name = child.children[0].to_s
50
- matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
51
- matches.each do |pin|
52
- # @todo Smelly instance variable access
53
- pin.instance_variable_set(:@visibility, node.children[1])
54
- end
55
- else
56
- process_children region.update(visibility: node.children[1])
57
- end
58
- end
59
- else
60
- # @todo Smelly instance variable access
61
- region.instance_variable_set(:@visibility, node.children[1])
62
- end
63
- end
64
-
65
- # @return [void]
66
- def process_attribute
67
- node.children[2..-1].each do |a|
68
- loc = get_node_location(node)
69
- clos = region.closure
70
- cmnt = comments_for(node)
71
- if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
72
- pins.push Solargraph::Pin::Method.new(
73
- location: loc,
74
- closure: clos,
75
- name: a.children[0].to_s,
76
- comments: cmnt,
77
- scope: region.scope || :instance,
78
- visibility: region.visibility,
79
- attribute: true,
80
- source: :parser
81
- )
82
- end
83
- if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
84
- method_pin = Solargraph::Pin::Method.new(
85
- location: loc,
86
- closure: clos,
87
- name: "#{a.children[0]}=",
88
- comments: cmnt,
89
- scope: region.scope || :instance,
90
- visibility: region.visibility,
91
- attribute: true,
92
- source: :parser
93
- )
94
- pins.push method_pin
95
- method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last, source: :parser)
96
- if method_pin.return_type.defined?
97
- pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
98
- end
99
- end
100
- end
101
- end
102
-
103
- # @return [void]
104
- def process_include
105
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
106
- cp = region.closure
107
- node.children[2..-1].each do |i|
108
- type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
109
- pins.push type.new(
110
- location: get_node_location(i),
111
- closure: cp,
112
- name: unpack_name(i),
113
- source: :parser
114
- )
115
- end
116
- end
117
- end
118
-
119
- # @return [void]
120
- def process_prepend
121
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
122
- cp = region.closure
123
- node.children[2..-1].each do |i|
124
- pins.push Pin::Reference::Prepend.new(
125
- location: get_node_location(i),
126
- closure: cp,
127
- name: unpack_name(i),
128
- source: :parser
129
- )
130
- end
131
- end
132
- end
133
-
134
- # @return [void]
135
- def process_extend
136
- node.children[2..-1].each do |i|
137
- loc = get_node_location(node)
138
- if i.type == :self
139
- pins.push Pin::Reference::Extend.new(
140
- location: loc,
141
- closure: region.closure,
142
- name: region.closure.full_context.namespace,
143
- source: :parser
144
- )
145
- else
146
- pins.push Pin::Reference::Extend.new(
147
- location: loc,
148
- closure: region.closure,
149
- name: unpack_name(i),
150
- source: :parser
151
- )
152
- end
153
- end
154
- end
155
-
156
- # @return [void]
157
- def process_require
158
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
159
- path = node.children[2].children[0].to_s
160
- pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
161
- end
162
- end
163
-
164
- # @return [void]
165
- def process_autoload
166
- if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
167
- path = node.children[3].children[0].to_s
168
- pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
169
- end
170
- end
171
-
172
- # @return [void]
173
- def process_module_function
174
- if node.children[2].nil?
175
- # @todo Smelly instance variable access
176
- region.instance_variable_set(:@visibility, :module_function)
177
- elsif node.children[2].type == :sym || node.children[2].type == :str
178
- node.children[2..-1].each do |x|
179
- cn = x.children[0].to_s
180
- # @type [Pin::Method]
181
- ref = pins.find { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }
182
- unless ref.nil?
183
- pins.delete ref
184
- mm = Solargraph::Pin::Method.new(
185
- location: ref.location,
186
- closure: ref.closure,
187
- name: ref.name,
188
- parameters: ref.parameters,
189
- comments: ref.comments,
190
- scope: :class,
191
- visibility: :public,
192
- node: ref.node,
193
- source: :parser
194
- )
195
- cm = Solargraph::Pin::Method.new(
196
- location: ref.location,
197
- closure: ref.closure,
198
- name: ref.name,
199
- parameters: ref.parameters,
200
- comments: ref.comments,
201
- scope: :instance,
202
- visibility: :private,
203
- node: ref.node,
204
- source: :parser)
205
- pins.push mm, cm
206
- pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
207
- pins.delete ivar
208
- pins.push Solargraph::Pin::InstanceVariable.new(
209
- location: ivar.location,
210
- closure: cm,
211
- name: ivar.name,
212
- comments: ivar.comments,
213
- assignment: ivar.assignment,
214
- source: :parser
215
- )
216
- pins.push Solargraph::Pin::InstanceVariable.new(
217
- location: ivar.location,
218
- closure: mm,
219
- name: ivar.name,
220
- comments: ivar.comments,
221
- assignment: ivar.assignment,
222
- source: :parser
223
- )
224
- end
225
- end
226
- end
227
- elsif node.children[2].type == :def
228
- NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals
229
- end
230
- end
231
-
232
- # @return [void]
233
- def process_private_constant
234
- if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
235
- cn = node.children[2].children[0].to_s
236
- ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn}.first
237
- # HACK: Smelly instance variable access
238
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
239
- end
240
- end
241
-
242
- # @return [void]
243
- def process_alias_method
244
- loc = get_node_location(node)
245
- pins.push Solargraph::Pin::MethodAlias.new(
246
- location: get_node_location(node),
247
- closure: region.closure,
248
- name: node.children[2].children[0].to_s,
249
- original: node.children[3].children[0].to_s,
250
- scope: region.scope || :instance,
251
- source: :parser
252
- )
253
- end
254
-
255
- # @return [Boolean]
256
- def process_private_class_method
257
- if node.children[2].type == :sym || node.children[2].type == :str
258
- ref = pins.select { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == node.children[2].children[0].to_s }.first
259
- # HACK: Smelly instance variable access
260
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
261
- false
262
- else
263
- process_children region.update(scope: :class, visibility: :private)
264
- true
265
- end
266
- end
267
- end
268
- end
269
- end
270
- end
271
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class SendNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ # @sg-ignore Variable type could not be inferred for method_name
12
+ # @type [Symbol]
13
+ method_name = node.children[1]
14
+ # :nocov:
15
+ unless method_name.instance_of?(Symbol)
16
+ Solargraph.assert_or_log(:parser_method_name, "Expected method name to be a Symbol, got #{method_name.class} for node #{node.inspect}")
17
+ return process_children
18
+ end
19
+ # :nocov:
20
+ if node.children[0].nil?
21
+ if [:private, :public, :protected].include?(method_name)
22
+ process_visibility
23
+ elsif method_name == :module_function
24
+ process_module_function
25
+ elsif [:attr_reader, :attr_writer, :attr_accessor].include?(method_name)
26
+ process_attribute
27
+ elsif method_name == :include
28
+ process_include
29
+ elsif method_name == :extend
30
+ process_extend
31
+ elsif method_name == :prepend
32
+ process_prepend
33
+ elsif method_name == :require
34
+ process_require
35
+ elsif method_name == :autoload
36
+ process_autoload
37
+ elsif method_name == :private_constant
38
+ process_private_constant
39
+ elsif method_name == :alias_method && node.children[2] && node.children[2] && node.children[2].type == :sym && node.children[3] && node.children[3].type == :sym
40
+ process_alias_method
41
+ elsif method_name == :private_class_method && node.children[2].is_a?(AST::Node)
42
+ # Processing a private class can potentially handle children on its own
43
+ return if process_private_class_method
44
+ end
45
+ elsif method_name == :require && node.children[0].to_s == '(const nil :Bundler)'
46
+ pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require', source: :parser)
47
+ end
48
+ process_children
49
+ end
50
+
51
+ private
52
+
53
+ # @return [void]
54
+ def process_visibility
55
+ if (node.children.length > 2)
56
+ node.children[2..-1].each do |child|
57
+ # @sg-ignore Variable type could not be inferred for method_name
58
+ # @type [Symbol]
59
+ visibility = node.children[1]
60
+ # :nocov:
61
+ unless visibility.instance_of?(Symbol)
62
+ Solargraph.assert_or_log(:parser_visibility, "Expected visibility name to be a Symbol, got #{visibility.class} for node #{node.inspect}")
63
+ return process_children
64
+ end
65
+ # :nocov:
66
+ if child.is_a?(::Parser::AST::Node) && (child.type == :sym || child.type == :str)
67
+ name = child.children[0].to_s
68
+ matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
69
+ matches.each do |pin|
70
+ # @todo Smelly instance variable access
71
+ pin.instance_variable_set(:@visibility, visibility)
72
+ end
73
+ else
74
+ process_children region.update(visibility: visibility)
75
+ end
76
+ end
77
+ else
78
+ # @todo Smelly instance variable access
79
+ region.instance_variable_set(:@visibility, node.children[1])
80
+ end
81
+ end
82
+
83
+ # @return [void]
84
+ def process_attribute
85
+ node.children[2..-1].each do |a|
86
+ loc = get_node_location(node)
87
+ clos = region.closure
88
+ cmnt = comments_for(node)
89
+ if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
90
+ pins.push Solargraph::Pin::Method.new(
91
+ location: loc,
92
+ closure: clos,
93
+ name: a.children[0].to_s,
94
+ comments: cmnt,
95
+ scope: region.scope || :instance,
96
+ visibility: region.visibility,
97
+ attribute: true,
98
+ source: :parser
99
+ )
100
+ end
101
+ if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
102
+ method_pin = Solargraph::Pin::Method.new(
103
+ location: loc,
104
+ closure: clos,
105
+ name: "#{a.children[0]}=",
106
+ comments: cmnt,
107
+ scope: region.scope || :instance,
108
+ visibility: region.visibility,
109
+ attribute: true,
110
+ source: :parser
111
+ )
112
+ pins.push method_pin
113
+ method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last, source: :parser)
114
+ if method_pin.return_type.defined?
115
+ pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ # @return [void]
122
+ def process_include
123
+ if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
124
+ cp = region.closure
125
+ node.children[2..-1].each do |i|
126
+ type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
127
+ pins.push type.new(
128
+ location: get_node_location(i),
129
+ closure: cp,
130
+ name: unpack_name(i),
131
+ source: :parser
132
+ )
133
+ end
134
+ end
135
+ end
136
+
137
+ # @return [void]
138
+ def process_prepend
139
+ if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
140
+ cp = region.closure
141
+ node.children[2..-1].each do |i|
142
+ pins.push Pin::Reference::Prepend.new(
143
+ location: get_node_location(i),
144
+ closure: cp,
145
+ name: unpack_name(i),
146
+ source: :parser
147
+ )
148
+ end
149
+ end
150
+ end
151
+
152
+ # @return [void]
153
+ def process_extend
154
+ node.children[2..-1].each do |i|
155
+ loc = get_node_location(node)
156
+ if i.type == :self
157
+ pins.push Pin::Reference::Extend.new(
158
+ location: loc,
159
+ closure: region.closure,
160
+ name: region.closure.full_context.namespace,
161
+ source: :parser
162
+ )
163
+ else
164
+ pins.push Pin::Reference::Extend.new(
165
+ location: loc,
166
+ closure: region.closure,
167
+ name: unpack_name(i),
168
+ source: :parser
169
+ )
170
+ end
171
+ end
172
+ end
173
+
174
+ # @return [void]
175
+ def process_require
176
+ if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
177
+ path = node.children[2].children[0].to_s
178
+ pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
179
+ end
180
+ end
181
+
182
+ # @return [void]
183
+ def process_autoload
184
+ if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
185
+ path = node.children[3].children[0].to_s
186
+ pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
187
+ end
188
+ end
189
+
190
+ # @return [void]
191
+ def process_module_function
192
+ if node.children[2].nil?
193
+ # @todo Smelly instance variable access
194
+ region.instance_variable_set(:@visibility, :module_function)
195
+ elsif node.children[2].type == :sym || node.children[2].type == :str
196
+ node.children[2..-1].each do |x|
197
+ cn = x.children[0].to_s
198
+ # @type [Pin::Method, nil]
199
+ ref = pins.find { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }
200
+ unless ref.nil?
201
+ pins.delete ref
202
+ mm = Solargraph::Pin::Method.new(
203
+ location: ref.location,
204
+ closure: ref.closure,
205
+ name: ref.name,
206
+ parameters: ref.parameters,
207
+ comments: ref.comments,
208
+ scope: :class,
209
+ visibility: :public,
210
+ node: ref.node,
211
+ source: :parser
212
+ )
213
+ cm = Solargraph::Pin::Method.new(
214
+ location: ref.location,
215
+ closure: ref.closure,
216
+ name: ref.name,
217
+ parameters: ref.parameters,
218
+ comments: ref.comments,
219
+ scope: :instance,
220
+ visibility: :private,
221
+ node: ref.node,
222
+ source: :parser)
223
+ pins.push mm, cm
224
+ pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
225
+ pins.delete ivar
226
+ pins.push Solargraph::Pin::InstanceVariable.new(
227
+ location: ivar.location,
228
+ closure: cm,
229
+ name: ivar.name,
230
+ comments: ivar.comments,
231
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
232
+ assignment: ivar.assignment,
233
+ source: :parser
234
+ )
235
+ pins.push Solargraph::Pin::InstanceVariable.new(
236
+ location: ivar.location,
237
+ closure: mm,
238
+ name: ivar.name,
239
+ comments: ivar.comments,
240
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
241
+ assignment: ivar.assignment,
242
+ source: :parser
243
+ )
244
+ end
245
+ end
246
+ end
247
+ elsif node.children[2].type == :def
248
+ NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals
249
+ end
250
+ end
251
+
252
+ # @return [void]
253
+ def process_private_constant
254
+ if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
255
+ cn = node.children[2].children[0].to_s
256
+ ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn}.first
257
+ # HACK: Smelly instance variable access
258
+ ref.instance_variable_set(:@visibility, :private) unless ref.nil?
259
+ end
260
+ end
261
+
262
+ # @return [void]
263
+ def process_alias_method
264
+ loc = get_node_location(node)
265
+ pins.push Solargraph::Pin::MethodAlias.new(
266
+ location: get_node_location(node),
267
+ closure: region.closure,
268
+ name: node.children[2].children[0].to_s,
269
+ original: node.children[3].children[0].to_s,
270
+ scope: region.scope || :instance,
271
+ source: :parser
272
+ )
273
+ end
274
+
275
+ # @return [Boolean]
276
+ def process_private_class_method
277
+ if node.children[2].type == :sym || node.children[2].type == :str
278
+ ref = pins.select { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == node.children[2].children[0].to_s }.first
279
+ # HACK: Smelly instance variable access
280
+ ref.instance_variable_set(:@visibility, :private) unless ref.nil?
281
+ false
282
+ else
283
+ process_children region.update(scope: :class, visibility: :private)
284
+ true
285
+ end
286
+ end
287
+ end
288
+ end
289
+ end
290
+ end
291
+ end
@@ -5,6 +5,7 @@ module Solargraph
5
5
  module ParserGem
6
6
  module NodeProcessors
7
7
  class SymNode < Parser::NodeProcessor::Base
8
+ # @return [void]
8
9
  def process
9
10
  pins.push Solargraph::Pin::Symbol.new(
10
11
  get_node_location(node),
@@ -1,29 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module ParserGem
6
- module NodeProcessors
7
- class WhileNode < Parser::NodeProcessor::Base
8
- include ParserGem::NodeMethods
9
-
10
- def process
11
- location = get_node_location(node)
12
- # Note - this should not be considered a block, as the
13
- # while statement doesn't create a closure - e.g.,
14
- # variables created inside can be seen from outside as
15
- # well
16
- pins.push Solargraph::Pin::While.new(
17
- location: location,
18
- closure: region.closure,
19
- node: node,
20
- comments: comments_for(node),
21
- source: :parser,
22
- )
23
- process_children region
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class WhileNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ location = get_node_location(node)
12
+ # Note - this should not be considered a block, as the
13
+ # while statement doesn't create a closure - e.g.,
14
+ # variables created inside can be seen from outside as
15
+ # well
16
+ pins.push Solargraph::Pin::While.new(
17
+ location: location,
18
+ closure: region.closure,
19
+ node: node,
20
+ comments: comments_for(node),
21
+ source: :parser,
22
+ )
23
+ process_children region
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end