cosmicgraph 0.49.0

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 (259) hide show
  1. checksums.yaml +7 -0
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/rspec.yml +41 -0
  4. data/.gitignore +9 -0
  5. data/.rspec +2 -0
  6. data/.yardopts +2 -0
  7. data/CHANGELOG.md +1150 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE +21 -0
  10. data/README.md +136 -0
  11. data/Rakefile +25 -0
  12. data/SPONSORS.md +15 -0
  13. data/bin/solargraph +5 -0
  14. data/cosmicgraph.gemspec +44 -0
  15. data/lib/.rubocop.yml +22 -0
  16. data/lib/solargraph/api_map/bundler_methods.rb +22 -0
  17. data/lib/solargraph/api_map/cache.rb +70 -0
  18. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  19. data/lib/solargraph/api_map/store.rb +268 -0
  20. data/lib/solargraph/api_map.rb +704 -0
  21. data/lib/solargraph/bench.rb +27 -0
  22. data/lib/solargraph/cache.rb +51 -0
  23. data/lib/solargraph/complex_type/type_methods.rb +134 -0
  24. data/lib/solargraph/complex_type/unique_type.rb +132 -0
  25. data/lib/solargraph/complex_type.rb +254 -0
  26. data/lib/solargraph/convention/base.rb +33 -0
  27. data/lib/solargraph/convention/gemfile.rb +15 -0
  28. data/lib/solargraph/convention/gemspec.rb +22 -0
  29. data/lib/solargraph/convention/rakefile.rb +17 -0
  30. data/lib/solargraph/convention/rspec.rb +30 -0
  31. data/lib/solargraph/convention.rb +49 -0
  32. data/lib/solargraph/converters/dd.rb +12 -0
  33. data/lib/solargraph/converters/dl.rb +12 -0
  34. data/lib/solargraph/converters/dt.rb +12 -0
  35. data/lib/solargraph/converters/misc.rb +1 -0
  36. data/lib/solargraph/diagnostics/base.rb +29 -0
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -0
  38. data/lib/solargraph/diagnostics/rubocop.rb +112 -0
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +65 -0
  40. data/lib/solargraph/diagnostics/severities.rb +15 -0
  41. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  42. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  43. data/lib/solargraph/diagnostics.rb +55 -0
  44. data/lib/solargraph/documentor.rb +76 -0
  45. data/lib/solargraph/environ.rb +45 -0
  46. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  47. data/lib/solargraph/language_server/error_codes.rb +20 -0
  48. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  49. data/lib/solargraph/language_server/host/diagnoser.rb +89 -0
  50. data/lib/solargraph/language_server/host/dispatch.rb +111 -0
  51. data/lib/solargraph/language_server/host/message_worker.rb +59 -0
  52. data/lib/solargraph/language_server/host/sources.rb +156 -0
  53. data/lib/solargraph/language_server/host.rb +869 -0
  54. data/lib/solargraph/language_server/message/base.rb +89 -0
  55. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  57. data/lib/solargraph/language_server/message/client.rb +11 -0
  58. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -0
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  60. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -0
  62. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  63. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  64. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -0
  65. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  66. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  67. data/lib/solargraph/language_server/message/extended.rb +21 -0
  68. data/lib/solargraph/language_server/message/initialize.rb +164 -0
  69. data/lib/solargraph/language_server/message/initialized.rb +27 -0
  70. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  71. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  72. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  73. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  74. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  75. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -0
  76. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  77. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  78. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  79. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  80. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  81. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -0
  82. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  83. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  84. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -0
  85. data/lib/solargraph/language_server/message/text_document/hover.rb +56 -0
  86. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  87. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  88. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  89. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  90. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -0
  91. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  92. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -0
  93. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -0
  94. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  95. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  96. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  97. data/lib/solargraph/language_server/message.rb +93 -0
  98. data/lib/solargraph/language_server/message_types.rb +14 -0
  99. data/lib/solargraph/language_server/request.rb +24 -0
  100. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  101. data/lib/solargraph/language_server/transport/adapter.rb +53 -0
  102. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  103. data/lib/solargraph/language_server/transport.rb +13 -0
  104. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  105. data/lib/solargraph/language_server.rb +19 -0
  106. data/lib/solargraph/library.rb +547 -0
  107. data/lib/solargraph/location.rb +37 -0
  108. data/lib/solargraph/logging.rb +27 -0
  109. data/lib/solargraph/page.rb +83 -0
  110. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  111. data/lib/solargraph/parser/legacy/class_methods.rb +135 -0
  112. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  113. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -0
  114. data/lib/solargraph/parser/legacy/node_methods.rb +325 -0
  115. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  116. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  117. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  118. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -0
  119. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +35 -0
  120. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  121. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  122. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  123. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  124. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  125. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  126. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  127. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  128. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  129. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +42 -0
  130. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -0
  131. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  132. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  133. data/lib/solargraph/parser/legacy.rb +12 -0
  134. data/lib/solargraph/parser/node_methods.rb +43 -0
  135. data/lib/solargraph/parser/node_processor/base.rb +77 -0
  136. data/lib/solargraph/parser/node_processor.rb +43 -0
  137. data/lib/solargraph/parser/region.rb +66 -0
  138. data/lib/solargraph/parser/rubyvm/class_methods.rb +149 -0
  139. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -0
  140. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +33 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +75 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +68 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +32 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  160. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +279 -0
  161. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  162. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -0
  163. data/lib/solargraph/parser/rubyvm/node_wrapper.rb +47 -0
  164. data/lib/solargraph/parser/rubyvm.rb +40 -0
  165. data/lib/solargraph/parser/snippet.rb +13 -0
  166. data/lib/solargraph/parser.rb +26 -0
  167. data/lib/solargraph/pin/base.rb +299 -0
  168. data/lib/solargraph/pin/base_variable.rb +84 -0
  169. data/lib/solargraph/pin/block.rb +73 -0
  170. data/lib/solargraph/pin/class_variable.rb +8 -0
  171. data/lib/solargraph/pin/closure.rb +37 -0
  172. data/lib/solargraph/pin/common.rb +70 -0
  173. data/lib/solargraph/pin/constant.rb +43 -0
  174. data/lib/solargraph/pin/conversions.rb +92 -0
  175. data/lib/solargraph/pin/documenting.rb +105 -0
  176. data/lib/solargraph/pin/duck_method.rb +16 -0
  177. data/lib/solargraph/pin/global_variable.rb +8 -0
  178. data/lib/solargraph/pin/instance_variable.rb +30 -0
  179. data/lib/solargraph/pin/keyword.rb +15 -0
  180. data/lib/solargraph/pin/keyword_param.rb +8 -0
  181. data/lib/solargraph/pin/local_variable.rb +55 -0
  182. data/lib/solargraph/pin/method.rb +335 -0
  183. data/lib/solargraph/pin/method_alias.rb +31 -0
  184. data/lib/solargraph/pin/namespace.rb +94 -0
  185. data/lib/solargraph/pin/parameter.rb +206 -0
  186. data/lib/solargraph/pin/proxy_type.rb +29 -0
  187. data/lib/solargraph/pin/reference/extend.rb +10 -0
  188. data/lib/solargraph/pin/reference/include.rb +10 -0
  189. data/lib/solargraph/pin/reference/override.rb +29 -0
  190. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  191. data/lib/solargraph/pin/reference/require.rb +14 -0
  192. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  193. data/lib/solargraph/pin/reference.rb +14 -0
  194. data/lib/solargraph/pin/search.rb +56 -0
  195. data/lib/solargraph/pin/signature.rb +23 -0
  196. data/lib/solargraph/pin/singleton.rb +11 -0
  197. data/lib/solargraph/pin/symbol.rb +47 -0
  198. data/lib/solargraph/pin.rb +38 -0
  199. data/lib/solargraph/position.rb +100 -0
  200. data/lib/solargraph/range.rb +95 -0
  201. data/lib/solargraph/rbs_map/conversions.rb +394 -0
  202. data/lib/solargraph/rbs_map/core_fills.rb +61 -0
  203. data/lib/solargraph/rbs_map/core_map.rb +38 -0
  204. data/lib/solargraph/rbs_map/core_signs.rb +33 -0
  205. data/lib/solargraph/rbs_map/stdlib_map.rb +36 -0
  206. data/lib/solargraph/rbs_map.rb +73 -0
  207. data/lib/solargraph/server_methods.rb +16 -0
  208. data/lib/solargraph/shell.rb +234 -0
  209. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  210. data/lib/solargraph/source/chain/call.rb +215 -0
  211. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  212. data/lib/solargraph/source/chain/constant.rb +75 -0
  213. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  214. data/lib/solargraph/source/chain/hash.rb +28 -0
  215. data/lib/solargraph/source/chain/head.rb +19 -0
  216. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  217. data/lib/solargraph/source/chain/link.rb +71 -0
  218. data/lib/solargraph/source/chain/literal.rb +23 -0
  219. data/lib/solargraph/source/chain/or.rb +23 -0
  220. data/lib/solargraph/source/chain/q_call.rb +11 -0
  221. data/lib/solargraph/source/chain/variable.rb +13 -0
  222. data/lib/solargraph/source/chain/z_super.rb +30 -0
  223. data/lib/solargraph/source/chain.rb +179 -0
  224. data/lib/solargraph/source/change.rb +79 -0
  225. data/lib/solargraph/source/cursor.rb +164 -0
  226. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  227. data/lib/solargraph/source/source_chainer.rb +191 -0
  228. data/lib/solargraph/source/updater.rb +54 -0
  229. data/lib/solargraph/source.rb +522 -0
  230. data/lib/solargraph/source_map/clip.rb +229 -0
  231. data/lib/solargraph/source_map/completion.rb +23 -0
  232. data/lib/solargraph/source_map/mapper.rb +241 -0
  233. data/lib/solargraph/source_map.rb +180 -0
  234. data/lib/solargraph/type_checker/checks.rb +112 -0
  235. data/lib/solargraph/type_checker/param_def.rb +35 -0
  236. data/lib/solargraph/type_checker/problem.rb +32 -0
  237. data/lib/solargraph/type_checker/rules.rb +57 -0
  238. data/lib/solargraph/type_checker.rb +549 -0
  239. data/lib/solargraph/version.rb +5 -0
  240. data/lib/solargraph/views/_method.erb +62 -0
  241. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  242. data/lib/solargraph/views/_namespace.erb +24 -0
  243. data/lib/solargraph/views/document.erb +23 -0
  244. data/lib/solargraph/views/environment.erb +58 -0
  245. data/lib/solargraph/views/layout.erb +44 -0
  246. data/lib/solargraph/views/search.erb +11 -0
  247. data/lib/solargraph/workspace/config.rb +231 -0
  248. data/lib/solargraph/workspace.rb +212 -0
  249. data/lib/solargraph/yard_map/cache.rb +19 -0
  250. data/lib/solargraph/yard_map/helpers.rb +16 -0
  251. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
  252. data/lib/solargraph/yard_map/mapper/to_method.rb +81 -0
  253. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
  254. data/lib/solargraph/yard_map/mapper.rb +77 -0
  255. data/lib/solargraph/yard_map/to_method.rb +79 -0
  256. data/lib/solargraph/yard_map.rb +301 -0
  257. data/lib/solargraph.rb +69 -0
  258. data/lib/yard-solargraph.rb +33 -0
  259. metadata +587 -0
@@ -0,0 +1,257 @@
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
@@ -0,0 +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
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solargraph/parser/node_processor'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module Legacy
8
+ module NodeProcessors
9
+ autoload :BeginNode, 'solargraph/parser/legacy/node_processors/begin_node'
10
+ autoload :DefNode, 'solargraph/parser/legacy/node_processors/def_node'
11
+ autoload :DefsNode, 'solargraph/parser/legacy/node_processors/defs_node'
12
+ autoload :SendNode, 'solargraph/parser/legacy/node_processors/send_node'
13
+ autoload :NamespaceNode, 'solargraph/parser/legacy/node_processors/namespace_node'
14
+ autoload :SclassNode, 'solargraph/parser/legacy/node_processors/sclass_node'
15
+ autoload :ModuleNode, 'solargraph/parser/legacy/node_processors/module_node'
16
+ autoload :IvasgnNode, 'solargraph/parser/legacy/node_processors/ivasgn_node'
17
+ autoload :CvasgnNode, 'solargraph/parser/legacy/node_processors/cvasgn_node'
18
+ autoload :LvasgnNode, 'solargraph/parser/legacy/node_processors/lvasgn_node'
19
+ autoload :GvasgnNode, 'solargraph/parser/legacy/node_processors/gvasgn_node'
20
+ autoload :CasgnNode, 'solargraph/parser/legacy/node_processors/casgn_node'
21
+ autoload :AliasNode, 'solargraph/parser/legacy/node_processors/alias_node'
22
+ autoload :ArgsNode, 'solargraph/parser/legacy/node_processors/args_node'
23
+ autoload :BlockNode, 'solargraph/parser/legacy/node_processors/block_node'
24
+ autoload :OrasgnNode, 'solargraph/parser/legacy/node_processors/orasgn_node'
25
+ autoload :SymNode, 'solargraph/parser/legacy/node_processors/sym_node'
26
+ autoload :ResbodyNode, 'solargraph/parser/legacy/node_processors/resbody_node'
27
+ end
28
+ end
29
+
30
+ module NodeProcessor
31
+ register :source, Legacy::NodeProcessors::BeginNode
32
+ register :begin, Legacy::NodeProcessors::BeginNode
33
+ register :kwbegin, Legacy::NodeProcessors::BeginNode
34
+ register :rescue, Legacy::NodeProcessors::BeginNode
35
+ register :resbody, Legacy::NodeProcessors::ResbodyNode
36
+ register :def, Legacy::NodeProcessors::DefNode
37
+ register :defs, Legacy::NodeProcessors::DefsNode
38
+ register :send, Legacy::NodeProcessors::SendNode
39
+ register :class, Legacy::NodeProcessors::NamespaceNode
40
+ register :module, Legacy::NodeProcessors::NamespaceNode
41
+ register :sclass, Legacy::NodeProcessors::SclassNode
42
+ register :ivasgn, Legacy::NodeProcessors::IvasgnNode
43
+ register :cvasgn, Legacy::NodeProcessors::CvasgnNode
44
+ register :lvasgn, Legacy::NodeProcessors::LvasgnNode
45
+ register :gvasgn, Legacy::NodeProcessors::GvasgnNode
46
+ register :casgn, Legacy::NodeProcessors::CasgnNode
47
+ register :alias, Legacy::NodeProcessors::AliasNode
48
+ register :args, Legacy::NodeProcessors::ArgsNode
49
+ register :block, Legacy::NodeProcessors::BlockNode
50
+ register :or_asgn, Legacy::NodeProcessors::OrasgnNode
51
+ register :sym, Legacy::NodeProcessors::SymNode
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,12 @@
1
+ module Solargraph
2
+ module Parser
3
+ module Legacy
4
+ autoload :FlawedBuilder, 'solargraph/parser/legacy/flawed_builder'
5
+ autoload :ClassMethods, 'solargraph/parser/legacy/class_methods'
6
+ autoload :NodeMethods, 'solargraph/parser/legacy/node_methods'
7
+ autoload :NodeChainer, 'solargraph/parser/legacy/node_chainer'
8
+ end
9
+ end
10
+ end
11
+
12
+ require 'solargraph/parser/legacy/node_processors'
@@ -0,0 +1,43 @@
1
+ module Solargraph
2
+ module Parser
3
+ class NodeMethods
4
+ module_function
5
+
6
+ def unpack_name node
7
+ raise NotImplementedError
8
+ end
9
+
10
+ def infer_literal_type node
11
+ raise NotImplementedError
12
+ end
13
+
14
+ def calls_from node
15
+ raise NotImplementedError
16
+ end
17
+
18
+ def returns_from node
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def process node
23
+ raise NotImplementedError
24
+ end
25
+
26
+ def references node
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def chain node, filename = nil, in_block = false
31
+ raise NotImplementedError
32
+ end
33
+
34
+ def node? node
35
+ raise NotImplementedError
36
+ end
37
+
38
+ def convert_hash node
39
+ raise NotImplementedError
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module NodeProcessor
6
+ class Base
7
+ # @return [Parser::AST::Node]
8
+ attr_reader :node
9
+
10
+ # @return [Region]
11
+ attr_reader :region
12
+
13
+ # @return [Array<Pin::Base>]
14
+ attr_reader :pins
15
+
16
+ # @return [Array<Pin::Base>]
17
+ attr_reader :locals
18
+
19
+ # @param node [Parser::AST::Node]
20
+ # @param region [Region]
21
+ # @param pins [Array<Pin::Base>]
22
+ def initialize node, region, pins, locals
23
+ @node = node
24
+ @region = region
25
+ @pins = pins
26
+ @locals = locals
27
+ @processed_children = false
28
+ end
29
+
30
+ # Subclasses should override this method to generate new pins.
31
+ #
32
+ # @return [void]
33
+ def process
34
+ process_children
35
+ end
36
+
37
+ private
38
+
39
+ # @param subregion [Region]
40
+ # @return [void]
41
+ def process_children subregion = region
42
+ return if @processed_children
43
+ @processed_children = true
44
+ node.children.each do |child|
45
+ next unless Parser.is_ast_node?(child)
46
+ NodeProcessor.process(child, subregion, pins, locals)
47
+ end
48
+ end
49
+
50
+ # @param node [Parser::AST::Node]
51
+ # @return [Solargraph::Location]
52
+ def get_node_location(node)
53
+ range = Parser.node_range(node)
54
+ Location.new(region.filename, range)
55
+ end
56
+
57
+ def comments_for(node)
58
+ region.source.comments_for(node)
59
+ end
60
+
61
+ def named_path_pin position
62
+ pins.select{|pin| pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)}.last
63
+ end
64
+
65
+ # @todo Candidate for deprecation
66
+ def block_pin position
67
+ pins.select{|pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position)}.last
68
+ end
69
+
70
+ # @todo Candidate for deprecation
71
+ def closure_pin position
72
+ pins.select{|pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position)}.last
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ # The processor classes used by SourceMap::Mapper to generate pins from
6
+ # parser nodes.
7
+ #
8
+ module NodeProcessor
9
+ autoload :Base, 'solargraph/parser/node_processor/base'
10
+
11
+ class << self
12
+ @@processors ||= {}
13
+
14
+ # Register a processor for a node type.
15
+ #
16
+ # @param type [Symbol]
17
+ # @param cls [Class<NodeProcessor::Base>]
18
+ # @return [Class<NodeProcessor::Base>]
19
+ def register type, cls
20
+ @@processors[type] = cls
21
+ end
22
+ end
23
+
24
+ # @param node [Parser::AST::Node]
25
+ # @param region [Region]
26
+ # @param pins [Array<Pin::Base>]
27
+ # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
28
+ def self.process node, region = Region.new, pins = [], locals = []
29
+ if pins.empty?
30
+ pins.push Pin::Namespace.new(
31
+ location: region.source.location,
32
+ name: ''
33
+ )
34
+ end
35
+ return [pins, locals] unless Parser.is_ast_node?(node)
36
+ klass = @@processors[node.type] || NodeProcessor::Base
37
+ processor = klass.new(node, region, pins, locals)
38
+ processor.process
39
+ [processor.pins, processor.locals]
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ # Data used by the parser to track context at various locations in a
6
+ # source.
7
+ #
8
+ class Region
9
+ # @return [Pin::Closure]
10
+ attr_reader :closure
11
+
12
+ # @return [Symbol]
13
+ attr_reader :scope
14
+
15
+ # @return [Symbol]
16
+ attr_reader :visibility
17
+
18
+ # @return [Solargraph::Source]
19
+ attr_reader :source
20
+
21
+ # @return [Array<Symbol>]
22
+ attr_reader :lvars
23
+
24
+ # @param source [Source]
25
+ # @param namespace [String]
26
+ # @param scope [Symbol]
27
+ # @param visibility [Symbol]
28
+ def initialize source: Solargraph::Source.load_string(''), closure: nil,
29
+ scope: nil, visibility: :public, lvars: []
30
+ @source = source
31
+ # @closure = closure
32
+ @closure = closure || Pin::Namespace.new(name: '', location: source.location)
33
+ @scope = scope
34
+ @visibility = visibility
35
+ @lvars = lvars
36
+ end
37
+
38
+ # @return [String]
39
+ def filename
40
+ source.filename
41
+ end
42
+
43
+ # Generate a new Region with the provided attribute changes.
44
+ #
45
+ # @param closure [Pin::Closure, nil]
46
+ # @param scope [Symbol, nil]
47
+ # @param visibility [Symbol, nil]
48
+ # @return [Region]
49
+ def update closure: nil, scope: nil, visibility: nil, lvars: nil
50
+ Region.new(
51
+ source: source,
52
+ closure: closure || self.closure,
53
+ scope: scope || self.scope,
54
+ visibility: visibility || self.visibility,
55
+ lvars: lvars || self.lvars
56
+ )
57
+ end
58
+
59
+ # @param node [Parser::AST::Node]
60
+ # @return [String]
61
+ def code_for node
62
+ source.code_for(node)
63
+ end
64
+ end
65
+ end
66
+ end