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,148 +1,164 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- # A factory for generating chains from nodes.
7
- #
8
- class NodeChainer
9
- include NodeMethods
10
- Chain = Source::Chain
11
-
12
- # @param node [Parser::AST::Node]
13
- # @param filename [String]
14
- def initialize node, filename = nil, in_block = false
15
- @node = node
16
- @filename = filename
17
- @in_block = in_block ? 1 : 0
18
- end
19
-
20
- # @return [Source::Chain]
21
- def chain
22
- links = generate_links(@node)
23
- Chain.new(links, @node, (Parser.is_ast_node?(@node) && @node.type == :splat))
24
- end
25
-
26
- class << self
27
- # @param node [Parser::AST::Node]
28
- # @param filename [String]
29
- # @return [Source::Chain]
30
- def chain node, filename = nil, in_block = false
31
- NodeChainer.new(node, filename, in_block).chain
32
- end
33
-
34
- # @param code [String]
35
- # @return [Source::Chain]
36
- def load_string(code)
37
- node = Parser.parse(code.sub(/\.$/, ''))
38
- chain = NodeChainer.new(node).chain
39
- chain.links.push(Chain::Link.new) if code.end_with?('.')
40
- chain
41
- end
42
- end
43
-
44
- private
45
-
46
- # @param n [Parser::AST::Node]
47
- # @return [Array<Chain::Link>]
48
- def generate_links n
49
- return [] unless n.is_a?(::Parser::AST::Node)
50
- return generate_links(n.children[0]) if n.type == :begin
51
- return generate_links(n.children[0]) if n.type == :splat
52
- result = []
53
- if n.type == :block
54
- @in_block += 1
55
- result.concat generate_links(n.children[0])
56
- @in_block -= 1
57
- elsif n.type == :send
58
- if n.children[0].is_a?(::Parser::AST::Node)
59
- result.concat generate_links(n.children[0])
60
- args = []
61
- n.children[2..-1].each do |c|
62
- args.push NodeChainer.chain(c)
63
- end
64
- result.push Chain::Call.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
65
- elsif n.children[0].nil?
66
- args = []
67
- n.children[2..-1].each do |c|
68
- args.push NodeChainer.chain(c)
69
- end
70
- result.push Chain::Call.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
71
- else
72
- raise "No idea what to do with #{n}"
73
- end
74
- elsif n.type == :csend
75
- if n.children[0].is_a?(::Parser::AST::Node)
76
- result.concat generate_links(n.children[0])
77
- args = []
78
- n.children[2..-1].each do |c|
79
- args.push NodeChainer.chain(c)
80
- end
81
- result.push Chain::QCall.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
82
- elsif n.children[0].nil?
83
- args = []
84
- n.children[2..-1].each do |c|
85
- args.push NodeChainer.chain(c)
86
- end
87
- result.push Chain::QCall.new(n.children[1].to_s, args, @in_block > 0 || block_passed?(n))
88
- else
89
- raise "No idea what to do with #{n}"
90
- end
91
- elsif n.type == :self
92
- result.push Chain::Head.new('self')
93
- elsif n.type == :zsuper
94
- result.push Chain::ZSuper.new('super', @in_block > 0 || block_passed?(n))
95
- elsif n.type == :super
96
- args = n.children.map { |c| NodeChainer.chain(c) }
97
- result.push Chain::Call.new('super', args, @in_block > 0 || block_passed?(n))
98
- elsif n.type == :const
99
- const = unpack_name(n)
100
- result.push Chain::Constant.new(const)
101
- elsif [:lvar, :lvasgn].include?(n.type)
102
- result.push Chain::Call.new(n.children[0].to_s)
103
- elsif [:ivar, :ivasgn].include?(n.type)
104
- result.push Chain::InstanceVariable.new(n.children[0].to_s)
105
- elsif [:cvar, :cvasgn].include?(n.type)
106
- result.push Chain::ClassVariable.new(n.children[0].to_s)
107
- elsif [:gvar, :gvasgn].include?(n.type)
108
- result.push Chain::GlobalVariable.new(n.children[0].to_s)
109
- elsif n.type == :or_asgn
110
- result.concat generate_links n.children[1]
111
- elsif [:class, :module, :def, :defs].include?(n.type)
112
- # @todo Undefined or what?
113
- result.push Chain::UNDEFINED_CALL
114
- elsif n.type == :and
115
- result.concat generate_links(n.children.last)
116
- elsif n.type == :or
117
- result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename)])
118
- elsif [:begin, :kwbegin].include?(n.type)
119
- result.concat generate_links(n.children[0])
120
- elsif n.type == :block_pass
121
- result.push Chain::BlockVariable.new("&#{n.children[0].children[0].to_s}")
122
- elsif n.type == :hash
123
- result.push Chain::Hash.new('::Hash', hash_is_splatted?(n))
124
- else
125
- lit = infer_literal_node_type(n)
126
- # if lit == '::Hash'
127
- # result.push Chain::Hash.new(lit, hash_is_splatted?(n))
128
- # else
129
- result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
130
- # end
131
- end
132
- result
133
- end
134
-
135
- def hash_is_splatted? node
136
- return false unless Parser.is_ast_node?(node) && node.type == :hash
137
- return false unless Parser.is_ast_node?(node.children.last) && node.children.last.type == :kwsplat
138
- return false if Parser.is_ast_node?(node.children.last.children[0]) && node.children.last.children[0].type == :hash
139
- true
140
- end
141
-
142
- def block_passed? node
143
- node.children.last.is_a?(::Parser::AST::Node) && node.children.last.type == :block_pass
144
- end
145
- end
146
- end
147
- end
148
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ # A factory for generating chains from nodes.
7
+ #
8
+ class NodeChainer
9
+ include NodeMethods
10
+ Chain = Source::Chain
11
+
12
+ # @param node [Parser::AST::Node]
13
+ # @param filename [String, nil]
14
+ # @param parent [Parser::AST::Node, nil]
15
+ def initialize node, filename = nil, parent = nil
16
+ @node = node
17
+ @filename = filename
18
+ @parent = parent
19
+ end
20
+
21
+ # @return [Source::Chain]
22
+ def chain
23
+ links = generate_links(@node)
24
+ Chain.new(links, @node, (Parser.is_ast_node?(@node) && @node.type == :splat))
25
+ end
26
+
27
+ class << self
28
+ # @param node [Parser::AST::Node]
29
+ # @param filename [String, nil]
30
+ # @param parent [Parser::AST::Node, nil]
31
+ # @return [Source::Chain]
32
+ def chain node, filename = nil, parent = nil
33
+ NodeChainer.new(node, filename, parent).chain
34
+ end
35
+
36
+ # @param code [String]
37
+ # @return [Source::Chain]
38
+ def load_string(code)
39
+ node = Parser.parse(code.sub(/\.$/, ''))
40
+ chain = NodeChainer.new(node).chain
41
+ chain.links.push(Chain::Link.new) if code.end_with?('.')
42
+ chain
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ # @param n [Parser::AST::Node]
49
+ # @return [Array<Chain::Link>]
50
+ def generate_links n
51
+ return [] unless n.is_a?(::Parser::AST::Node)
52
+ return generate_links(n.children[0]) if n.type == :splat
53
+ # @type [Array<Chain::Link>]
54
+ result = []
55
+ if n.type == :block
56
+ result.concat NodeChainer.chain(n.children[0], @filename, n).links
57
+ elsif n.type == :send
58
+ if n.children[0].is_a?(::Parser::AST::Node)
59
+ result.concat generate_links(n.children[0])
60
+ result.push Chain::Call.new(n.children[1].to_s, node_args(n), passed_block(n))
61
+ elsif n.children[0].nil?
62
+ args = []
63
+ n.children[2..-1].each do |c|
64
+ args.push NodeChainer.chain(c, @filename, n)
65
+ end
66
+ result.push Chain::Call.new(n.children[1].to_s, node_args(n), passed_block(n))
67
+ else
68
+ raise "No idea what to do with #{n}"
69
+ end
70
+ elsif n.type == :csend
71
+ if n.children[0].is_a?(::Parser::AST::Node)
72
+ result.concat generate_links(n.children[0])
73
+ result.push Chain::QCall.new(n.children[1].to_s, node_args(n))
74
+ elsif n.children[0].nil?
75
+ result.push Chain::QCall.new(n.children[1].to_s, node_args(n))
76
+ else
77
+ raise "No idea what to do with #{n}"
78
+ end
79
+ elsif n.type == :self
80
+ result.push Chain::Head.new('self')
81
+ elsif n.type == :zsuper
82
+ result.push Chain::ZSuper.new('super')
83
+ elsif n.type == :super
84
+ args = n.children.map { |c| NodeChainer.chain(c, @filename, n) }
85
+ result.push Chain::Call.new('super', args)
86
+ elsif n.type == :yield
87
+ args = n.children.map { |c| NodeChainer.chain(c, @filename, n) }
88
+ result.push Chain::Call.new('yield', args)
89
+ elsif n.type == :const
90
+ const = unpack_name(n)
91
+ result.push Chain::Constant.new(const)
92
+ elsif [:lvar, :lvasgn].include?(n.type)
93
+ result.push Chain::Call.new(n.children[0].to_s)
94
+ elsif [:ivar, :ivasgn].include?(n.type)
95
+ result.push Chain::InstanceVariable.new(n.children[0].to_s)
96
+ elsif [:cvar, :cvasgn].include?(n.type)
97
+ result.push Chain::ClassVariable.new(n.children[0].to_s)
98
+ elsif [:gvar, :gvasgn].include?(n.type)
99
+ result.push Chain::GlobalVariable.new(n.children[0].to_s)
100
+ elsif n.type == :or_asgn
101
+ result.concat generate_links n.children[1]
102
+ elsif [:class, :module, :def, :defs].include?(n.type)
103
+ # @todo Undefined or what?
104
+ result.push Chain::UNDEFINED_CALL
105
+ elsif n.type == :and
106
+ result.concat generate_links(n.children.last)
107
+ elsif n.type == :or
108
+ result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename, n)])
109
+ elsif n.type == :if
110
+ result.push Chain::If.new([NodeChainer.chain(n.children[1], @filename), NodeChainer.chain(n.children[2], @filename, n)])
111
+ elsif [:begin, :kwbegin].include?(n.type)
112
+ result.concat generate_links(n.children.last)
113
+ elsif n.type == :block_pass
114
+ block_variable_name_node = n.children[0]
115
+ if block_variable_name_node.nil?
116
+ # anonymous block forwarding (e.g., "&")
117
+ # added in Ruby 3.1 - https://bugs.ruby-lang.org/issues/11256
118
+ result.push Chain::BlockVariable.new(nil)
119
+ else
120
+ if block_variable_name_node.type == :sym
121
+ result.push Chain::BlockSymbol.new("#{block_variable_name_node.children[0].to_s}")
122
+ else
123
+ result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0].to_s}")
124
+ end
125
+ end
126
+ elsif n.type == :hash
127
+ result.push Chain::Hash.new('::Hash', hash_is_splatted?(n))
128
+ elsif n.type == :array
129
+ chained_children = n.children.map { |c| NodeChainer.chain(c) }
130
+ result.push Source::Chain::Array.new(chained_children)
131
+ else
132
+ lit = infer_literal_node_type(n)
133
+ result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
134
+ end
135
+ result
136
+ end
137
+
138
+ # @param node [Parser::AST::Node]
139
+ def hash_is_splatted? node
140
+ return false unless Parser.is_ast_node?(node) && node.type == :hash
141
+ return false unless Parser.is_ast_node?(node.children.last) && node.children.last.type == :kwsplat
142
+ return false if Parser.is_ast_node?(node.children.last.children[0]) && node.children.last.children[0].type == :hash
143
+ true
144
+ end
145
+
146
+ # @param node [Parser::AST::Node]
147
+ # @return [Source::Chain, nil]
148
+ def passed_block node
149
+ return unless node == @node && @parent&.type == :block
150
+
151
+ NodeChainer.chain(@parent.children[2], @filename)
152
+ end
153
+
154
+ # @param node [Parser::AST::Node]
155
+ # @return [Array<Source::Chain>]
156
+ def node_args node
157
+ node.children[2..-1].map do |child|
158
+ NodeChainer.chain(child, @filename, node)
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end