jimeh-solargraph 0.40.4.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 (252) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +54 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +24 -0
  6. data/.yardopts +2 -0
  7. data/CHANGELOG.md +1003 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE +21 -0
  10. data/README.md +123 -0
  11. data/Rakefile +25 -0
  12. data/SPONSORS.md +15 -0
  13. data/bin/solargraph +5 -0
  14. data/jimeh-solargraph.gemspec +44 -0
  15. data/lib/.rubocop.yml +21 -0
  16. data/lib/solargraph.rb +67 -0
  17. data/lib/solargraph/api_map.rb +752 -0
  18. data/lib/solargraph/api_map/bundler_methods.rb +27 -0
  19. data/lib/solargraph/api_map/cache.rb +70 -0
  20. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  21. data/lib/solargraph/api_map/store.rb +256 -0
  22. data/lib/solargraph/bench.rb +30 -0
  23. data/lib/solargraph/compat.rb +23 -0
  24. data/lib/solargraph/complex_type.rb +213 -0
  25. data/lib/solargraph/complex_type/type_methods.rb +127 -0
  26. data/lib/solargraph/complex_type/unique_type.rb +75 -0
  27. data/lib/solargraph/convention.rb +47 -0
  28. data/lib/solargraph/convention/base.rb +33 -0
  29. data/lib/solargraph/convention/gemfile.rb +15 -0
  30. data/lib/solargraph/convention/gemspec.rb +22 -0
  31. data/lib/solargraph/convention/rspec.rb +21 -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.rb +55 -0
  37. data/lib/solargraph/diagnostics/base.rb +29 -0
  38. data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
  39. data/lib/solargraph/diagnostics/rubocop.rb +90 -0
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +45 -0
  41. data/lib/solargraph/diagnostics/severities.rb +15 -0
  42. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  43. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  44. data/lib/solargraph/documentor.rb +78 -0
  45. data/lib/solargraph/environ.rb +45 -0
  46. data/lib/solargraph/language_server.rb +19 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  48. data/lib/solargraph/language_server/error_codes.rb +20 -0
  49. data/lib/solargraph/language_server/host.rb +746 -0
  50. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  51. data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
  52. data/lib/solargraph/language_server/host/dispatch.rb +112 -0
  53. data/lib/solargraph/language_server/host/sources.rb +156 -0
  54. data/lib/solargraph/language_server/message.rb +92 -0
  55. data/lib/solargraph/language_server/message/base.rb +85 -0
  56. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  57. data/lib/solargraph/language_server/message/client.rb +11 -0
  58. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
  61. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  62. data/lib/solargraph/language_server/message/extended.rb +21 -0
  63. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -0
  64. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  65. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  66. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
  67. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  68. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  69. data/lib/solargraph/language_server/message/initialize.rb +153 -0
  70. data/lib/solargraph/language_server/message/initialized.rb +26 -0
  71. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  72. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  73. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  74. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  75. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  76. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  77. data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
  78. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  79. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  80. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  81. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  82. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  83. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  84. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  85. data/lib/solargraph/language_server/message/text_document/formatting.rb +105 -0
  86. data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
  87. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  88. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  89. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  90. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  91. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  97. data/lib/solargraph/language_server/message_types.rb +14 -0
  98. data/lib/solargraph/language_server/request.rb +24 -0
  99. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  100. data/lib/solargraph/language_server/transport.rb +13 -0
  101. data/lib/solargraph/language_server/transport/adapter.rb +56 -0
  102. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  103. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  104. data/lib/solargraph/library.rb +426 -0
  105. data/lib/solargraph/location.rb +37 -0
  106. data/lib/solargraph/logging.rb +27 -0
  107. data/lib/solargraph/page.rb +83 -0
  108. data/lib/solargraph/parser.rb +26 -0
  109. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  110. data/lib/solargraph/parser/legacy.rb +12 -0
  111. data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
  112. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  113. data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
  114. data/lib/solargraph/parser/legacy/node_methods.rb +311 -0
  115. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  116. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  117. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  118. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  119. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
  120. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
  121. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  122. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  123. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  124. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  125. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  126. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  127. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  128. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  129. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  130. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
  131. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -0
  132. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  133. data/lib/solargraph/parser/node_methods.rb +43 -0
  134. data/lib/solargraph/parser/node_processor.rb +43 -0
  135. data/lib/solargraph/parser/node_processor/base.rb +80 -0
  136. data/lib/solargraph/parser/region.rb +66 -0
  137. data/lib/solargraph/parser/rubyvm.rb +40 -0
  138. data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
  139. data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
  140. data/lib/solargraph/parser/rubyvm/node_methods.rb +301 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors.rb +62 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +86 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
  160. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  161. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -0
  162. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  163. data/lib/solargraph/parser/snippet.rb +13 -0
  164. data/lib/solargraph/pin.rb +36 -0
  165. data/lib/solargraph/pin/base.rb +296 -0
  166. data/lib/solargraph/pin/base_variable.rb +84 -0
  167. data/lib/solargraph/pin/block.rb +62 -0
  168. data/lib/solargraph/pin/class_variable.rb +8 -0
  169. data/lib/solargraph/pin/closure.rb +37 -0
  170. data/lib/solargraph/pin/common.rb +70 -0
  171. data/lib/solargraph/pin/constant.rb +43 -0
  172. data/lib/solargraph/pin/conversions.rb +96 -0
  173. data/lib/solargraph/pin/documenting.rb +105 -0
  174. data/lib/solargraph/pin/duck_method.rb +16 -0
  175. data/lib/solargraph/pin/global_variable.rb +8 -0
  176. data/lib/solargraph/pin/instance_variable.rb +30 -0
  177. data/lib/solargraph/pin/keyword.rb +15 -0
  178. data/lib/solargraph/pin/keyword_param.rb +8 -0
  179. data/lib/solargraph/pin/local_variable.rb +21 -0
  180. data/lib/solargraph/pin/localized.rb +43 -0
  181. data/lib/solargraph/pin/method.rb +245 -0
  182. data/lib/solargraph/pin/method_alias.rb +31 -0
  183. data/lib/solargraph/pin/namespace.rb +85 -0
  184. data/lib/solargraph/pin/parameter.rb +206 -0
  185. data/lib/solargraph/pin/proxy_type.rb +29 -0
  186. data/lib/solargraph/pin/reference.rb +14 -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/singleton.rb +11 -0
  194. data/lib/solargraph/pin/symbol.rb +47 -0
  195. data/lib/solargraph/position.rb +100 -0
  196. data/lib/solargraph/range.rb +95 -0
  197. data/lib/solargraph/server_methods.rb +16 -0
  198. data/lib/solargraph/shell.rb +222 -0
  199. data/lib/solargraph/source.rb +537 -0
  200. data/lib/solargraph/source/chain.rb +154 -0
  201. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  202. data/lib/solargraph/source/chain/call.rb +203 -0
  203. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  204. data/lib/solargraph/source/chain/constant.rb +75 -0
  205. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  206. data/lib/solargraph/source/chain/head.rb +35 -0
  207. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  208. data/lib/solargraph/source/chain/link.rb +67 -0
  209. data/lib/solargraph/source/chain/literal.rb +23 -0
  210. data/lib/solargraph/source/chain/or.rb +23 -0
  211. data/lib/solargraph/source/chain/variable.rb +13 -0
  212. data/lib/solargraph/source/chain/z_super.rb +30 -0
  213. data/lib/solargraph/source/change.rb +79 -0
  214. data/lib/solargraph/source/cursor.rb +164 -0
  215. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  216. data/lib/solargraph/source/source_chainer.rb +190 -0
  217. data/lib/solargraph/source/updater.rb +54 -0
  218. data/lib/solargraph/source_map.rb +188 -0
  219. data/lib/solargraph/source_map/clip.rb +224 -0
  220. data/lib/solargraph/source_map/completion.rb +23 -0
  221. data/lib/solargraph/source_map/mapper.rb +215 -0
  222. data/lib/solargraph/type_checker.rb +503 -0
  223. data/lib/solargraph/type_checker/checks.rb +99 -0
  224. data/lib/solargraph/type_checker/param_def.rb +35 -0
  225. data/lib/solargraph/type_checker/problem.rb +32 -0
  226. data/lib/solargraph/type_checker/rules.rb +57 -0
  227. data/lib/solargraph/version.rb +5 -0
  228. data/lib/solargraph/views/_method.erb +62 -0
  229. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  230. data/lib/solargraph/views/_namespace.erb +24 -0
  231. data/lib/solargraph/views/document.erb +23 -0
  232. data/lib/solargraph/views/environment.erb +58 -0
  233. data/lib/solargraph/views/layout.erb +44 -0
  234. data/lib/solargraph/views/search.erb +11 -0
  235. data/lib/solargraph/workspace.rb +209 -0
  236. data/lib/solargraph/workspace/config.rb +230 -0
  237. data/lib/solargraph/yard_map.rb +435 -0
  238. data/lib/solargraph/yard_map/cache.rb +19 -0
  239. data/lib/solargraph/yard_map/core_docs.rb +170 -0
  240. data/lib/solargraph/yard_map/core_fills.rb +185 -0
  241. data/lib/solargraph/yard_map/core_gen.rb +76 -0
  242. data/lib/solargraph/yard_map/helpers.rb +16 -0
  243. data/lib/solargraph/yard_map/mapper.rb +77 -0
  244. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
  245. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
  246. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
  247. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -0
  248. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
  249. data/lib/solargraph/yard_map/to_method.rb +79 -0
  250. data/lib/yard-solargraph.rb +30 -0
  251. data/yardoc/2.2.2.tar.gz +0 -0
  252. metadata +564 -0
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Rubyvm
6
+ # A factory for generating chains from nodes.
7
+ #
8
+ class NodeChainer
9
+ include Rubyvm::NodeMethods
10
+
11
+ Chain = Source::Chain
12
+
13
+ # @param node [Parser::AST::Node]
14
+ # @param filename [String]
15
+ def initialize node, filename = nil, in_block = false
16
+ @node = node
17
+ @filename = filename
18
+ @in_block = in_block ? 1 : 0
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]
30
+ # @return [Source::Chain]
31
+ def chain node, filename = nil, in_block = false
32
+ NodeChainer.new(node, filename, in_block).chain
33
+ end
34
+
35
+ # @param code [String]
36
+ # @return [Source::Chain]
37
+ def load_string(code)
38
+ node = Parser.parse(code.sub(/\.$/, ''))
39
+ chain = NodeChainer.new(node).chain
40
+ chain.links.push(Chain::Link.new) if code.end_with?('.')
41
+ chain
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ # @param n [Parser::AST::Node]
48
+ # @return [Array<Chain::Link>]
49
+ def generate_links n
50
+ return [] unless Parser.is_ast_node?(n)
51
+ return generate_links(n.children[2]) if n.type == :SCOPE
52
+ return generate_links(n.children[0]) if n.type == :SPLAT
53
+ result = []
54
+ if n.type == :ITER
55
+ @in_block += 1
56
+ result.concat generate_links(n.children[0])
57
+ @in_block -= 1
58
+ elsif n.type == :CALL || n.type == :OPCALL
59
+ n.children[0..-3].each do |c|
60
+ result.concat generate_links(c)
61
+ end
62
+ result.push Chain::Call.new(n.children[-2].to_s, node_to_argchains(n.children.last), @in_block > 0 || block_passed?(n))
63
+ elsif n.type == :ATTRASGN
64
+ result.concat generate_links(n.children[0])
65
+ result.push Chain::Call.new(n.children[1].to_s, node_to_argchains(n.children[2]), @in_block > 0 || block_passed?(n))
66
+ elsif n.type == :VCALL
67
+ result.push Chain::Call.new(n.children[0].to_s, [], @in_block > 0 || block_passed?(n))
68
+ elsif n.type == :FCALL
69
+ result.push Chain::Call.new(n.children[0].to_s, node_to_argchains(n.children[1]), @in_block > 0 || block_passed?(n))
70
+ elsif n.type == :SELF
71
+ result.push Chain::Head.new('self')
72
+ elsif n.type == :ZSUPER
73
+ result.push Chain::ZSuper.new('super', @in_block > 0 || block_passed?(n))
74
+ elsif n.type == :SUPER
75
+ result.push Chain::Call.new('super', node_to_argchains(n.children.last), @in_block > 0 || block_passed?(n))
76
+ elsif [:COLON2, :COLON3, :CONST].include?(n.type)
77
+ const = unpack_name(n)
78
+ result.push Chain::Constant.new(const)
79
+ elsif [:LVAR, :LASGN, :DVAR].include?(n.type)
80
+ result.push Chain::Call.new(n.children[0].to_s)
81
+ elsif [:IVAR, :IASGN].include?(n.type)
82
+ result.push Chain::InstanceVariable.new(n.children[0].to_s)
83
+ elsif [:CVAR, :CVASGN].include?(n.type)
84
+ result.push Chain::ClassVariable.new(n.children[0].to_s)
85
+ elsif [:GVAR, :GASGN].include?(n.type)
86
+ result.push Chain::GlobalVariable.new(n.children[0].to_s)
87
+ elsif n.type == :OP_ASGN_OR
88
+ result.concat generate_links n.children[2]
89
+ elsif [:class, :module, :def, :defs].include?(n.type)
90
+ # @todo Undefined or what?
91
+ result.push Chain::UNDEFINED_CALL
92
+ elsif n.type == :AND
93
+ result.concat generate_links(n.children.last)
94
+ elsif n.type == :OR
95
+ result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename)])
96
+ elsif n.type == :begin
97
+ result.concat generate_links(n.children[0])
98
+ elsif n.type == :BLOCK_PASS
99
+ result.push Chain::BlockVariable.new("&#{n.children[1].children[0].to_s}")
100
+ else
101
+ lit = infer_literal_node_type(n)
102
+ result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
103
+ end
104
+ result
105
+ end
106
+
107
+ def block_passed? node
108
+ node.children.last.is_a?(RubyVM::AbstractSyntaxTree::Node) && node.children.last.type == :BLOCK_PASS
109
+ end
110
+
111
+ def node_to_argchains node
112
+ # @todo Process array, splat, argscat
113
+ return [] unless Parser.is_ast_node?(node)
114
+ if [:ZARRAY, :ARRAY, :LIST].include?(node.type)
115
+ node.children[0..-2].map { |c| NodeChainer.chain(c) }
116
+ elsif node.type == :SPLAT
117
+ [NodeChainer.chain(node)]
118
+ elsif node.type == :ARGSCAT
119
+ result = node.children[0].children[0..-2].map { |c| NodeChainer.chain(c) }
120
+ result.push NodeChainer.chain(node.children[1])
121
+ # @todo Smelly instance variable access
122
+ result.last.instance_variable_set(:@splat, true)
123
+ result
124
+ elsif node.type == :BLOCK_PASS
125
+ result = node_to_argchains(node.children[0])
126
+ result.push Chain.new([Chain::BlockVariable.new("&#{node.children[1].children[0].to_s}")])
127
+ result
128
+ else
129
+ []
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,301 @@
1
+ module Solargraph
2
+ module Parser
3
+ module Rubyvm
4
+ module NodeMethods
5
+ module_function
6
+
7
+ # @param node [RubyVM::AbstractSyntaxTree::Node]
8
+ # @return [String]
9
+ def unpack_name node
10
+ pack_name(node).join('::')
11
+ end
12
+
13
+ # @param node [RubyVM::AbstractSyntaxTree::Node]
14
+ # @return [Array<String>]
15
+ def pack_name(node)
16
+ parts = []
17
+ if node.is_a?(RubyVM::AbstractSyntaxTree::Node)
18
+ parts.push '' if node.type == :COLON3
19
+ node.children.each { |n|
20
+ if n.is_a?(RubyVM::AbstractSyntaxTree::Node)
21
+ parts += pack_name(n)
22
+ else
23
+ parts.push n unless n.nil?
24
+ end
25
+ }
26
+ end
27
+ parts
28
+ end
29
+
30
+ # @param node [RubyVM::AbstractSyntaxTree::Node]
31
+ # @return [String, nil]
32
+ def infer_literal_node_type node
33
+ return nil unless Parser.is_ast_node?(node)
34
+ case node.type
35
+ when :LIT, :STR
36
+ "::#{node.children.first.class.to_s}"
37
+ when :DSTR
38
+ "::String"
39
+ when :ARRAY, :ZARRAY, :LIST, :ZLIST
40
+ '::Array'
41
+ when :HASH
42
+ '::Hash'
43
+ when :DOT2, :DOT3
44
+ '::Range'
45
+ when :TRUE, :FALSE
46
+ '::Boolean'
47
+ when :SCOPE
48
+ infer_literal_node_type(node.children[2])
49
+ end
50
+ end
51
+
52
+ def returns_from node
53
+ return [] unless Parser.is_ast_node?(node)
54
+ if node.type == :SCOPE
55
+ # node.children.select { |n| n.is_a?(RubyVM::AbstractSyntaxTree::Node) }.map { |n| DeepInference.get_return_nodes(n) }.flatten
56
+ DeepInference.get_return_nodes(node.children[2])
57
+ else
58
+ DeepInference.get_return_nodes(node)
59
+ end
60
+ end
61
+
62
+ def const_nodes_from node
63
+ return [] unless Parser.is_ast_node?(node)
64
+ result = []
65
+ if [:CONST, :COLON2, :COLON3].include?(node.type)
66
+ result.push node
67
+ else
68
+ node.children.each { |child| result.concat const_nodes_from(child) }
69
+ end
70
+ result
71
+ end
72
+
73
+ def call_nodes_from node
74
+ return [] unless Parser.is_ast_node?(node)
75
+ result = []
76
+ if node.type == :ITER
77
+ result.push node.children[0]
78
+ node.children[1..-1].each { |child| result.concat call_nodes_from(child) }
79
+ elsif node.type == :MASGN
80
+ # @todo We're treating a mass assignment as a call node, but the
81
+ # type checker still needs the logic to handle it.
82
+ result.push node
83
+ elsif [:CALL, :VCALL, :FCALL, :ATTRASGN, :OPCALL].include?(node.type)
84
+ result.push node
85
+ node.children.each { |child| result.concat call_nodes_from(child) }
86
+ else
87
+ node.children.each { |child| result.concat call_nodes_from(child) }
88
+ end
89
+ result
90
+ end
91
+
92
+ def convert_hash node
93
+ return {} unless node?(node) && node.type == :HASH
94
+ return convert_hash(node.children[0].children[1]) if splatted_hash?(node)
95
+ return {} unless node?(node.children[0])
96
+ result = {}
97
+ index = 0
98
+ until index > node.children[0].children.length - 2
99
+ k = node.children[0].children[index]
100
+ return {} unless node?(k)
101
+ v = node.children[0].children[index + 1]
102
+ result[k.children[0]] = Solargraph::Parser.chain(v)
103
+ index += 2
104
+ end
105
+ result
106
+ end
107
+
108
+ def splatted_hash? node
109
+ splatted_node?(node) && node.children[0].children[1].type == :HASH
110
+ end
111
+
112
+ def splatted_node? node
113
+ node?(node.children[0]) &&
114
+ [:ARRAY, :LIST].include?(node.children[0].type) &&
115
+ node.children[0].children[0].nil? &&
116
+ node?(node.children[0].children[1])
117
+ end
118
+
119
+ def splatted_call? node
120
+ splatted_node?(node) && node.children[0].children[1].type != :HASH
121
+ end
122
+
123
+ def node? node
124
+ node.is_a?(RubyVM::AbstractSyntaxTree::Node)
125
+ end
126
+
127
+ # @param cursor [Solargraph::Source::Cursor]
128
+ def find_recipient_node cursor
129
+ if cursor.source.synchronized?
130
+ NodeMethods.synchronized_find_recipient_node cursor
131
+ else
132
+ NodeMethods.unsynchronized_find_recipient_node cursor
133
+ end
134
+ end
135
+
136
+ class << self
137
+ protected
138
+
139
+ def synchronized_find_recipient_node cursor
140
+ source = cursor.source
141
+ position = cursor.position
142
+ offset = cursor.offset
143
+ tree = source.tree_at(position.line, position.column)
144
+ tree.shift while tree.first && [:FCALL, :VCALL, :CALL].include?(tree.first.type) && !source.code_for(tree.first).strip.end_with?(')')
145
+ tree.each do |node|
146
+ if [:FCALL, :VCALL, :CALL].include?(node.type)
147
+ args = node.children.find { |c| Parser.is_ast_node?(c) && [:ARRAY, :ZARRAY, :LIST].include?(c.type) }
148
+ if args
149
+ match = source.code[0..offset-1].match(/,[^\)]*\z/)
150
+ rng = Solargraph::Range.from_node(args)
151
+ if match
152
+ rng = Solargraph::Range.new(rng.start, position)
153
+ end
154
+ return node if rng.contain?(position)
155
+ elsif source.code[0..offset-1] =~ /\(\s*$/
156
+ break unless source.code_for(node).strip.end_with?(')')
157
+ return node
158
+ end
159
+ end
160
+ end
161
+ nil
162
+ end
163
+
164
+ def unsynchronized_find_recipient_node cursor
165
+ source = cursor.source
166
+ position = cursor.position
167
+ offset = cursor.offset
168
+ if source.code[0..offset-1] =~ /\([A-Zaz0-9_\s]*\z$/ #&& source.code[offset] == ')'
169
+ tree = source.tree_at(position.line, position.column - 1)
170
+ if tree.first && [:FCALL, :VCALL, :CALL].include?(tree.first.type)
171
+ return tree.first
172
+ else
173
+ return nil
174
+ end
175
+ else
176
+ match = source.code[0..offset-1].match(/[\(,][A-Zaz0-9_\s]*\z/)
177
+ if match
178
+ moved = Position.from_offset(source.code, offset - match[0].length)
179
+ tree = source.tree_at(moved.line, moved.column)
180
+ tree.shift if match[0].start_with?(',')
181
+ tree.shift while tree.first && ![:FCALL, :VCALL, :CALL].include?(tree.first.type)
182
+ if tree.first && [:FCALL, :VCALL, :CALL].include?(tree.first.type)
183
+ return tree.first
184
+ end
185
+ end
186
+ return nil
187
+ end
188
+ end
189
+ end
190
+
191
+ module DeepInference
192
+ class << self
193
+ CONDITIONAL = [:IF, :UNLESS]
194
+ REDUCEABLE = [:BLOCK]
195
+ SKIPPABLE = [:DEFN, :DEFS, :CLASS, :SCLASS, :MODULE]
196
+
197
+ # @param node [Parser::AST::Node]
198
+ # @return [Array<Parser::AST::Node>]
199
+ def get_return_nodes node
200
+ return [] unless node.is_a?(RubyVM::AbstractSyntaxTree::Node)
201
+ result = []
202
+ if REDUCEABLE.include?(node.type)
203
+ result.concat get_return_nodes_from_children(node)
204
+ elsif CONDITIONAL.include?(node.type)
205
+ result.concat reduce_to_value_nodes(node.children[1..-1])
206
+ elsif node.type == :RESCUE
207
+ result.concat reduce_to_value_nodes([node.children[0]])
208
+ result.concat reduce_to_value_nodes(node.children[1..-2])
209
+ elsif node.type == :OR
210
+ result.concat reduce_to_value_nodes(node.children)
211
+ elsif node.type == :RETURN
212
+ result.concat reduce_to_value_nodes([node.children[0]])
213
+ elsif node.type == :ITER
214
+ result.push node
215
+ result.concat get_return_nodes_only(node.children[1])
216
+ elsif node.type == :CASE
217
+ node.children[1..-1].each do |cc|
218
+ result.concat reduce_to_value_nodes(cc.children[1..-1])
219
+ end
220
+ else
221
+ result.push node
222
+ end
223
+ result
224
+ end
225
+
226
+ private
227
+
228
+ def get_return_nodes_from_children parent
229
+ result = []
230
+ nodes = parent.children.select{|n| n.is_a?(RubyVM::AbstractSyntaxTree::Node)}
231
+ nodes.each_with_index do |node, idx|
232
+ if node.type == :BLOCK
233
+ result.concat get_return_nodes_only(node.children[2])
234
+ elsif SKIPPABLE.include?(node.type)
235
+ next
236
+ elsif CONDITIONAL.include?(node.type)
237
+ result.concat get_return_nodes_only(node)
238
+ elsif node.type == :RETURN
239
+ result.concat reduce_to_value_nodes([node.children[0]])
240
+ # Return the result here because the rest of the code is
241
+ # unreachable
242
+ return result
243
+ else
244
+ result.concat get_return_nodes_only(node)
245
+ end
246
+ result.concat reduce_to_value_nodes([nodes.last]) if idx == nodes.length - 1
247
+ end
248
+ result
249
+ end
250
+
251
+ def get_return_nodes_only parent
252
+ return [] unless parent.is_a?(RubyVM::AbstractSyntaxTree::Node)
253
+ result = []
254
+ nodes = parent.children.select{|n| n.is_a?(RubyVM::AbstractSyntaxTree::Node)}
255
+ nodes.each do |node|
256
+ next if SKIPPABLE.include?(node.type)
257
+ if node.type == :RETURN
258
+ result.concat reduce_to_value_nodes([node.children[0]])
259
+ # Return the result here because the rest of the code is
260
+ # unreachable
261
+ return result
262
+ else
263
+ result.concat get_return_nodes_only(node)
264
+ end
265
+ end
266
+ result
267
+ end
268
+
269
+ def reduce_to_value_nodes nodes
270
+ result = []
271
+ nodes.each do |node|
272
+ if !node.is_a?(RubyVM::AbstractSyntaxTree::Node)
273
+ result.push nil
274
+ elsif REDUCEABLE.include?(node.type)
275
+ result.concat get_return_nodes_from_children(node)
276
+ elsif CONDITIONAL.include?(node.type)
277
+ result.concat reduce_to_value_nodes(node.children[1..-1])
278
+ elsif node.type == :RETURN
279
+ if node.children[0].nil?
280
+ result.push nil
281
+ else
282
+ result.concat get_return_nodes(node.children[0])
283
+ end
284
+ elsif node.type == :OR
285
+ result.concat reduce_to_value_nodes(node.children)
286
+ elsif node.type == :BLOCK
287
+ result.concat get_return_nodes_only(node.children[2])
288
+ elsif node.type == :RESBODY
289
+ result.concat reduce_to_value_nodes([node.children[1]])
290
+ else
291
+ result.push node
292
+ end
293
+ end
294
+ result
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end
300
+ end
301
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solargraph/parser/node_processor'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module Rubyvm
8
+ module NodeProcessors
9
+ autoload :ScopeNode, 'solargraph/parser/rubyvm/node_processors/scope_node'
10
+ autoload :BeginNode, 'solargraph/parser/rubyvm/node_processors/begin_node'
11
+ autoload :DefNode, 'solargraph/parser/rubyvm/node_processors/def_node'
12
+ autoload :DefsNode, 'solargraph/parser/rubyvm/node_processors/defs_node'
13
+ autoload :SendNode, 'solargraph/parser/rubyvm/node_processors/send_node'
14
+ autoload :NamespaceNode, 'solargraph/parser/rubyvm/node_processors/namespace_node'
15
+ autoload :SclassNode, 'solargraph/parser/rubyvm/node_processors/sclass_node'
16
+ autoload :ModuleNode, 'solargraph/parser/rubyvm/node_processors/module_node'
17
+ autoload :IvasgnNode, 'solargraph/parser/rubyvm/node_processors/ivasgn_node'
18
+ autoload :CvasgnNode, 'solargraph/parser/rubyvm/node_processors/cvasgn_node'
19
+ autoload :LvasgnNode, 'solargraph/parser/rubyvm/node_processors/lvasgn_node'
20
+ autoload :GvasgnNode, 'solargraph/parser/rubyvm/node_processors/gvasgn_node'
21
+ autoload :CasgnNode, 'solargraph/parser/rubyvm/node_processors/casgn_node'
22
+ autoload :AliasNode, 'solargraph/parser/rubyvm/node_processors/alias_node'
23
+ autoload :ArgsNode, 'solargraph/parser/rubyvm/node_processors/args_node'
24
+ autoload :OptArgNode, 'solargraph/parser/rubyvm/node_processors/opt_arg_node'
25
+ autoload :KwArgNode, 'solargraph/parser/rubyvm/node_processors/kw_arg_node'
26
+ autoload :BlockNode, 'solargraph/parser/rubyvm/node_processors/block_node'
27
+ autoload :OrasgnNode, 'solargraph/parser/rubyvm/node_processors/orasgn_node'
28
+ autoload :SymNode, 'solargraph/parser/rubyvm/node_processors/sym_node'
29
+ autoload :LitNode, 'solargraph/parser/rubyvm/node_processors/lit_node'
30
+ autoload :ResbodyNode, 'solargraph/parser/rubyvm/node_processors/resbody_node'
31
+ end
32
+ end
33
+
34
+ module NodeProcessor
35
+ register :SCOPE, Rubyvm::NodeProcessors::ScopeNode
36
+ register :RESBODY, Rubyvm::NodeProcessors::ResbodyNode
37
+ register :DEFN, Rubyvm::NodeProcessors::DefNode
38
+ register :DEFS, Rubyvm::NodeProcessors::DefsNode
39
+ register :CALL, Rubyvm::NodeProcessors::SendNode
40
+ register :FCALL, Rubyvm::NodeProcessors::SendNode
41
+ register :VCALL, Rubyvm::NodeProcessors::SendNode
42
+ register :CLASS, Rubyvm::NodeProcessors::NamespaceNode
43
+ register :MODULE, Rubyvm::NodeProcessors::NamespaceNode
44
+ register :SCLASS, Rubyvm::NodeProcessors::SclassNode
45
+ register :IASGN, Rubyvm::NodeProcessors::IvasgnNode
46
+ register :CVASGN, Rubyvm::NodeProcessors::CvasgnNode
47
+ register :LASGN, Rubyvm::NodeProcessors::LvasgnNode
48
+ register :DASGN_CURR, Rubyvm::NodeProcessors::LvasgnNode
49
+ register :GASGN, Rubyvm::NodeProcessors::GvasgnNode
50
+ register :CDECL, Rubyvm::NodeProcessors::CasgnNode
51
+ register :ALIAS, Rubyvm::NodeProcessors::AliasNode
52
+ register :ARGS, Rubyvm::NodeProcessors::ArgsNode
53
+ register :OPT_ARG, Rubyvm::NodeProcessors::OptArgNode
54
+ register :KW_ARG, Rubyvm::NodeProcessors::KwArgNode
55
+ register :ITER, Rubyvm::NodeProcessors::BlockNode
56
+ register :LAMBDA, Rubyvm::NodeProcessors::BlockNode
57
+ register :FOR, Rubyvm::NodeProcessors::BlockNode
58
+ register :OP_ASGN_OR, Rubyvm::NodeProcessors::OrasgnNode
59
+ register :LIT, Rubyvm::NodeProcessors::LitNode
60
+ end
61
+ end
62
+ end