solargraph 0.46.0 → 0.54.5

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/plugins.yml +40 -0
  4. data/.github/workflows/rspec.yml +37 -41
  5. data/.github/workflows/typecheck.yml +34 -0
  6. data/.gitignore +9 -9
  7. data/.rspec +2 -2
  8. data/.yardopts +2 -2
  9. data/CHANGELOG.md +1338 -1115
  10. data/Gemfile +0 -0
  11. data/LICENSE +1 -1
  12. data/README.md +131 -128
  13. data/Rakefile +0 -0
  14. data/SPONSORS.md +10 -18
  15. data/bin/solargraph +0 -0
  16. data/lib/solargraph/api_map/cache.rb +109 -70
  17. data/lib/solargraph/api_map/index.rb +167 -0
  18. data/lib/solargraph/api_map/source_to_yard.rb +88 -81
  19. data/lib/solargraph/api_map/store.rb +260 -256
  20. data/lib/solargraph/api_map.rb +870 -686
  21. data/lib/solargraph/bench.rb +44 -27
  22. data/lib/solargraph/cache.rb +77 -0
  23. data/lib/solargraph/complex_type/type_methods.rb +217 -130
  24. data/lib/solargraph/complex_type/unique_type.rb +386 -75
  25. data/lib/solargraph/complex_type.rb +394 -221
  26. data/lib/solargraph/convention/base.rb +33 -33
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +22 -22
  29. data/lib/solargraph/convention/rakefile.rb +17 -0
  30. data/lib/solargraph/convention.rb +47 -47
  31. data/lib/solargraph/converters/dd.rb +17 -12
  32. data/lib/solargraph/converters/dl.rb +15 -12
  33. data/lib/solargraph/converters/dt.rb +15 -12
  34. data/lib/solargraph/converters/misc.rb +1 -1
  35. data/lib/solargraph/diagnostics/base.rb +29 -29
  36. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  37. data/lib/solargraph/diagnostics/rubocop.rb +113 -98
  38. data/lib/solargraph/diagnostics/rubocop_helpers.rb +66 -63
  39. data/lib/solargraph/diagnostics/severities.rb +15 -15
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -54
  41. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  42. data/lib/solargraph/diagnostics.rb +55 -55
  43. data/lib/solargraph/doc_map.rb +188 -0
  44. data/lib/solargraph/environ.rb +45 -45
  45. data/lib/solargraph/equality.rb +33 -0
  46. data/lib/solargraph/gem_pins.rb +72 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  48. data/lib/solargraph/language_server/error_codes.rb +20 -20
  49. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  50. data/lib/solargraph/language_server/host/dispatch.rb +128 -111
  51. data/lib/solargraph/language_server/host/message_worker.rb +106 -59
  52. data/lib/solargraph/language_server/host/sources.rb +99 -156
  53. data/lib/solargraph/language_server/host.rb +861 -865
  54. data/lib/solargraph/language_server/message/base.rb +96 -89
  55. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  57. data/lib/solargraph/language_server/message/client.rb +11 -11
  58. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -58
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  60. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +112 -100
  62. data/lib/solargraph/language_server/message/extended/document.rb +20 -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 -23
  65. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  66. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  67. data/lib/solargraph/language_server/message/extended.rb +21 -21
  68. data/lib/solargraph/language_server/message/initialize.rb +191 -162
  69. data/lib/solargraph/language_server/message/initialized.rb +28 -27
  70. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  71. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  72. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  73. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  74. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  75. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
  76. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  77. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  78. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  79. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  80. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  81. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  82. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
  83. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  84. data/lib/solargraph/language_server/message/text_document/formatting.rb +131 -126
  85. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -54
  86. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  87. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  88. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  89. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  90. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -29
  91. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  92. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -30
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -33
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  97. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  98. data/lib/solargraph/language_server/message.rb +94 -93
  99. data/lib/solargraph/language_server/message_types.rb +14 -14
  100. data/lib/solargraph/language_server/progress.rb +135 -0
  101. data/lib/solargraph/language_server/request.rb +24 -24
  102. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  103. data/lib/solargraph/language_server/transport/adapter.rb +68 -53
  104. data/lib/solargraph/language_server/transport/data_reader.rb +74 -72
  105. data/lib/solargraph/language_server/transport.rb +13 -13
  106. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  107. data/lib/solargraph/language_server.rb +20 -19
  108. data/lib/solargraph/library.rb +663 -546
  109. data/lib/solargraph/location.rb +58 -37
  110. data/lib/solargraph/logging.rb +27 -27
  111. data/lib/solargraph/page.rb +89 -83
  112. data/lib/solargraph/parser/comment_ripper.rb +56 -52
  113. data/lib/solargraph/parser/node_methods.rb +83 -43
  114. data/lib/solargraph/parser/node_processor/base.rb +87 -77
  115. data/lib/solargraph/parser/node_processor.rb +45 -43
  116. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +153 -135
  117. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +18 -16
  118. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +164 -148
  119. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  120. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +23 -23
  121. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
  122. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
  123. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +43 -42
  124. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +35 -25
  125. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +23 -23
  126. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +50 -63
  127. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +36 -36
  128. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +23 -23
  129. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +38 -38
  130. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +28 -28
  131. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
  132. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +39 -39
  133. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +16 -16
  134. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +36 -36
  135. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
  136. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +259 -257
  137. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +18 -18
  138. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  139. data/lib/solargraph/parser/parser_gem.rb +12 -0
  140. data/lib/solargraph/parser/region.rb +66 -66
  141. data/lib/solargraph/parser/snippet.rb +15 -13
  142. data/lib/solargraph/parser.rb +22 -26
  143. data/lib/solargraph/pin/base.rb +378 -296
  144. data/lib/solargraph/pin/base_variable.rb +118 -84
  145. data/lib/solargraph/pin/block.rb +101 -72
  146. data/lib/solargraph/pin/callable.rb +147 -0
  147. data/lib/solargraph/pin/class_variable.rb +8 -8
  148. data/lib/solargraph/pin/closure.rb +57 -37
  149. data/lib/solargraph/pin/common.rb +70 -70
  150. data/lib/solargraph/pin/constant.rb +43 -43
  151. data/lib/solargraph/pin/conversions.rb +123 -96
  152. data/lib/solargraph/pin/delegated_method.rb +101 -0
  153. data/lib/solargraph/pin/documenting.rb +98 -105
  154. data/lib/solargraph/pin/duck_method.rb +16 -16
  155. data/lib/solargraph/pin/global_variable.rb +8 -8
  156. data/lib/solargraph/pin/instance_variable.rb +34 -30
  157. data/lib/solargraph/pin/keyword.rb +15 -15
  158. data/lib/solargraph/pin/keyword_param.rb +8 -8
  159. data/lib/solargraph/pin/local_variable.rb +67 -55
  160. data/lib/solargraph/pin/method.rb +527 -245
  161. data/lib/solargraph/pin/method_alias.rb +31 -31
  162. data/lib/solargraph/pin/namespace.rb +107 -91
  163. data/lib/solargraph/pin/parameter.rb +212 -201
  164. data/lib/solargraph/pin/proxy_type.rb +29 -29
  165. data/lib/solargraph/pin/reference/extend.rb +10 -10
  166. data/lib/solargraph/pin/reference/include.rb +10 -10
  167. data/lib/solargraph/pin/reference/override.rb +29 -29
  168. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  169. data/lib/solargraph/pin/reference/require.rb +14 -14
  170. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  171. data/lib/solargraph/pin/reference.rb +22 -14
  172. data/lib/solargraph/pin/search.rb +56 -56
  173. data/lib/solargraph/pin/signature.rb +17 -0
  174. data/lib/solargraph/pin/singleton.rb +11 -11
  175. data/lib/solargraph/pin/symbol.rb +47 -47
  176. data/lib/solargraph/pin.rb +41 -37
  177. data/lib/solargraph/position.rb +107 -100
  178. data/lib/solargraph/range.rb +98 -95
  179. data/lib/solargraph/rbs_map/conversions.rb +646 -0
  180. data/lib/solargraph/rbs_map/core_fills.rb +50 -0
  181. data/lib/solargraph/rbs_map/core_map.rb +28 -0
  182. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
  183. data/lib/solargraph/rbs_map.rb +93 -0
  184. data/lib/solargraph/server_methods.rb +16 -16
  185. data/lib/solargraph/shell.rb +269 -226
  186. data/lib/solargraph/source/chain/array.rb +33 -0
  187. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  188. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  189. data/lib/solargraph/source/chain/call.rb +303 -204
  190. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  191. data/lib/solargraph/source/chain/constant.rb +89 -75
  192. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  193. data/lib/solargraph/source/chain/hash.rb +33 -28
  194. data/lib/solargraph/source/chain/head.rb +19 -19
  195. data/lib/solargraph/source/chain/if.rb +28 -0
  196. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  197. data/lib/solargraph/source/chain/link.rb +98 -71
  198. data/lib/solargraph/source/chain/literal.rb +28 -23
  199. data/lib/solargraph/source/chain/or.rb +23 -23
  200. data/lib/solargraph/source/chain/q_call.rb +11 -11
  201. data/lib/solargraph/source/chain/variable.rb +13 -13
  202. data/lib/solargraph/source/chain/z_super.rb +30 -30
  203. data/lib/solargraph/source/chain.rb +252 -164
  204. data/lib/solargraph/source/change.rb +82 -79
  205. data/lib/solargraph/source/cursor.rb +167 -164
  206. data/lib/solargraph/source/source_chainer.rb +194 -191
  207. data/lib/solargraph/source/updater.rb +55 -54
  208. data/lib/solargraph/source.rb +495 -522
  209. data/lib/solargraph/source_map/clip.rb +232 -224
  210. data/lib/solargraph/source_map/completion.rb +23 -23
  211. data/lib/solargraph/source_map/data.rb +30 -0
  212. data/lib/solargraph/source_map/mapper.rb +255 -212
  213. data/lib/solargraph/source_map.rb +217 -180
  214. data/lib/solargraph/type_checker/checks.rb +120 -99
  215. data/lib/solargraph/type_checker/param_def.rb +35 -35
  216. data/lib/solargraph/type_checker/problem.rb +32 -32
  217. data/lib/solargraph/type_checker/rules.rb +62 -57
  218. data/lib/solargraph/type_checker.rb +672 -543
  219. data/lib/solargraph/version.rb +5 -5
  220. data/lib/solargraph/views/environment.erb +56 -58
  221. data/lib/solargraph/workspace/config.rb +239 -231
  222. data/lib/solargraph/workspace.rb +239 -215
  223. data/lib/solargraph/yard_map/cache.rb +25 -19
  224. data/lib/solargraph/yard_map/helpers.rb +16 -16
  225. data/lib/solargraph/yard_map/mapper/to_constant.rb +26 -25
  226. data/lib/solargraph/yard_map/mapper/to_method.rb +94 -78
  227. data/lib/solargraph/yard_map/mapper/to_namespace.rb +28 -27
  228. data/lib/solargraph/yard_map/mapper.rb +78 -77
  229. data/lib/solargraph/yard_map/to_method.rb +86 -79
  230. data/lib/solargraph/yard_map.rb +18 -460
  231. data/lib/solargraph/yard_tags.rb +20 -0
  232. data/lib/solargraph/yardoc.rb +52 -0
  233. data/lib/solargraph.rb +72 -69
  234. data/solargraph.gemspec +21 -10
  235. metadata +184 -115
  236. data/.travis.yml +0 -19
  237. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  238. data/lib/solargraph/compat.rb +0 -37
  239. data/lib/solargraph/convention/rspec.rb +0 -30
  240. data/lib/solargraph/documentor.rb +0 -76
  241. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  242. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  243. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  244. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  245. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  246. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
  247. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
  248. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  249. data/lib/solargraph/parser/legacy.rb +0 -12
  250. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
  251. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  252. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  253. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  254. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  255. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
  256. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  257. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
  258. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  259. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  260. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  261. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  262. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  263. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  264. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  265. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  266. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  267. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
  268. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  269. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
  270. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
  271. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  272. data/lib/solargraph/parser/rubyvm.rb +0 -40
  273. data/lib/solargraph/yard_map/core_docs.rb +0 -170
  274. data/lib/solargraph/yard_map/core_fills.rb +0 -208
  275. data/lib/solargraph/yard_map/core_gen.rb +0 -76
  276. data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
  277. data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
  278. data/lib/yard-solargraph.rb +0 -33
  279. data/yardoc/2.2.2.tar.gz +0 -0
@@ -1,257 +1,259 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- module NodeProcessors
7
- class SendNode < Parser::NodeProcessor::Base
8
- include Legacy::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
- pins.push 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.last.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
93
- if pins.last.return_type.defined?
94
- pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '), 'value')
95
- end
96
- end
97
- end
98
- end
99
-
100
- # @return [void]
101
- def process_include
102
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
103
- cp = region.closure
104
- node.children[2..-1].each do |i|
105
- type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
106
- pins.push type.new(
107
- location: get_node_location(i),
108
- closure: cp,
109
- name: unpack_name(i)
110
- )
111
- end
112
- end
113
- end
114
-
115
- def process_prepend
116
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
117
- cp = region.closure
118
- node.children[2..-1].each do |i|
119
- pins.push Pin::Reference::Prepend.new(
120
- location: get_node_location(i),
121
- closure: cp,
122
- name: unpack_name(i)
123
- )
124
- end
125
- end
126
- end
127
-
128
- # @return [void]
129
- def process_extend
130
- node.children[2..-1].each do |i|
131
- loc = get_node_location(node)
132
- if i.type == :self
133
- pins.push Pin::Reference::Extend.new(
134
- location: loc,
135
- closure: region.closure,
136
- name: region.closure.full_context.namespace
137
- )
138
- else
139
- pins.push Pin::Reference::Extend.new(
140
- location: loc,
141
- closure: region.closure,
142
- name: unpack_name(i)
143
- )
144
- end
145
- end
146
- end
147
-
148
- # @return [void]
149
- def process_require
150
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
151
- path = node.children[2].children[0].to_s
152
- pins.push Pin::Reference::Require.new(get_node_location(node), path)
153
- end
154
- end
155
-
156
- # @return [void]
157
- def process_autoload
158
- if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
159
- path = node.children[3].children[0].to_s
160
- pins.push Pin::Reference::Require.new(get_node_location(node), path)
161
- end
162
- end
163
-
164
- # @return [void]
165
- def process_module_function
166
- if node.children[2].nil?
167
- # @todo Smelly instance variable access
168
- region.instance_variable_set(:@visibility, :module_function)
169
- elsif node.children[2].type == :sym || node.children[2].type == :str
170
- node.children[2..-1].each do |x|
171
- cn = x.children[0].to_s
172
- ref = pins.select{ |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }.first
173
- unless ref.nil?
174
- pins.delete ref
175
- mm = Solargraph::Pin::Method.new(
176
- location: ref.location,
177
- closure: ref.closure,
178
- name: ref.name,
179
- parameters: ref.parameters,
180
- comments: ref.comments,
181
- scope: :class,
182
- visibility: :public,
183
- node: ref.node
184
- )
185
- cm = Solargraph::Pin::Method.new(
186
- location: ref.location,
187
- closure: ref.closure,
188
- name: ref.name,
189
- parameters: ref.parameters,
190
- comments: ref.comments,
191
- scope: :instance,
192
- visibility: :private,
193
- node: ref.node)
194
- pins.push mm, cm
195
- pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
196
- pins.delete ivar
197
- pins.push Solargraph::Pin::InstanceVariable.new(
198
- location: ivar.location,
199
- closure: cm,
200
- name: ivar.name,
201
- comments: ivar.comments,
202
- assignment: ivar.assignment
203
- )
204
- pins.push Solargraph::Pin::InstanceVariable.new(
205
- location: ivar.location,
206
- closure: mm,
207
- name: ivar.name,
208
- comments: ivar.comments,
209
- assignment: ivar.assignment
210
- )
211
- end
212
- end
213
- end
214
- elsif node.children[2].type == :def
215
- NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals
216
- end
217
- end
218
-
219
- # @return [void]
220
- def process_private_constant
221
- if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
222
- cn = node.children[2].children[0].to_s
223
- ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn}.first
224
- # HACK: Smelly instance variable access
225
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
226
- end
227
- end
228
-
229
- # @return [void]
230
- def process_alias_method
231
- loc = get_node_location(node)
232
- pins.push Solargraph::Pin::MethodAlias.new(
233
- location: get_node_location(node),
234
- closure: region.closure,
235
- name: node.children[2].children[0].to_s,
236
- original: node.children[3].children[0].to_s,
237
- scope: region.scope || :instance
238
- )
239
- end
240
-
241
- # @return [Boolean]
242
- def process_private_class_method
243
- if node.children[2].type == :sym || node.children[2].type == :str
244
- 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
245
- # HACK: Smelly instance variable access
246
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
247
- false
248
- else
249
- process_children region.update(scope: :class, visibility: :private)
250
- true
251
- end
252
- end
253
- end
254
- end
255
- end
256
- end
257
- 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
+ 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,18 +1,18 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- module NodeProcessors
7
- class SymNode < Parser::NodeProcessor::Base
8
- def process
9
- pins.push Solargraph::Pin::Symbol.new(
10
- get_node_location(node),
11
- ":#{node.children[0]}"
12
- )
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class SymNode < Parser::NodeProcessor::Base
8
+ def process
9
+ pins.push Solargraph::Pin::Symbol.new(
10
+ get_node_location(node),
11
+ ":#{node.children[0]}"
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solargraph/parser/node_processor'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module ParserGem
8
+ module NodeProcessors
9
+ autoload :BeginNode, 'solargraph/parser/parser_gem/node_processors/begin_node'
10
+ autoload :DefNode, 'solargraph/parser/parser_gem/node_processors/def_node'
11
+ autoload :DefsNode, 'solargraph/parser/parser_gem/node_processors/defs_node'
12
+ autoload :SendNode, 'solargraph/parser/parser_gem/node_processors/send_node'
13
+ autoload :NamespaceNode, 'solargraph/parser/parser_gem/node_processors/namespace_node'
14
+ autoload :SclassNode, 'solargraph/parser/parser_gem/node_processors/sclass_node'
15
+ autoload :IvasgnNode, 'solargraph/parser/parser_gem/node_processors/ivasgn_node'
16
+ autoload :CvasgnNode, 'solargraph/parser/parser_gem/node_processors/cvasgn_node'
17
+ autoload :LvasgnNode, 'solargraph/parser/parser_gem/node_processors/lvasgn_node'
18
+ autoload :GvasgnNode, 'solargraph/parser/parser_gem/node_processors/gvasgn_node'
19
+ autoload :CasgnNode, 'solargraph/parser/parser_gem/node_processors/casgn_node'
20
+ autoload :MasgnNode, 'solargraph/parser/parser_gem/node_processors/masgn_node'
21
+ autoload :AliasNode, 'solargraph/parser/parser_gem/node_processors/alias_node'
22
+ autoload :ArgsNode, 'solargraph/parser/parser_gem/node_processors/args_node'
23
+ autoload :BlockNode, 'solargraph/parser/parser_gem/node_processors/block_node'
24
+ autoload :OrasgnNode, 'solargraph/parser/parser_gem/node_processors/orasgn_node'
25
+ autoload :SymNode, 'solargraph/parser/parser_gem/node_processors/sym_node'
26
+ autoload :ResbodyNode, 'solargraph/parser/parser_gem/node_processors/resbody_node'
27
+ end
28
+ end
29
+
30
+ module NodeProcessor
31
+ register :source, ParserGem::NodeProcessors::BeginNode
32
+ register :begin, ParserGem::NodeProcessors::BeginNode
33
+ register :kwbegin, ParserGem::NodeProcessors::BeginNode
34
+ register :rescue, ParserGem::NodeProcessors::BeginNode
35
+ register :resbody, ParserGem::NodeProcessors::ResbodyNode
36
+ register :def, ParserGem::NodeProcessors::DefNode
37
+ register :defs, ParserGem::NodeProcessors::DefsNode
38
+ register :send, ParserGem::NodeProcessors::SendNode
39
+ register :class, ParserGem::NodeProcessors::NamespaceNode
40
+ register :module, ParserGem::NodeProcessors::NamespaceNode
41
+ register :sclass, ParserGem::NodeProcessors::SclassNode
42
+ register :ivasgn, ParserGem::NodeProcessors::IvasgnNode
43
+ register :cvasgn, ParserGem::NodeProcessors::CvasgnNode
44
+ register :lvasgn, ParserGem::NodeProcessors::LvasgnNode
45
+ register :gvasgn, ParserGem::NodeProcessors::GvasgnNode
46
+ register :casgn, ParserGem::NodeProcessors::CasgnNode
47
+ register :masgn, ParserGem::NodeProcessors::MasgnNode
48
+ register :alias, ParserGem::NodeProcessors::AliasNode
49
+ register :args, ParserGem::NodeProcessors::ArgsNode
50
+ register :forward_args, ParserGem::NodeProcessors::ArgsNode
51
+ register :block, ParserGem::NodeProcessors::BlockNode
52
+ register :or_asgn, ParserGem::NodeProcessors::OrasgnNode
53
+ register :sym, ParserGem::NodeProcessors::SymNode
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,12 @@
1
+ module Solargraph
2
+ module Parser
3
+ module ParserGem
4
+ autoload :FlawedBuilder, 'solargraph/parser/parser_gem/flawed_builder'
5
+ autoload :ClassMethods, 'solargraph/parser/parser_gem/class_methods'
6
+ autoload :NodeMethods, 'solargraph/parser/parser_gem/node_methods'
7
+ autoload :NodeChainer, 'solargraph/parser/parser_gem/node_chainer'
8
+ end
9
+ end
10
+ end
11
+
12
+ require 'solargraph/parser/parser_gem/node_processors'