solargraph 0.44.2 → 0.46.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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +41 -0
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1115 -1088
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -120
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +18 -15
  12. data/bin/solargraph +0 -0
  13. data/lib/solargraph/api_map/bundler_methods.rb +22 -22
  14. data/lib/solargraph/api_map/cache.rb +70 -70
  15. data/lib/solargraph/api_map/source_to_yard.rb +81 -81
  16. data/lib/solargraph/api_map/store.rb +256 -256
  17. data/lib/solargraph/api_map.rb +686 -681
  18. data/lib/solargraph/bench.rb +27 -27
  19. data/lib/solargraph/compat.rb +37 -37
  20. data/lib/solargraph/complex_type/type_methods.rb +130 -130
  21. data/lib/solargraph/complex_type/unique_type.rb +75 -75
  22. data/lib/solargraph/complex_type.rb +221 -221
  23. data/lib/solargraph/convention/base.rb +33 -33
  24. data/lib/solargraph/convention/gemfile.rb +15 -15
  25. data/lib/solargraph/convention/gemspec.rb +22 -22
  26. data/lib/solargraph/convention/rspec.rb +30 -21
  27. data/lib/solargraph/convention.rb +47 -47
  28. data/lib/solargraph/converters/dd.rb +12 -12
  29. data/lib/solargraph/converters/dl.rb +12 -12
  30. data/lib/solargraph/converters/dt.rb +12 -12
  31. data/lib/solargraph/converters/misc.rb +1 -1
  32. data/lib/solargraph/diagnostics/base.rb +29 -29
  33. data/lib/solargraph/diagnostics/require_not_found.rb +53 -37
  34. data/lib/solargraph/diagnostics/rubocop.rb +98 -98
  35. data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
  36. data/lib/solargraph/diagnostics/severities.rb +15 -15
  37. data/lib/solargraph/diagnostics/type_check.rb +54 -54
  38. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  39. data/lib/solargraph/diagnostics.rb +55 -55
  40. data/lib/solargraph/documentor.rb +76 -76
  41. data/lib/solargraph/environ.rb +45 -45
  42. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  43. data/lib/solargraph/language_server/error_codes.rb +20 -20
  44. data/lib/solargraph/language_server/host/cataloger.rb +56 -56
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +111 -111
  47. data/lib/solargraph/language_server/host/message_worker.rb +59 -59
  48. data/lib/solargraph/language_server/host/sources.rb +156 -156
  49. data/lib/solargraph/language_server/host.rb +865 -865
  50. data/lib/solargraph/language_server/message/base.rb +89 -89
  51. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/client.rb +11 -11
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
  55. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  56. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  60. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
  61. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended.rb +21 -21
  64. data/lib/solargraph/language_server/message/initialize.rb +162 -162
  65. data/lib/solargraph/language_server/message/initialized.rb +27 -27
  66. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  67. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  68. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  69. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  70. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  71. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
  72. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  73. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  74. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  75. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  76. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  77. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  78. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
  79. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  80. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
  81. data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
  82. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  83. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  84. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  85. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  86. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
  87. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  88. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
  89. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
  90. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  91. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  93. data/lib/solargraph/language_server/message.rb +93 -93
  94. data/lib/solargraph/language_server/message_types.rb +14 -14
  95. data/lib/solargraph/language_server/request.rb +24 -24
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  97. data/lib/solargraph/language_server/transport/adapter.rb +53 -53
  98. data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
  99. data/lib/solargraph/language_server/transport.rb +13 -13
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  101. data/lib/solargraph/language_server.rb +19 -19
  102. data/lib/solargraph/library.rb +546 -546
  103. data/lib/solargraph/location.rb +37 -37
  104. data/lib/solargraph/logging.rb +27 -27
  105. data/lib/solargraph/page.rb +83 -83
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -52
  107. data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
  108. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
  109. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
  110. data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
  111. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
  112. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
  113. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
  114. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
  115. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
  116. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
  117. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
  118. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
  119. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
  120. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
  121. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
  122. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
  123. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
  124. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
  125. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
  126. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
  127. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
  128. data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
  129. data/lib/solargraph/parser/legacy.rb +12 -12
  130. data/lib/solargraph/parser/node_methods.rb +43 -43
  131. data/lib/solargraph/parser/node_processor/base.rb +77 -77
  132. data/lib/solargraph/parser/node_processor.rb +43 -43
  133. data/lib/solargraph/parser/region.rb +66 -66
  134. data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
  135. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
  136. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
  137. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
  138. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
  139. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
  140. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
  141. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
  142. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
  143. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
  144. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
  145. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
  146. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
  147. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
  148. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
  149. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
  150. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
  151. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
  152. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
  153. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
  154. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
  155. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
  156. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
  157. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
  158. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
  159. data/lib/solargraph/parser/rubyvm.rb +40 -40
  160. data/lib/solargraph/parser/snippet.rb +13 -13
  161. data/lib/solargraph/parser.rb +26 -26
  162. data/lib/solargraph/pin/base.rb +296 -296
  163. data/lib/solargraph/pin/base_variable.rb +84 -84
  164. data/lib/solargraph/pin/block.rb +72 -72
  165. data/lib/solargraph/pin/class_variable.rb +8 -8
  166. data/lib/solargraph/pin/closure.rb +37 -37
  167. data/lib/solargraph/pin/common.rb +70 -70
  168. data/lib/solargraph/pin/constant.rb +43 -43
  169. data/lib/solargraph/pin/conversions.rb +96 -96
  170. data/lib/solargraph/pin/documenting.rb +105 -105
  171. data/lib/solargraph/pin/duck_method.rb +16 -16
  172. data/lib/solargraph/pin/global_variable.rb +8 -8
  173. data/lib/solargraph/pin/instance_variable.rb +30 -30
  174. data/lib/solargraph/pin/keyword.rb +15 -15
  175. data/lib/solargraph/pin/keyword_param.rb +8 -8
  176. data/lib/solargraph/pin/local_variable.rb +55 -55
  177. data/lib/solargraph/pin/method.rb +245 -245
  178. data/lib/solargraph/pin/method_alias.rb +31 -31
  179. data/lib/solargraph/pin/namespace.rb +91 -91
  180. data/lib/solargraph/pin/parameter.rb +201 -206
  181. data/lib/solargraph/pin/proxy_type.rb +29 -29
  182. data/lib/solargraph/pin/reference/extend.rb +10 -10
  183. data/lib/solargraph/pin/reference/include.rb +10 -10
  184. data/lib/solargraph/pin/reference/override.rb +29 -29
  185. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  186. data/lib/solargraph/pin/reference/require.rb +14 -14
  187. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  188. data/lib/solargraph/pin/reference.rb +14 -14
  189. data/lib/solargraph/pin/search.rb +56 -0
  190. data/lib/solargraph/pin/singleton.rb +11 -11
  191. data/lib/solargraph/pin/symbol.rb +47 -47
  192. data/lib/solargraph/pin.rb +37 -36
  193. data/lib/solargraph/position.rb +100 -100
  194. data/lib/solargraph/range.rb +95 -95
  195. data/lib/solargraph/server_methods.rb +16 -16
  196. data/lib/solargraph/shell.rb +226 -226
  197. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  198. data/lib/solargraph/source/chain/call.rb +204 -204
  199. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  200. data/lib/solargraph/source/chain/constant.rb +75 -75
  201. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  202. data/lib/solargraph/source/chain/hash.rb +28 -28
  203. data/lib/solargraph/source/chain/head.rb +19 -19
  204. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  205. data/lib/solargraph/source/chain/link.rb +71 -71
  206. data/lib/solargraph/source/chain/literal.rb +23 -23
  207. data/lib/solargraph/source/chain/or.rb +23 -23
  208. data/lib/solargraph/source/chain/q_call.rb +11 -11
  209. data/lib/solargraph/source/chain/variable.rb +13 -13
  210. data/lib/solargraph/source/chain/z_super.rb +30 -30
  211. data/lib/solargraph/source/chain.rb +164 -164
  212. data/lib/solargraph/source/change.rb +79 -79
  213. data/lib/solargraph/source/cursor.rb +164 -164
  214. data/lib/solargraph/source/source_chainer.rb +191 -191
  215. data/lib/solargraph/source/updater.rb +54 -54
  216. data/lib/solargraph/source.rb +522 -522
  217. data/lib/solargraph/source_map/clip.rb +224 -224
  218. data/lib/solargraph/source_map/completion.rb +23 -23
  219. data/lib/solargraph/source_map/mapper.rb +212 -212
  220. data/lib/solargraph/source_map.rb +180 -189
  221. data/lib/solargraph/type_checker/checks.rb +99 -99
  222. data/lib/solargraph/type_checker/param_def.rb +35 -35
  223. data/lib/solargraph/type_checker/problem.rb +32 -32
  224. data/lib/solargraph/type_checker/rules.rb +57 -57
  225. data/lib/solargraph/type_checker.rb +543 -510
  226. data/lib/solargraph/version.rb +5 -5
  227. data/lib/solargraph/views/environment.erb +58 -58
  228. data/lib/solargraph/workspace/config.rb +231 -231
  229. data/lib/solargraph/workspace.rb +215 -214
  230. data/lib/solargraph/yard_map/cache.rb +19 -19
  231. data/lib/solargraph/yard_map/core_docs.rb +170 -170
  232. data/lib/solargraph/yard_map/core_fills.rb +208 -203
  233. data/lib/solargraph/yard_map/core_gen.rb +76 -76
  234. data/lib/solargraph/yard_map/helpers.rb +16 -16
  235. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
  236. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
  237. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
  238. data/lib/solargraph/yard_map/mapper.rb +77 -77
  239. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
  240. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
  241. data/lib/solargraph/yard_map/to_method.rb +79 -79
  242. data/lib/solargraph/yard_map.rb +460 -443
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +14 -12
@@ -1,16 +1,16 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- # A custom builder for source parsers that ignores character encoding
7
- # issues in literal strings.
8
- #
9
- class FlawedBuilder < ::Parser::Builders::Default
10
- def string_value(token)
11
- value(token)
12
- end
13
- end
14
- end
15
- end
16
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ # A custom builder for source parsers that ignores character encoding
7
+ # issues in literal strings.
8
+ #
9
+ class FlawedBuilder < ::Parser::Builders::Default
10
+ def string_value(token)
11
+ value(token)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,148 +1,148 @@
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 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