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,311 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parser'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module Legacy
8
+ module NodeMethods
9
+ module_function
10
+
11
+ # @param node [Parser::AST::Node]
12
+ # @return [String]
13
+ def unpack_name(node)
14
+ pack_name(node).join("::")
15
+ end
16
+
17
+ # @param node [Parser::AST::Node]
18
+ # @return [Array<String>]
19
+ def pack_name(node)
20
+ parts = []
21
+ if node.is_a?(AST::Node)
22
+ node.children.each { |n|
23
+ if n.is_a?(AST::Node)
24
+ if n.type == :cbase
25
+ parts = [''] + pack_name(n)
26
+ else
27
+ parts += pack_name(n)
28
+ end
29
+ else
30
+ parts.push n unless n.nil?
31
+ end
32
+ }
33
+ end
34
+ parts
35
+ end
36
+
37
+ # @param node [Parser::AST::Node]
38
+ # @return [String, nil]
39
+ def infer_literal_node_type node
40
+ return nil unless node.is_a?(AST::Node)
41
+ if node.type == :str || node.type == :dstr
42
+ return '::String'
43
+ elsif node.type == :array
44
+ return '::Array'
45
+ elsif node.type == :hash
46
+ return '::Hash'
47
+ elsif node.type == :int
48
+ return '::Integer'
49
+ elsif node.type == :float
50
+ return '::Float'
51
+ elsif node.type == :sym
52
+ return '::Symbol'
53
+ elsif node.type == :regexp
54
+ return '::Regexp'
55
+ elsif node.type == :irange
56
+ return '::Range'
57
+ elsif node.type == :true || node.type == :false
58
+ return '::Boolean'
59
+ # @todo Support `nil` keyword in types
60
+ # elsif node.type == :nil
61
+ # return 'NilClass'
62
+ end
63
+ nil
64
+ end
65
+
66
+ # @param node [Parser::AST::Node]
67
+ # @return [Position]
68
+ def get_node_start_position(node)
69
+ Position.new(node.loc.line, node.loc.column)
70
+ end
71
+
72
+ # @param node [Parser::AST::Node]
73
+ # @return [Position]
74
+ def get_node_end_position(node)
75
+ Position.new(node.loc.last_line, node.loc.last_column)
76
+ end
77
+
78
+ def drill_signature node, signature
79
+ return signature unless node.is_a?(AST::Node)
80
+ if node.type == :const or node.type == :cbase
81
+ unless node.children[0].nil?
82
+ signature += drill_signature(node.children[0], signature)
83
+ end
84
+ signature += '::' unless signature.empty?
85
+ signature += node.children[1].to_s
86
+ elsif node.type == :lvar or node.type == :ivar or node.type == :cvar
87
+ signature += '.' unless signature.empty?
88
+ signature += node.children[0].to_s
89
+ elsif node.type == :send
90
+ unless node.children[0].nil?
91
+ signature += drill_signature(node.children[0], signature)
92
+ end
93
+ signature += '.' unless signature.empty?
94
+ signature += node.children[1].to_s
95
+ end
96
+ signature
97
+ end
98
+
99
+ def convert_hash node
100
+ return {} unless Parser.is_ast_node?(node) && node.type == :hash
101
+ return convert_hash(node.children[0].children[0]) if splatted_hash?(node)
102
+ result = {}
103
+ node.children.each do |pair|
104
+ result[pair.children[0].children[0]] = Solargraph::Parser.chain(pair.children[1])
105
+ end
106
+ result
107
+ end
108
+
109
+ NIL_NODE = ::Parser::AST::Node.new(:nil)
110
+
111
+ def const_nodes_from node
112
+ return [] unless Parser.is_ast_node?(node)
113
+ result = []
114
+ if node.type == :const
115
+ result.push node
116
+ else
117
+ node.children.each { |child| result.concat const_nodes_from(child) }
118
+ end
119
+ result
120
+ end
121
+
122
+ def splatted_hash? node
123
+ Parser.is_ast_node?(node.children[0]) && node.children[0].type == :kwsplat
124
+ end
125
+
126
+ def splatted_call? node
127
+ Parser.is_ast_node?(node.children[0]) && node.children[0].type == :kwsplat && node.children[0].children[0].type != :hash
128
+ end
129
+
130
+ # @todo Temporarily here for testing. Move to Solargraph::Parser.
131
+ def call_nodes_from node
132
+ return [] unless node.is_a?(::Parser::AST::Node)
133
+ result = []
134
+ if node.type == :block
135
+ result.push node
136
+ if Parser.is_ast_node?(node.children[0]) && node.children[0].children.length > 2
137
+ node.children[0].children[2..-1].each { |child| result.concat call_nodes_from(child) }
138
+ end
139
+ node.children[1..-1].each { |child| result.concat call_nodes_from(child) }
140
+ elsif node.type == :send
141
+ result.push node
142
+ node.children[2..-1].each { |child| result.concat call_nodes_from(child) }
143
+ elsif [:super, :zsuper].include?(node.type)
144
+ result.push node
145
+ node.children.each { |child| result.concat call_nodes_from(child) }
146
+ elsif node.type == :masgn
147
+ # @todo We're treating a mass assignment as a call node, but the
148
+ # type checker still needs the logic to handle it.
149
+ result.push node
150
+ else
151
+ node.children.each { |child| result.concat call_nodes_from(child) }
152
+ end
153
+ result
154
+ end
155
+
156
+ # Find all the nodes within the provided node that potentially return a
157
+ # value.
158
+ #
159
+ # The node parameter typically represents a method's logic, e.g., the
160
+ # second child (after the :args node) of a :def node. A simple one-line
161
+ # method would typically return itself, while a node with conditions
162
+ # would return the resulting node from each conditional branch. Nodes
163
+ # that follow a :return node are assumed to be unreachable. Nil values
164
+ # are converted to nil node types.
165
+ #
166
+ # @param node [Parser::AST::Node]
167
+ # @return [Array<Parser::AST::Node>]
168
+ def returns_from node
169
+ DeepInference.get_return_nodes(node).map { |n| n || NIL_NODE }
170
+ end
171
+
172
+ # @param cursor [Solargraph::Source::Cursor]
173
+ def find_recipient_node cursor
174
+ source = cursor.source
175
+ position = cursor.position
176
+ offset = cursor.offset
177
+ tree = if source.synchronized?
178
+ match = source.code[0..offset-1].match(/,\s*\z/)
179
+ if match
180
+ source.tree_at(position.line, position.column - match[0].length)
181
+ else
182
+ source.tree_at(position.line, position.column)
183
+ end
184
+ else
185
+ source.tree_at(position.line, position.column - 1)
186
+ end
187
+ prev = nil
188
+ tree.each do |node|
189
+ if node.type == :send
190
+ args = node.children[2..-1]
191
+ if !args.empty?
192
+ return node if prev && args.include?(prev)
193
+ else
194
+ if source.synchronized?
195
+ return node if source.code[0..offset-1] =~ /\(\s*\z/ && source.code[offset..-1] =~ /^\s*\)/
196
+ else
197
+ return node if source.code[0..offset-1] =~ /\([^\(]*\z/
198
+ end
199
+ end
200
+ end
201
+ prev = node
202
+ end
203
+ nil
204
+ end
205
+
206
+ module DeepInference
207
+ class << self
208
+ CONDITIONAL = [:if, :unless]
209
+ REDUCEABLE = [:begin, :kwbegin]
210
+ SKIPPABLE = [:def, :defs, :class, :sclass, :module]
211
+
212
+ # @param node [Parser::AST::Node]
213
+ # @return [Array<Parser::AST::Node>]
214
+ def get_return_nodes node
215
+ return [] unless node.is_a?(::Parser::AST::Node)
216
+ result = []
217
+ if REDUCEABLE.include?(node.type)
218
+ result.concat get_return_nodes_from_children(node)
219
+ elsif CONDITIONAL.include?(node.type)
220
+ result.concat reduce_to_value_nodes(node.children[1..-1])
221
+ # result.push NIL_NODE unless node.children[2]
222
+ elsif node.type == :or
223
+ result.concat reduce_to_value_nodes(node.children)
224
+ elsif node.type == :return
225
+ result.concat reduce_to_value_nodes([node.children[0]])
226
+ elsif node.type == :block
227
+ result.push node
228
+ result.concat get_return_nodes_only(node.children[2])
229
+ elsif node.type == :case
230
+ node.children[1..-1].each do |cc|
231
+ if cc.nil?
232
+ result.push NIL_NODE
233
+ else
234
+ result.concat reduce_to_value_nodes(cc.children[1..-2]) unless cc.children.length < 1
235
+ result.concat reduce_to_value_nodes([cc.children.last])
236
+ end
237
+ end
238
+ else
239
+ result.push node
240
+ end
241
+ result
242
+ end
243
+
244
+ private
245
+
246
+ def get_return_nodes_from_children parent
247
+ result = []
248
+ nodes = parent.children.select{|n| n.is_a?(AST::Node)}
249
+ nodes.each_with_index do |node, idx|
250
+ if node.type == :block
251
+ result.concat get_return_nodes_only(node.children[2])
252
+ elsif SKIPPABLE.include?(node.type)
253
+ next
254
+ elsif node.type == :return
255
+ result.concat reduce_to_value_nodes([node.children[0]])
256
+ # Return the result here because the rest of the code is
257
+ # unreachable
258
+ return result
259
+ else
260
+ result.concat get_return_nodes_only(node)
261
+ end
262
+ result.concat reduce_to_value_nodes([nodes.last]) if idx == nodes.length - 1
263
+ end
264
+ result
265
+ end
266
+
267
+ def get_return_nodes_only parent
268
+ return [] unless parent.is_a?(::Parser::AST::Node)
269
+ result = []
270
+ nodes = parent.children.select{|n| n.is_a?(::Parser::AST::Node)}
271
+ nodes.each do |node|
272
+ next if SKIPPABLE.include?(node.type)
273
+ if node.type == :return
274
+ result.concat reduce_to_value_nodes([node.children[0]])
275
+ # Return the result here because the rest of the code is
276
+ # unreachable
277
+ return result
278
+ else
279
+ result.concat get_return_nodes_only(node)
280
+ end
281
+ end
282
+ result
283
+ end
284
+
285
+ def reduce_to_value_nodes nodes
286
+ result = []
287
+ nodes.each do |node|
288
+ if !node.is_a?(::Parser::AST::Node)
289
+ result.push nil
290
+ elsif REDUCEABLE.include?(node.type)
291
+ result.concat get_return_nodes_from_children(node)
292
+ elsif CONDITIONAL.include?(node.type)
293
+ result.concat reduce_to_value_nodes(node.children[1..-1])
294
+ elsif node.type == :return
295
+ result.concat reduce_to_value_nodes([node.children[0]])
296
+ elsif node.type == :or
297
+ result.concat reduce_to_value_nodes(node.children)
298
+ elsif node.type == :block
299
+ result.concat get_return_nodes_only(node.children[2])
300
+ else
301
+ result.push node
302
+ end
303
+ end
304
+ result
305
+ end
306
+ end
307
+ end
308
+ end
309
+ end
310
+ end
311
+ 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,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ module NodeProcessors
7
+ class AliasNode < Parser::NodeProcessor::Base
8
+ def process
9
+ loc = get_node_location(node)
10
+ pins.push Solargraph::Pin::MethodAlias.new(
11
+ location: loc,
12
+ closure: region.closure,
13
+ name: node.children[0].children[0].to_s,
14
+ original: node.children[1].children[0].to_s,
15
+ scope: region.scope || :instance
16
+ )
17
+ process_children
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ module NodeProcessors
7
+ class ArgsNode < Parser::NodeProcessor::Base
8
+ def process
9
+ node.children.each do |u|
10
+ loc = get_node_location(u)
11
+ locals.push Solargraph::Pin::Parameter.new(
12
+ location: loc,
13
+ closure: region.closure,
14
+ comments: comments_for(node),
15
+ name: u.children[0].to_s,
16
+ assignment: u.children[1],
17
+ asgn_code: u.children[1] ? region.code_for(u.children[1]) : nil,
18
+ presence: region.closure.location.range,
19
+ decl: get_decl(u)
20
+ )
21
+ region.closure.parameters.push locals.last
22
+ end
23
+ process_children
24
+ end
25
+
26
+ private
27
+
28
+ def get_decl node
29
+ node.type
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ module NodeProcessors
7
+ class BeginNode < Parser::NodeProcessor::Base
8
+ def process
9
+ process_children
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ module NodeProcessors
7
+ class BlockNode < Parser::NodeProcessor::Base
8
+ def process
9
+ pins.push Solargraph::Pin::Block.new(
10
+ location: get_node_location(node),
11
+ closure: region.closure,
12
+ receiver: node.children[0],
13
+ comments: comments_for(node),
14
+ scope: region.scope || region.closure.context.scope
15
+ )
16
+ process_children region.update(closure: pins.last)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end