solargraph 0.57.0 → 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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +4 -2
  4. data/.github/workflows/plugins.yml +63 -28
  5. data/.github/workflows/rspec.yml +19 -4
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.gitignore +1 -0
  8. data/.rubocop.yml +1 -1
  9. data/.rubocop_todo.yml +90 -1438
  10. data/CHANGELOG.md +39 -0
  11. data/Rakefile +1 -1
  12. data/bin/solargraph +3 -0
  13. data/lib/solargraph/api_map/cache.rb +110 -110
  14. data/lib/solargraph/api_map/constants.rb +279 -218
  15. data/lib/solargraph/api_map/index.rb +193 -169
  16. data/lib/solargraph/api_map/source_to_yard.rb +97 -94
  17. data/lib/solargraph/api_map/store.rb +384 -374
  18. data/lib/solargraph/api_map.rb +945 -951
  19. data/lib/solargraph/bench.rb +45 -45
  20. data/lib/solargraph/complex_type/type_methods.rb +228 -223
  21. data/lib/solargraph/complex_type/unique_type.rb +482 -475
  22. data/lib/solargraph/complex_type.rb +444 -427
  23. data/lib/solargraph/convention/active_support_concern.rb +1 -1
  24. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  25. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
  26. data/lib/solargraph/convention/data_definition.rb +105 -105
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +23 -23
  29. data/lib/solargraph/convention/rakefile.rb +17 -17
  30. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
  31. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
  32. data/lib/solargraph/convention/struct_definition.rb +164 -164
  33. data/lib/solargraph/convention.rb +78 -78
  34. data/lib/solargraph/converters/dd.rb +17 -17
  35. data/lib/solargraph/converters/dl.rb +15 -15
  36. data/lib/solargraph/converters/dt.rb +15 -15
  37. data/lib/solargraph/converters/misc.rb +1 -1
  38. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  39. data/lib/solargraph/diagnostics/rubocop.rb +118 -118
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  41. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  42. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  43. data/lib/solargraph/doc_map.rb +439 -436
  44. data/lib/solargraph/environ.rb +1 -1
  45. data/lib/solargraph/equality.rb +34 -33
  46. data/lib/solargraph/gem_pins.rb +98 -94
  47. data/lib/solargraph/language_server/error_codes.rb +20 -20
  48. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  49. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  50. data/lib/solargraph/language_server/host/message_worker.rb +112 -112
  51. data/lib/solargraph/language_server/host/sources.rb +99 -99
  52. data/lib/solargraph/language_server/host.rb +878 -872
  53. data/lib/solargraph/language_server/message/base.rb +97 -97
  54. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  55. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  56. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  57. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  58. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  59. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  60. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  61. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  62. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  63. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
  64. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  65. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  66. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -145
  67. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  68. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  69. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  71. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  72. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
  73. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  74. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  75. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  76. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  77. data/lib/solargraph/language_server/message.rb +94 -94
  78. data/lib/solargraph/language_server/progress.rb +1 -1
  79. data/lib/solargraph/language_server/request.rb +27 -25
  80. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  81. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  82. data/lib/solargraph/library.rb +683 -683
  83. data/lib/solargraph/location.rb +82 -81
  84. data/lib/solargraph/logging.rb +37 -37
  85. data/lib/solargraph/page.rb +92 -93
  86. data/lib/solargraph/parser/comment_ripper.rb +69 -69
  87. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
  88. data/lib/solargraph/parser/node_processor/base.rb +92 -92
  89. data/lib/solargraph/parser/node_processor.rb +62 -62
  90. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
  91. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  92. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
  93. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -499
  94. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
  95. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  96. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  97. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  98. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  99. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  100. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
  101. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  102. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  103. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
  104. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -42
  105. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  106. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
  107. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
  108. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -292
  109. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  110. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  111. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
  112. data/lib/solargraph/parser/parser_gem.rb +12 -12
  113. data/lib/solargraph/parser/region.rb +69 -69
  114. data/lib/solargraph/parser/snippet.rb +17 -17
  115. data/lib/solargraph/parser.rb +23 -23
  116. data/lib/solargraph/pin/base.rb +729 -708
  117. data/lib/solargraph/pin/base_variable.rb +126 -124
  118. data/lib/solargraph/pin/block.rb +104 -103
  119. data/lib/solargraph/pin/breakable.rb +9 -9
  120. data/lib/solargraph/pin/callable.rb +231 -227
  121. data/lib/solargraph/pin/closure.rb +72 -76
  122. data/lib/solargraph/pin/common.rb +79 -79
  123. data/lib/solargraph/pin/constant.rb +45 -45
  124. data/lib/solargraph/pin/conversions.rb +123 -123
  125. data/lib/solargraph/pin/delegated_method.rb +120 -121
  126. data/lib/solargraph/pin/documenting.rb +114 -114
  127. data/lib/solargraph/pin/instance_variable.rb +34 -34
  128. data/lib/solargraph/pin/keyword.rb +20 -20
  129. data/lib/solargraph/pin/local_variable.rb +75 -79
  130. data/lib/solargraph/pin/method.rb +672 -656
  131. data/lib/solargraph/pin/method_alias.rb +34 -34
  132. data/lib/solargraph/pin/namespace.rb +115 -115
  133. data/lib/solargraph/pin/parameter.rb +275 -271
  134. data/lib/solargraph/pin/proxy_type.rb +39 -36
  135. data/lib/solargraph/pin/reference/override.rb +47 -47
  136. data/lib/solargraph/pin/reference/superclass.rb +15 -15
  137. data/lib/solargraph/pin/reference.rb +39 -48
  138. data/lib/solargraph/pin/search.rb +61 -58
  139. data/lib/solargraph/pin/signature.rb +61 -61
  140. data/lib/solargraph/pin/symbol.rb +53 -53
  141. data/lib/solargraph/pin/until.rb +18 -18
  142. data/lib/solargraph/pin/while.rb +18 -18
  143. data/lib/solargraph/pin.rb +44 -44
  144. data/lib/solargraph/pin_cache.rb +245 -245
  145. data/lib/solargraph/position.rb +132 -118
  146. data/lib/solargraph/range.rb +112 -108
  147. data/lib/solargraph/rbs_map/conversions.rb +823 -802
  148. data/lib/solargraph/rbs_map/core_fills.rb +84 -66
  149. data/lib/solargraph/rbs_map/core_map.rb +58 -54
  150. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  151. data/lib/solargraph/rbs_map.rb +163 -163
  152. data/lib/solargraph/server_methods.rb +16 -16
  153. data/lib/solargraph/shell.rb +363 -271
  154. data/lib/solargraph/source/chain/array.rb +37 -37
  155. data/lib/solargraph/source/chain/call.rb +337 -333
  156. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  157. data/lib/solargraph/source/chain/constant.rb +26 -89
  158. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  159. data/lib/solargraph/source/chain/hash.rb +34 -34
  160. data/lib/solargraph/source/chain/if.rb +28 -28
  161. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/link.rb +109 -109
  163. data/lib/solargraph/source/chain/literal.rb +48 -48
  164. data/lib/solargraph/source/chain/or.rb +23 -23
  165. data/lib/solargraph/source/chain/q_call.rb +11 -11
  166. data/lib/solargraph/source/chain/variable.rb +13 -13
  167. data/lib/solargraph/source/chain/z_super.rb +30 -30
  168. data/lib/solargraph/source/chain.rb +291 -289
  169. data/lib/solargraph/source/change.rb +82 -82
  170. data/lib/solargraph/source/cursor.rb +166 -166
  171. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  172. data/lib/solargraph/source/source_chainer.rb +194 -194
  173. data/lib/solargraph/source/updater.rb +55 -55
  174. data/lib/solargraph/source.rb +498 -498
  175. data/lib/solargraph/source_map/clip.rb +226 -234
  176. data/lib/solargraph/source_map/data.rb +34 -34
  177. data/lib/solargraph/source_map/mapper.rb +259 -261
  178. data/lib/solargraph/source_map.rb +212 -207
  179. data/lib/solargraph/type_checker/checks.rb +124 -124
  180. data/lib/solargraph/type_checker/param_def.rb +37 -37
  181. data/lib/solargraph/type_checker/problem.rb +32 -32
  182. data/lib/solargraph/type_checker/rules.rb +84 -70
  183. data/lib/solargraph/type_checker.rb +814 -752
  184. data/lib/solargraph/version.rb +5 -5
  185. data/lib/solargraph/workspace/config.rb +255 -237
  186. data/lib/solargraph/workspace/require_paths.rb +97 -98
  187. data/lib/solargraph/workspace.rb +220 -225
  188. data/lib/solargraph/yard_map/helpers.rb +44 -44
  189. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -129
  190. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
  191. data/lib/solargraph/yard_map/mapper.rb +79 -79
  192. data/lib/solargraph/yard_map/to_method.rb +89 -88
  193. data/lib/solargraph/yard_tags.rb +20 -20
  194. data/lib/solargraph/yardoc.rb +87 -64
  195. data/lib/solargraph.rb +105 -105
  196. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  197. data/rbs/fills/open3/0/open3.rbs +172 -0
  198. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  199. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  200. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  201. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  204. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  205. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  206. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  207. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  208. data/rbs_collection.yaml +4 -4
  209. data/solargraph.gemspec +15 -4
  210. metadata +71 -16
  211. data/lib/solargraph/parser/node_methods.rb +0 -97
  212. /data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  215. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  216. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,292 +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
- # @sg-ignore
40
- elsif method_name == :alias_method && node.children[2] && node.children[2] && node.children[2].type == :sym && node.children[3] && node.children[3].type == :sym
41
- process_alias_method
42
- # @sg-ignore
43
- elsif method_name == :private_class_method && node.children[2].is_a?(AST::Node)
44
- # Processing a private class can potentially handle children on its own
45
- return if process_private_class_method
46
- end
47
- # @sg-ignore
48
- elsif method_name == :require && node.children[0].to_s == '(const nil :Bundler)'
49
- pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require', source: :parser)
50
- end
51
- process_children
52
- end
53
-
54
- private
55
-
56
- # @return [void]
57
- def process_visibility
58
- if (node.children.length > 2)
59
- node.children[2..-1].each do |child|
60
- # @sg-ignore Variable type could not be inferred for method_name
61
- # @type [Symbol]
62
- visibility = node.children[1]
63
- # :nocov:
64
- unless visibility.instance_of?(Symbol)
65
- Solargraph.assert_or_log(:parser_visibility, "Expected visibility name to be a Symbol, got #{visibility.class} for node #{node.inspect}")
66
- return process_children
67
- end
68
- # :nocov:
69
- if child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
70
- name = child.children[0].to_s
71
- 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)}
72
- matches.each do |pin|
73
- # @todo Smelly instance variable access
74
- pin.instance_variable_set(:@visibility, visibility)
75
- end
76
- else
77
- process_children region.update(visibility: visibility)
78
- end
79
- end
80
- else
81
- # @todo Smelly instance variable access
82
- region.instance_variable_set(:@visibility, node.children[1])
83
- end
84
- end
85
-
86
- # @return [void]
87
- def process_attribute
88
- node.children[2..-1].each do |a|
89
- loc = get_node_location(node)
90
- clos = region.closure
91
- cmnt = comments_for(node)
92
- if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
93
- pins.push Solargraph::Pin::Method.new(
94
- location: loc,
95
- closure: clos,
96
- name: a.children[0].to_s,
97
- comments: cmnt,
98
- scope: region.scope || :instance,
99
- visibility: region.visibility,
100
- attribute: true,
101
- source: :parser
102
- )
103
- end
104
- if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
105
- method_pin = Solargraph::Pin::Method.new(
106
- location: loc,
107
- closure: clos,
108
- name: "#{a.children[0]}=",
109
- comments: cmnt,
110
- scope: region.scope || :instance,
111
- visibility: region.visibility,
112
- attribute: true,
113
- source: :parser
114
- )
115
- pins.push method_pin
116
- method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last, source: :parser)
117
- if method_pin.return_type.defined?
118
- pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
119
- end
120
- end
121
- end
122
- end
123
-
124
- # @return [void]
125
- def process_include
126
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
127
- cp = region.closure
128
- node.children[2..-1].each do |i|
129
- type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
130
- pins.push type.new(
131
- location: get_node_location(i),
132
- closure: cp,
133
- name: unpack_name(i),
134
- source: :parser
135
- )
136
- end
137
- end
138
- end
139
-
140
- # @return [void]
141
- def process_prepend
142
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
143
- cp = region.closure
144
- node.children[2..-1].each do |i|
145
- pins.push Pin::Reference::Prepend.new(
146
- location: get_node_location(i),
147
- closure: cp,
148
- name: unpack_name(i),
149
- source: :parser
150
- )
151
- end
152
- end
153
- end
154
-
155
- # @return [void]
156
- def process_extend
157
- node.children[2..-1].each do |i|
158
- loc = get_node_location(node)
159
- if i.type == :self
160
- pins.push Pin::Reference::Extend.new(
161
- location: loc,
162
- closure: region.closure,
163
- name: region.closure.full_context.namespace,
164
- source: :parser
165
- )
166
- else
167
- pins.push Pin::Reference::Extend.new(
168
- location: loc,
169
- closure: region.closure,
170
- name: unpack_name(i),
171
- source: :parser
172
- )
173
- end
174
- end
175
- end
176
-
177
- # @return [void]
178
- def process_require
179
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
180
- path = node.children[2].children[0].to_s
181
- pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
182
- end
183
- end
184
-
185
- # @return [void]
186
- def process_autoload
187
- if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
188
- path = node.children[3].children[0].to_s
189
- pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
190
- end
191
- end
192
-
193
- # @return [void]
194
- def process_module_function
195
- if node.children[2].nil?
196
- # @todo Smelly instance variable access
197
- region.instance_variable_set(:@visibility, :module_function)
198
- elsif node.children[2].type == :sym || node.children[2].type == :str
199
- node.children[2..-1].each do |x|
200
- cn = x.children[0].to_s
201
- # @type [Pin::Method]
202
- ref = pins.find { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }
203
- unless ref.nil?
204
- pins.delete ref
205
- mm = Solargraph::Pin::Method.new(
206
- location: ref.location,
207
- closure: ref.closure,
208
- name: ref.name,
209
- parameters: ref.parameters,
210
- comments: ref.comments,
211
- scope: :class,
212
- visibility: :public,
213
- node: ref.node,
214
- source: :parser
215
- )
216
- cm = Solargraph::Pin::Method.new(
217
- location: ref.location,
218
- closure: ref.closure,
219
- name: ref.name,
220
- parameters: ref.parameters,
221
- comments: ref.comments,
222
- scope: :instance,
223
- visibility: :private,
224
- node: ref.node,
225
- source: :parser)
226
- pins.push mm, cm
227
- pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
228
- pins.delete ivar
229
- pins.push Solargraph::Pin::InstanceVariable.new(
230
- location: ivar.location,
231
- closure: cm,
232
- name: ivar.name,
233
- comments: ivar.comments,
234
- assignment: ivar.assignment,
235
- source: :parser
236
- )
237
- pins.push Solargraph::Pin::InstanceVariable.new(
238
- location: ivar.location,
239
- closure: mm,
240
- name: ivar.name,
241
- comments: ivar.comments,
242
- assignment: ivar.assignment,
243
- source: :parser
244
- )
245
- end
246
- end
247
- end
248
- elsif node.children[2].type == :def
249
- NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals
250
- end
251
- end
252
-
253
- # @return [void]
254
- def process_private_constant
255
- if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
256
- cn = node.children[2].children[0].to_s
257
- ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn}.first
258
- # HACK: Smelly instance variable access
259
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
260
- end
261
- end
262
-
263
- # @return [void]
264
- def process_alias_method
265
- loc = get_node_location(node)
266
- pins.push Solargraph::Pin::MethodAlias.new(
267
- location: get_node_location(node),
268
- closure: region.closure,
269
- name: node.children[2].children[0].to_s,
270
- original: node.children[3].children[0].to_s,
271
- scope: region.scope || :instance,
272
- source: :parser
273
- )
274
- end
275
-
276
- # @return [Boolean]
277
- def process_private_class_method
278
- if node.children[2].type == :sym || node.children[2].type == :str
279
- 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
280
- # HACK: Smelly instance variable access
281
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
282
- false
283
- else
284
- process_children region.update(scope: :class, visibility: :private)
285
- true
286
- end
287
- end
288
- end
289
- end
290
- end
291
- end
292
- 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