solargraph 0.39.7

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/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +28 -0
  5. data/.yardopts +2 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE +21 -0
  8. data/README.md +104 -0
  9. data/Rakefile +14 -0
  10. data/SPONSORS.md +9 -0
  11. data/bin/solargraph +5 -0
  12. data/lib/.rubocop.yml +21 -0
  13. data/lib/solargraph.rb +66 -0
  14. data/lib/solargraph/api_map.rb +745 -0
  15. data/lib/solargraph/api_map/bundler_methods.rb +27 -0
  16. data/lib/solargraph/api_map/cache.rb +66 -0
  17. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  18. data/lib/solargraph/api_map/store.rb +267 -0
  19. data/lib/solargraph/bundle.rb +26 -0
  20. data/lib/solargraph/complex_type.rb +213 -0
  21. data/lib/solargraph/complex_type/type_methods.rb +127 -0
  22. data/lib/solargraph/complex_type/unique_type.rb +75 -0
  23. data/lib/solargraph/convention.rb +38 -0
  24. data/lib/solargraph/convention/base.rb +25 -0
  25. data/lib/solargraph/convention/gemfile.rb +18 -0
  26. data/lib/solargraph/convention/gemspec.rb +25 -0
  27. data/lib/solargraph/convention/rspec.rb +24 -0
  28. data/lib/solargraph/converters/dd.rb +12 -0
  29. data/lib/solargraph/converters/dl.rb +12 -0
  30. data/lib/solargraph/converters/dt.rb +12 -0
  31. data/lib/solargraph/converters/misc.rb +1 -0
  32. data/lib/solargraph/core_fills.rb +159 -0
  33. data/lib/solargraph/diagnostics.rb +55 -0
  34. data/lib/solargraph/diagnostics/base.rb +29 -0
  35. data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
  36. data/lib/solargraph/diagnostics/rubocop.rb +90 -0
  37. data/lib/solargraph/diagnostics/rubocop_helpers.rb +64 -0
  38. data/lib/solargraph/diagnostics/severities.rb +15 -0
  39. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  40. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  41. data/lib/solargraph/documentor.rb +76 -0
  42. data/lib/solargraph/environ.rb +40 -0
  43. data/lib/solargraph/language_server.rb +19 -0
  44. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  45. data/lib/solargraph/language_server/error_codes.rb +20 -0
  46. data/lib/solargraph/language_server/host.rb +741 -0
  47. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  48. data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
  49. data/lib/solargraph/language_server/host/dispatch.rb +112 -0
  50. data/lib/solargraph/language_server/host/sources.rb +156 -0
  51. data/lib/solargraph/language_server/message.rb +92 -0
  52. data/lib/solargraph/language_server/message/base.rb +85 -0
  53. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  54. data/lib/solargraph/language_server/message/client.rb +11 -0
  55. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  56. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
  58. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  59. data/lib/solargraph/language_server/message/extended.rb +21 -0
  60. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +95 -0
  61. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  62. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  63. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
  64. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  66. data/lib/solargraph/language_server/message/initialize.rb +153 -0
  67. data/lib/solargraph/language_server/message/initialized.rb +26 -0
  68. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  69. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  70. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  71. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  72. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  73. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  74. data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
  75. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  76. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  77. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  78. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  79. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  80. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  81. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  82. data/lib/solargraph/language_server/message/text_document/formatting.rb +78 -0
  83. data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
  84. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  85. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  86. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  87. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  88. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
  89. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  90. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
  91. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
  92. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  93. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  94. data/lib/solargraph/language_server/message_types.rb +14 -0
  95. data/lib/solargraph/language_server/request.rb +24 -0
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  97. data/lib/solargraph/language_server/transport.rb +13 -0
  98. data/lib/solargraph/language_server/transport/adapter.rb +56 -0
  99. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  101. data/lib/solargraph/library.rb +414 -0
  102. data/lib/solargraph/location.rb +37 -0
  103. data/lib/solargraph/logging.rb +27 -0
  104. data/lib/solargraph/page.rb +83 -0
  105. data/lib/solargraph/parser.rb +26 -0
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  107. data/lib/solargraph/parser/legacy.rb +12 -0
  108. data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
  109. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  110. data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
  111. data/lib/solargraph/parser/legacy/node_methods.rb +300 -0
  112. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  113. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  114. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  115. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  116. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
  117. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
  118. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  119. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  120. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  121. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  122. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  123. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  124. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  125. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  126. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  127. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
  128. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +234 -0
  129. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  130. data/lib/solargraph/parser/node_methods.rb +43 -0
  131. data/lib/solargraph/parser/node_processor.rb +43 -0
  132. data/lib/solargraph/parser/node_processor/base.rb +77 -0
  133. data/lib/solargraph/parser/region.rb +66 -0
  134. data/lib/solargraph/parser/rubyvm.rb +40 -0
  135. data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
  136. data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
  137. data/lib/solargraph/parser/rubyvm/node_methods.rb +284 -0
  138. data/lib/solargraph/parser/rubyvm/node_processors.rb +61 -0
  139. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  140. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +62 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +31 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +255 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  160. data/lib/solargraph/parser/snippet.rb +13 -0
  161. data/lib/solargraph/pin.rb +39 -0
  162. data/lib/solargraph/pin/attribute.rb +49 -0
  163. data/lib/solargraph/pin/base.rb +296 -0
  164. data/lib/solargraph/pin/base_method.rb +141 -0
  165. data/lib/solargraph/pin/base_variable.rb +84 -0
  166. data/lib/solargraph/pin/block.rb +48 -0
  167. data/lib/solargraph/pin/class_variable.rb +8 -0
  168. data/lib/solargraph/pin/closure.rb +37 -0
  169. data/lib/solargraph/pin/common.rb +70 -0
  170. data/lib/solargraph/pin/constant.rb +43 -0
  171. data/lib/solargraph/pin/conversions.rb +97 -0
  172. data/lib/solargraph/pin/documenting.rb +110 -0
  173. data/lib/solargraph/pin/duck_method.rb +16 -0
  174. data/lib/solargraph/pin/global_variable.rb +8 -0
  175. data/lib/solargraph/pin/instance_variable.rb +30 -0
  176. data/lib/solargraph/pin/keyword.rb +15 -0
  177. data/lib/solargraph/pin/keyword_param.rb +8 -0
  178. data/lib/solargraph/pin/local_variable.rb +21 -0
  179. data/lib/solargraph/pin/localized.rb +43 -0
  180. data/lib/solargraph/pin/method.rb +111 -0
  181. data/lib/solargraph/pin/method_alias.rb +31 -0
  182. data/lib/solargraph/pin/namespace.rb +85 -0
  183. data/lib/solargraph/pin/parameter.rb +206 -0
  184. data/lib/solargraph/pin/proxy_type.rb +29 -0
  185. data/lib/solargraph/pin/reference.rb +14 -0
  186. data/lib/solargraph/pin/reference/extend.rb +10 -0
  187. data/lib/solargraph/pin/reference/include.rb +10 -0
  188. data/lib/solargraph/pin/reference/override.rb +29 -0
  189. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  190. data/lib/solargraph/pin/reference/require.rb +14 -0
  191. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  192. data/lib/solargraph/pin/singleton.rb +11 -0
  193. data/lib/solargraph/pin/symbol.rb +47 -0
  194. data/lib/solargraph/pin/yard_pin.rb +12 -0
  195. data/lib/solargraph/pin/yard_pin/constant.rb +25 -0
  196. data/lib/solargraph/pin/yard_pin/method.rb +65 -0
  197. data/lib/solargraph/pin/yard_pin/namespace.rb +27 -0
  198. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +26 -0
  199. data/lib/solargraph/position.rb +112 -0
  200. data/lib/solargraph/range.rb +95 -0
  201. data/lib/solargraph/server_methods.rb +16 -0
  202. data/lib/solargraph/shell.rb +221 -0
  203. data/lib/solargraph/source.rb +533 -0
  204. data/lib/solargraph/source/chain.rb +172 -0
  205. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  206. data/lib/solargraph/source/chain/call.rb +203 -0
  207. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  208. data/lib/solargraph/source/chain/constant.rb +75 -0
  209. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  210. data/lib/solargraph/source/chain/head.rb +35 -0
  211. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  212. data/lib/solargraph/source/chain/link.rb +67 -0
  213. data/lib/solargraph/source/chain/literal.rb +23 -0
  214. data/lib/solargraph/source/chain/or.rb +23 -0
  215. data/lib/solargraph/source/chain/variable.rb +13 -0
  216. data/lib/solargraph/source/chain/z_super.rb +184 -0
  217. data/lib/solargraph/source/change.rb +79 -0
  218. data/lib/solargraph/source/cursor.rb +164 -0
  219. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  220. data/lib/solargraph/source/source_chainer.rb +189 -0
  221. data/lib/solargraph/source/updater.rb +54 -0
  222. data/lib/solargraph/source_map.rb +170 -0
  223. data/lib/solargraph/source_map/clip.rb +190 -0
  224. data/lib/solargraph/source_map/completion.rb +23 -0
  225. data/lib/solargraph/source_map/mapper.rb +199 -0
  226. data/lib/solargraph/stdlib_fills.rb +32 -0
  227. data/lib/solargraph/type_checker.rb +498 -0
  228. data/lib/solargraph/type_checker/checks.rb +95 -0
  229. data/lib/solargraph/type_checker/param_def.rb +35 -0
  230. data/lib/solargraph/type_checker/problem.rb +32 -0
  231. data/lib/solargraph/type_checker/rules.rb +53 -0
  232. data/lib/solargraph/version.rb +5 -0
  233. data/lib/solargraph/views/_method.erb +62 -0
  234. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  235. data/lib/solargraph/views/_namespace.erb +24 -0
  236. data/lib/solargraph/views/document.erb +23 -0
  237. data/lib/solargraph/views/environment.erb +58 -0
  238. data/lib/solargraph/views/layout.erb +44 -0
  239. data/lib/solargraph/views/search.erb +11 -0
  240. data/lib/solargraph/workspace.rb +209 -0
  241. data/lib/solargraph/workspace/config.rb +215 -0
  242. data/lib/solargraph/yard_map.rb +420 -0
  243. data/lib/solargraph/yard_map/cache.rb +19 -0
  244. data/lib/solargraph/yard_map/core_docs.rb +170 -0
  245. data/lib/solargraph/yard_map/core_gen.rb +76 -0
  246. data/lib/solargraph/yard_map/mapper.rb +71 -0
  247. data/lib/solargraph/yard_map/rdoc_to_yard.rb +136 -0
  248. data/lib/yard-solargraph.rb +30 -0
  249. data/solargraph.gemspec +41 -0
  250. data/travis-bundler.rb +11 -0
  251. data/yardoc/2.2.2.tar.gz +0 -0
  252. metadata +575 -0
@@ -0,0 +1,300 @@
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
+ result = {}
102
+ node.children.each do |pair|
103
+ result[pair.children[0].children[0]] = Solargraph::Parser.chain(pair.children[1])
104
+ end
105
+ result
106
+ end
107
+
108
+ NIL_NODE = ::Parser::AST::Node.new(:nil)
109
+
110
+ def const_nodes_from node
111
+ return [] unless Parser.is_ast_node?(node)
112
+ result = []
113
+ if node.type == :const
114
+ result.push node
115
+ else
116
+ node.children.each { |child| result.concat const_nodes_from(child) }
117
+ end
118
+ result
119
+ end
120
+
121
+ # @todo Temporarily here for testing. Move to Solargraph::Parser.
122
+ def call_nodes_from node
123
+ return [] unless node.is_a?(::Parser::AST::Node)
124
+ result = []
125
+ if node.type == :block
126
+ result.push node
127
+ node.children[0].children[2..-1].each { |child| result.concat call_nodes_from(child) }
128
+ node.children[1..-1].each { |child| result.concat call_nodes_from(child) }
129
+ elsif node.type == :send
130
+ result.push node
131
+ node.children[2..-1].each { |child| result.concat call_nodes_from(child) }
132
+ elsif [:super, :zsuper].include?(node.type)
133
+ result.push node
134
+ node.children.each { |child| result.concat call_nodes_from(child) }
135
+ elsif node.type == :masgn
136
+ # @todo We're treating a mass assignment as a call node, but the
137
+ # type checker still needs the logic to handle it.
138
+ result.push node
139
+ else
140
+ node.children.each { |child| result.concat call_nodes_from(child) }
141
+ end
142
+ result
143
+ end
144
+
145
+ # Find all the nodes within the provided node that potentially return a
146
+ # value.
147
+ #
148
+ # The node parameter typically represents a method's logic, e.g., the
149
+ # second child (after the :args node) of a :def node. A simple one-line
150
+ # method would typically return itself, while a node with conditions
151
+ # would return the resulting node from each conditional branch. Nodes
152
+ # that follow a :return node are assumed to be unreachable. Nil values
153
+ # are converted to nil node types.
154
+ #
155
+ # @param node [Parser::AST::Node]
156
+ # @return [Array<Parser::AST::Node>]
157
+ def returns_from node
158
+ DeepInference.get_return_nodes(node).map { |n| n || NIL_NODE }
159
+ end
160
+
161
+ # @param cursor [Solargraph::Source::Cursor]
162
+ def find_recipient_node cursor
163
+ source = cursor.source
164
+ position = cursor.position
165
+ offset = cursor.offset
166
+ tree = if source.synchronized?
167
+ match = source.code[0..offset-1].match(/,\s*\z/)
168
+ if match
169
+ source.tree_at(position.line, position.column - match[0].length)
170
+ else
171
+ source.tree_at(position.line, position.column)
172
+ end
173
+ else
174
+ source.tree_at(position.line, position.column - 1)
175
+ end
176
+ prev = nil
177
+ tree.each do |node|
178
+ if node.type == :send
179
+ args = node.children[2..-1]
180
+ if !args.empty?
181
+ return node if prev && args.include?(prev)
182
+ else
183
+ if source.synchronized?
184
+ return node if source.code[0..offset-1] =~ /\(\s*\z/ && source.code[offset..-1] =~ /^\s*\)/
185
+ else
186
+ return node if source.code[0..offset-1] =~ /\([^\(]*\z/
187
+ end
188
+ end
189
+ end
190
+ prev = node
191
+ end
192
+ nil
193
+ end
194
+
195
+ module DeepInference
196
+ class << self
197
+ CONDITIONAL = [:if, :unless]
198
+ REDUCEABLE = [:begin, :kwbegin]
199
+ SKIPPABLE = [:def, :defs, :class, :sclass, :module]
200
+
201
+ # @param node [Parser::AST::Node]
202
+ # @return [Array<Parser::AST::Node>]
203
+ def get_return_nodes node
204
+ return [] unless node.is_a?(::Parser::AST::Node)
205
+ result = []
206
+ if REDUCEABLE.include?(node.type)
207
+ result.concat get_return_nodes_from_children(node)
208
+ elsif CONDITIONAL.include?(node.type)
209
+ result.concat reduce_to_value_nodes(node.children[1..-1])
210
+ # result.push NIL_NODE unless node.children[2]
211
+ elsif node.type == :or
212
+ result.concat reduce_to_value_nodes(node.children)
213
+ elsif node.type == :return
214
+ result.concat reduce_to_value_nodes([node.children[0]])
215
+ elsif node.type == :block
216
+ result.push node
217
+ result.concat get_return_nodes_only(node.children[2])
218
+ elsif node.type == :case
219
+ node.children[1..-1].each do |cc|
220
+ if cc.nil?
221
+ result.push NIL_NODE
222
+ else
223
+ result.concat reduce_to_value_nodes(cc.children[1..-2]) unless cc.children.length < 1
224
+ result.concat reduce_to_value_nodes([cc.children.last])
225
+ end
226
+ end
227
+ else
228
+ result.push node
229
+ end
230
+ result
231
+ end
232
+
233
+ private
234
+
235
+ def get_return_nodes_from_children parent
236
+ result = []
237
+ nodes = parent.children.select{|n| n.is_a?(AST::Node)}
238
+ nodes.each_with_index do |node, idx|
239
+ if node.type == :block
240
+ result.concat get_return_nodes_only(node.children[2])
241
+ elsif SKIPPABLE.include?(node.type)
242
+ next
243
+ elsif node.type == :return
244
+ result.concat reduce_to_value_nodes([node.children[0]])
245
+ # Return the result here because the rest of the code is
246
+ # unreachable
247
+ return result
248
+ else
249
+ result.concat get_return_nodes_only(node)
250
+ end
251
+ result.concat reduce_to_value_nodes([nodes.last]) if idx == nodes.length - 1
252
+ end
253
+ result
254
+ end
255
+
256
+ def get_return_nodes_only parent
257
+ return [] unless parent.is_a?(::Parser::AST::Node)
258
+ result = []
259
+ nodes = parent.children.select{|n| n.is_a?(::Parser::AST::Node)}
260
+ nodes.each do |node|
261
+ next if SKIPPABLE.include?(node.type)
262
+ if node.type == :return
263
+ result.concat reduce_to_value_nodes([node.children[0]])
264
+ # Return the result here because the rest of the code is
265
+ # unreachable
266
+ return result
267
+ else
268
+ result.concat get_return_nodes_only(node)
269
+ end
270
+ end
271
+ result
272
+ end
273
+
274
+ def reduce_to_value_nodes nodes
275
+ result = []
276
+ nodes.each do |node|
277
+ if !node.is_a?(::Parser::AST::Node)
278
+ result.push nil
279
+ elsif REDUCEABLE.include?(node.type)
280
+ result.concat get_return_nodes_from_children(node)
281
+ elsif CONDITIONAL.include?(node.type)
282
+ result.concat reduce_to_value_nodes(node.children[1..-1])
283
+ elsif node.type == :return
284
+ result.concat reduce_to_value_nodes([node.children[0]])
285
+ elsif node.type == :or
286
+ result.concat reduce_to_value_nodes(node.children)
287
+ elsif node.type == :block
288
+ result.concat get_return_nodes_only(node.children[2])
289
+ else
290
+ result.push node
291
+ end
292
+ end
293
+ result
294
+ end
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end
300
+ 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