solargraph 0.58.1 → 0.58.3

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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +3 -2
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +10 -1
  5. data/lib/solargraph/api_map/cache.rb +110 -110
  6. data/lib/solargraph/api_map/constants.rb +279 -279
  7. data/lib/solargraph/api_map/index.rb +193 -193
  8. data/lib/solargraph/api_map/source_to_yard.rb +97 -97
  9. data/lib/solargraph/api_map/store.rb +384 -384
  10. data/lib/solargraph/api_map.rb +945 -945
  11. data/lib/solargraph/bench.rb +45 -45
  12. data/lib/solargraph/complex_type/type_methods.rb +228 -228
  13. data/lib/solargraph/complex_type/unique_type.rb +482 -482
  14. data/lib/solargraph/complex_type.rb +444 -444
  15. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  16. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
  17. data/lib/solargraph/convention/data_definition.rb +105 -105
  18. data/lib/solargraph/convention/gemfile.rb +15 -15
  19. data/lib/solargraph/convention/gemspec.rb +23 -23
  20. data/lib/solargraph/convention/rakefile.rb +17 -17
  21. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
  22. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
  23. data/lib/solargraph/convention/struct_definition.rb +164 -164
  24. data/lib/solargraph/convention.rb +78 -78
  25. data/lib/solargraph/converters/dd.rb +17 -17
  26. data/lib/solargraph/converters/dl.rb +15 -15
  27. data/lib/solargraph/converters/dt.rb +15 -15
  28. data/lib/solargraph/converters/misc.rb +1 -1
  29. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  30. data/lib/solargraph/diagnostics/rubocop.rb +118 -118
  31. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
  32. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  33. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  34. data/lib/solargraph/doc_map.rb +439 -439
  35. data/lib/solargraph/equality.rb +34 -34
  36. data/lib/solargraph/gem_pins.rb +98 -98
  37. data/lib/solargraph/language_server/error_codes.rb +20 -20
  38. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  39. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  40. data/lib/solargraph/language_server/host/message_worker.rb +112 -112
  41. data/lib/solargraph/language_server/host/sources.rb +99 -99
  42. data/lib/solargraph/language_server/host.rb +878 -878
  43. data/lib/solargraph/language_server/message/base.rb +97 -97
  44. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  45. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  46. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  47. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  48. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  49. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  50. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  51. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  52. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  53. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
  54. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  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 -148
  57. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  58. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  59. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  60. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  61. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  62. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
  63. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  64. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  65. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  66. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  67. data/lib/solargraph/language_server/message.rb +94 -94
  68. data/lib/solargraph/language_server/request.rb +27 -27
  69. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  70. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  71. data/lib/solargraph/library.rb +683 -683
  72. data/lib/solargraph/location.rb +82 -82
  73. data/lib/solargraph/logging.rb +37 -37
  74. data/lib/solargraph/page.rb +92 -92
  75. data/lib/solargraph/parser/comment_ripper.rb +69 -69
  76. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
  77. data/lib/solargraph/parser/node_processor/base.rb +92 -92
  78. data/lib/solargraph/parser/node_processor.rb +62 -62
  79. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
  80. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  81. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
  82. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -486
  83. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  84. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  85. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  86. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  87. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  88. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  89. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
  90. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  91. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  92. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
  93. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  94. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  95. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
  96. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
  97. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
  98. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  99. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  100. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
  101. data/lib/solargraph/parser/parser_gem.rb +12 -12
  102. data/lib/solargraph/parser/region.rb +69 -69
  103. data/lib/solargraph/parser/snippet.rb +17 -17
  104. data/lib/solargraph/parser.rb +23 -23
  105. data/lib/solargraph/pin/base.rb +729 -729
  106. data/lib/solargraph/pin/base_variable.rb +126 -126
  107. data/lib/solargraph/pin/block.rb +104 -104
  108. data/lib/solargraph/pin/breakable.rb +9 -9
  109. data/lib/solargraph/pin/callable.rb +231 -231
  110. data/lib/solargraph/pin/closure.rb +72 -72
  111. data/lib/solargraph/pin/common.rb +79 -79
  112. data/lib/solargraph/pin/constant.rb +45 -45
  113. data/lib/solargraph/pin/conversions.rb +123 -123
  114. data/lib/solargraph/pin/delegated_method.rb +120 -120
  115. data/lib/solargraph/pin/documenting.rb +114 -114
  116. data/lib/solargraph/pin/instance_variable.rb +34 -34
  117. data/lib/solargraph/pin/keyword.rb +20 -20
  118. data/lib/solargraph/pin/local_variable.rb +75 -75
  119. data/lib/solargraph/pin/method.rb +672 -672
  120. data/lib/solargraph/pin/method_alias.rb +34 -34
  121. data/lib/solargraph/pin/namespace.rb +115 -115
  122. data/lib/solargraph/pin/parameter.rb +275 -275
  123. data/lib/solargraph/pin/proxy_type.rb +39 -39
  124. data/lib/solargraph/pin/reference/override.rb +47 -47
  125. data/lib/solargraph/pin/reference/superclass.rb +15 -15
  126. data/lib/solargraph/pin/reference.rb +39 -39
  127. data/lib/solargraph/pin/search.rb +61 -61
  128. data/lib/solargraph/pin/signature.rb +61 -61
  129. data/lib/solargraph/pin/symbol.rb +53 -53
  130. data/lib/solargraph/pin/until.rb +18 -18
  131. data/lib/solargraph/pin/while.rb +18 -18
  132. data/lib/solargraph/pin.rb +44 -44
  133. data/lib/solargraph/pin_cache.rb +245 -245
  134. data/lib/solargraph/position.rb +132 -119
  135. data/lib/solargraph/range.rb +112 -112
  136. data/lib/solargraph/rbs_map/conversions.rb +823 -823
  137. data/lib/solargraph/rbs_map/core_fills.rb +84 -84
  138. data/lib/solargraph/rbs_map/core_map.rb +58 -58
  139. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  140. data/lib/solargraph/rbs_map.rb +163 -163
  141. data/lib/solargraph/server_methods.rb +16 -16
  142. data/lib/solargraph/shell.rb +363 -352
  143. data/lib/solargraph/source/chain/array.rb +37 -37
  144. data/lib/solargraph/source/chain/call.rb +337 -337
  145. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  146. data/lib/solargraph/source/chain/constant.rb +26 -26
  147. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  148. data/lib/solargraph/source/chain/hash.rb +34 -34
  149. data/lib/solargraph/source/chain/if.rb +28 -28
  150. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  151. data/lib/solargraph/source/chain/link.rb +109 -109
  152. data/lib/solargraph/source/chain/literal.rb +48 -48
  153. data/lib/solargraph/source/chain/or.rb +23 -23
  154. data/lib/solargraph/source/chain/q_call.rb +11 -11
  155. data/lib/solargraph/source/chain/variable.rb +13 -13
  156. data/lib/solargraph/source/chain/z_super.rb +30 -30
  157. data/lib/solargraph/source/chain.rb +291 -291
  158. data/lib/solargraph/source/change.rb +82 -82
  159. data/lib/solargraph/source/cursor.rb +166 -166
  160. data/lib/solargraph/source/source_chainer.rb +194 -194
  161. data/lib/solargraph/source/updater.rb +55 -55
  162. data/lib/solargraph/source.rb +498 -498
  163. data/lib/solargraph/source_map/clip.rb +226 -226
  164. data/lib/solargraph/source_map/data.rb +34 -34
  165. data/lib/solargraph/source_map/mapper.rb +259 -259
  166. data/lib/solargraph/source_map.rb +212 -212
  167. data/lib/solargraph/type_checker/checks.rb +124 -124
  168. data/lib/solargraph/type_checker/param_def.rb +37 -37
  169. data/lib/solargraph/type_checker/problem.rb +32 -32
  170. data/lib/solargraph/type_checker/rules.rb +84 -84
  171. data/lib/solargraph/type_checker.rb +814 -814
  172. data/lib/solargraph/version.rb +1 -1
  173. data/lib/solargraph/workspace/config.rb +255 -255
  174. data/lib/solargraph/workspace/require_paths.rb +97 -97
  175. data/lib/solargraph/workspace.rb +220 -220
  176. data/lib/solargraph/yard_map/helpers.rb +44 -44
  177. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
  178. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
  179. data/lib/solargraph/yard_map/mapper.rb +79 -79
  180. data/lib/solargraph/yard_map/to_method.rb +89 -89
  181. data/lib/solargraph/yard_tags.rb +20 -20
  182. data/lib/solargraph/yardoc.rb +87 -87
  183. data/lib/solargraph.rb +105 -105
  184. data/rbs_collection.yaml +1 -1
  185. metadata +12 -12
  186. /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
  187. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  188. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  189. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  190. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  191. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  192. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  193. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  194. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  195. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,291 +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
- # @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
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
@@ -1,29 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module ParserGem
6
- module NodeProcessors
7
- class UntilNode < 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
- # until 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::Until.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 UntilNode < 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
+ # until 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::Until.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