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