solargraph 0.44.2 → 0.46.0

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