solargraph 0.46.0 → 0.47.2

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 -41
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1130 -1115
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -128
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +17 -18
  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 -686
  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 +225 -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 -30
  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 -53
  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 +56 -54
  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 -135
  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 -144
  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 -63
  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 -63
  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 +73 -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 -201
  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 -56
  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 -37
  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 +239 -212
  220. data/lib/solargraph/source_map.rb +180 -180
  221. data/lib/solargraph/type_checker/checks.rb +112 -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 -543
  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 -215
  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 -208
  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 -460
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +12 -12
@@ -1,144 +1,144 @@
1
- require 'solargraph/parser/rubyvm/node_processors'
2
-
3
- module Solargraph
4
- module Parser
5
- module Rubyvm
6
- module ClassMethods
7
- # @param code [String]
8
- # @param filename [String]
9
- # @return [Array(Parser::AST::Node, Array<Parser::Source::Comment>)]
10
- def parse_with_comments code, filename = nil
11
- node = RubyVM::AbstractSyntaxTree.parse(code).children[2]
12
- comments = CommentRipper.new(code).parse
13
- [node, comments]
14
- rescue ::SyntaxError => e
15
- raise Parser::SyntaxError, e.message
16
- end
17
-
18
- # @param code [String]
19
- # @param filename [String, nil]
20
- # @param line [Integer]
21
- # @return [Parser::AST::Node]
22
- def parse code, filename = nil, line = 0
23
- RubyVM::AbstractSyntaxTree.parse(code).children[2]
24
- rescue ::SyntaxError => e
25
- raise Parser::SyntaxError, e.message
26
- end
27
-
28
- def map source
29
- NodeProcessor.process(source.node, Region.new(source: source))
30
- end
31
-
32
- def references source, name
33
- if name.end_with?("=")
34
- reg = /#{Regexp.escape name[0..-2]}\s*=/
35
- extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
36
- else
37
- extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
38
- end
39
- inner_node_references(name, source.node).map do |n|
40
- rng = Range.from_node(n)
41
- offset = Position.to_offset(source.code, rng.start)
42
- soff, eoff = extract_offset[source.code, offset]
43
- Location.new(
44
- source.filename,
45
- Range.new(
46
- Position.from_offset(source.code, soff),
47
- Position.from_offset(source.code, eoff)
48
- )
49
- )
50
- end
51
- end
52
-
53
- # @param name [String]
54
- # @param top [AST::Node]
55
- # @return [Array<AST::Node>]
56
- def inner_node_references name, top
57
- result = []
58
- if Parser.rubyvm?
59
- if Parser.is_ast_node?(top)
60
- result.push top if match_rubyvm_node_to_ref(top, name)
61
- top.children.each { |c| result.concat inner_node_references(name, c) }
62
- end
63
- else
64
- if Parser.is_ast_node?(top) && top.to_s.include?(":#{name}")
65
- result.push top if top.children.any? { |c| c.to_s == name }
66
- top.children.each { |c| result.concat inner_node_references(name, c) }
67
- end
68
- end
69
- result
70
- end
71
-
72
- def match_rubyvm_node_to_ref(top, name)
73
- top.children.select { |c| c.is_a?(Symbol) }.any? { |c| c.to_s == name } ||
74
- top.children.select { |c| c.is_a?(Array) }.any? { |c| c.include?(name.to_sym) }
75
- end
76
-
77
- def chain *args
78
- NodeChainer.chain *args
79
- end
80
-
81
- def chain_string *args
82
- NodeChainer.load_string *args
83
- end
84
-
85
- def process_node *args
86
- Solargraph::Parser::NodeProcessor.process *args
87
- end
88
-
89
- def infer_literal_node_type node
90
- NodeMethods.infer_literal_node_type node
91
- end
92
-
93
- def version
94
- Ruby::VERSION
95
- end
96
-
97
- def is_ast_node? node
98
- if Parser.rubyvm?
99
- node.is_a?(RubyVM::AbstractSyntaxTree::Node)
100
- else
101
- node.is_a?(::Parser::AST::Node)
102
- end
103
- end
104
-
105
- def node_range node
106
- st = Position.new(node.first_lineno - 1, node.first_column)
107
- en = Position.new(node.last_lineno - 1, node.last_column)
108
- Range.new(st, en)
109
- end
110
-
111
- def recipient_node tree
112
- tree.each_with_index do |node, idx|
113
- return tree[idx + 1] if [:ARRAY, :ZARRAY, :LIST].include?(node.type) && tree[idx + 1] && [:FCALL, :VCALL, :CALL].include?(tree[idx + 1].type)
114
- end
115
- nil
116
- end
117
-
118
- def string_ranges node
119
- return [] unless is_ast_node?(node)
120
- result = []
121
- if node.type == :STR
122
- result.push Range.from_node(node)
123
- elsif node.type == :DSTR
124
- here = Range.from_node(node)
125
- there = Range.from_node(node.children[1])
126
- result.push Range.new(here.start, there&.start || here.ending)
127
- end
128
- node.children.each do |child|
129
- result.concat string_ranges(child)
130
- end
131
- if node.type == :DSTR && node.children.last.nil?
132
- last = node.children[-2]
133
- unless last.nil?
134
- rng = Range.from_node(last)
135
- pos = Position.new(rng.ending.line, rng.ending.column - 1)
136
- result.push Range.new(pos, pos)
137
- end
138
- end
139
- result
140
- end
141
- end
142
- end
143
- end
144
- end
1
+ require 'solargraph/parser/rubyvm/node_processors'
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Rubyvm
6
+ module ClassMethods
7
+ # @param code [String]
8
+ # @param filename [String]
9
+ # @return [Array(Parser::AST::Node, Array<Parser::Source::Comment>)]
10
+ def parse_with_comments code, filename = nil
11
+ node = RubyVM::AbstractSyntaxTree.parse(code).children[2]
12
+ comments = CommentRipper.new(code).parse
13
+ [node, comments]
14
+ rescue ::SyntaxError => e
15
+ raise Parser::SyntaxError, e.message
16
+ end
17
+
18
+ # @param code [String]
19
+ # @param filename [String, nil]
20
+ # @param line [Integer]
21
+ # @return [Parser::AST::Node]
22
+ def parse code, filename = nil, line = 0
23
+ RubyVM::AbstractSyntaxTree.parse(code).children[2]
24
+ rescue ::SyntaxError => e
25
+ raise Parser::SyntaxError, e.message
26
+ end
27
+
28
+ def map source
29
+ NodeProcessor.process(source.node, Region.new(source: source))
30
+ end
31
+
32
+ def references source, name
33
+ if name.end_with?("=")
34
+ reg = /#{Regexp.escape name[0..-2]}\s*=/
35
+ extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
36
+ else
37
+ extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
38
+ end
39
+ inner_node_references(name, source.node).map do |n|
40
+ rng = Range.from_node(n)
41
+ offset = Position.to_offset(source.code, rng.start)
42
+ soff, eoff = extract_offset[source.code, offset]
43
+ Location.new(
44
+ source.filename,
45
+ Range.new(
46
+ Position.from_offset(source.code, soff),
47
+ Position.from_offset(source.code, eoff)
48
+ )
49
+ )
50
+ end
51
+ end
52
+
53
+ # @param name [String]
54
+ # @param top [AST::Node]
55
+ # @return [Array<AST::Node>]
56
+ def inner_node_references name, top
57
+ result = []
58
+ if Parser.rubyvm?
59
+ if Parser.is_ast_node?(top)
60
+ result.push top if match_rubyvm_node_to_ref(top, name)
61
+ top.children.each { |c| result.concat inner_node_references(name, c) }
62
+ end
63
+ else
64
+ if Parser.is_ast_node?(top) && top.to_s.include?(":#{name}")
65
+ result.push top if top.children.any? { |c| c.to_s == name }
66
+ top.children.each { |c| result.concat inner_node_references(name, c) }
67
+ end
68
+ end
69
+ result
70
+ end
71
+
72
+ def match_rubyvm_node_to_ref(top, name)
73
+ top.children.select { |c| c.is_a?(Symbol) }.any? { |c| c.to_s == name } ||
74
+ top.children.select { |c| c.is_a?(Array) }.any? { |c| c.include?(name.to_sym) }
75
+ end
76
+
77
+ def chain *args
78
+ NodeChainer.chain *args
79
+ end
80
+
81
+ def chain_string *args
82
+ NodeChainer.load_string *args
83
+ end
84
+
85
+ def process_node *args
86
+ Solargraph::Parser::NodeProcessor.process *args
87
+ end
88
+
89
+ def infer_literal_node_type node
90
+ NodeMethods.infer_literal_node_type node
91
+ end
92
+
93
+ def version
94
+ Ruby::VERSION
95
+ end
96
+
97
+ def is_ast_node? node
98
+ if Parser.rubyvm?
99
+ node.is_a?(RubyVM::AbstractSyntaxTree::Node)
100
+ else
101
+ node.is_a?(::Parser::AST::Node)
102
+ end
103
+ end
104
+
105
+ def node_range node
106
+ st = Position.new(node.first_lineno - 1, node.first_column)
107
+ en = Position.new(node.last_lineno - 1, node.last_column)
108
+ Range.new(st, en)
109
+ end
110
+
111
+ def recipient_node tree
112
+ tree.each_with_index do |node, idx|
113
+ return tree[idx + 1] if [:ARRAY, :ZARRAY, :LIST].include?(node.type) && tree[idx + 1] && [:FCALL, :VCALL, :CALL].include?(tree[idx + 1].type)
114
+ end
115
+ nil
116
+ end
117
+
118
+ def string_ranges node
119
+ return [] unless is_ast_node?(node)
120
+ result = []
121
+ if node.type == :STR
122
+ result.push Range.from_node(node)
123
+ elsif node.type == :DSTR
124
+ here = Range.from_node(node)
125
+ there = Range.from_node(node.children[1])
126
+ result.push Range.new(here.start, there&.start || here.ending)
127
+ end
128
+ node.children.each do |child|
129
+ result.concat string_ranges(child)
130
+ end
131
+ if node.type == :DSTR && node.children.last.nil?
132
+ last = node.children[-2]
133
+ unless last.nil?
134
+ rng = Range.from_node(last)
135
+ pos = Position.new(rng.ending.line, rng.ending.column - 1)
136
+ result.push Range.new(pos, pos)
137
+ end
138
+ end
139
+ result
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
@@ -1,160 +1,160 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Rubyvm
6
- # A factory for generating chains from nodes.
7
- #
8
- class NodeChainer
9
- include Rubyvm::NodeMethods
10
-
11
- Chain = Source::Chain
12
-
13
- # @param node [Parser::AST::Node]
14
- # @param filename [String]
15
- def initialize node, filename = nil, in_block = false
16
- @node = node
17
- @filename = filename
18
- @in_block = in_block ? 1 : 0
19
- end
20
-
21
- # @return [Source::Chain]
22
- def chain
23
- links = generate_links(@node)
24
- Chain.new(links, @node, (Parser.is_ast_node?(@node) && @node.type == :SPLAT))
25
- end
26
-
27
- class << self
28
- # @param node [Parser::AST::Node]
29
- # @param filename [String]
30
- # @return [Source::Chain]
31
- def chain node, filename = nil, in_block = false
32
- NodeChainer.new(node, filename, in_block).chain
33
- end
34
-
35
- # @param code [String]
36
- # @return [Source::Chain]
37
- def load_string(code)
38
- node = Parser.parse(code.sub(/\.$/, ''))
39
- chain = NodeChainer.new(node).chain
40
- chain.links.push(Chain::Link.new) if code.end_with?('.')
41
- chain
42
- end
43
- end
44
-
45
- private
46
-
47
- # @param n [Parser::AST::Node]
48
- # @return [Array<Chain::Link>]
49
- def generate_links n
50
- return [] unless Parser.is_ast_node?(n)
51
- return generate_links(n.children[2]) if n.type == :SCOPE
52
- return generate_links(n.children[0]) if n.type == :SPLAT
53
- result = []
54
- if n.type == :ITER
55
- @in_block += 1
56
- result.concat generate_links(n.children[0])
57
- @in_block -= 1
58
- elsif n.type == :CALL || n.type == :OPCALL
59
- n.children[0..-3].each do |c|
60
- result.concat generate_links(c)
61
- end
62
- result.push Chain::Call.new(n.children[-2].to_s, node_to_argchains(n.children.last), @in_block > 0 || block_passed?(n))
63
- elsif n.type == :QCALL
64
- n.children[0..-3].each do |c|
65
- result.concat generate_links(c)
66
- end
67
- result.push Chain::QCall.new(n.children[-2].to_s, node_to_argchains(n.children.last), @in_block > 0 || block_passed?(n))
68
- elsif n.type == :ATTRASGN
69
- result.concat generate_links(n.children[0])
70
- result.push Chain::Call.new(n.children[1].to_s, node_to_argchains(n.children[2]), @in_block > 0 || block_passed?(n))
71
- elsif n.type == :VCALL
72
- result.push Chain::Call.new(n.children[0].to_s, [], @in_block > 0 || block_passed?(n))
73
- elsif n.type == :FCALL
74
- result.push Chain::Call.new(n.children[0].to_s, node_to_argchains(n.children[1]), @in_block > 0 || block_passed?(n))
75
- elsif n.type == :SELF
76
- result.push Chain::Head.new('self')
77
- elsif n.type == :ZSUPER
78
- result.push Chain::ZSuper.new('super', @in_block > 0 || block_passed?(n))
79
- elsif n.type == :SUPER
80
- result.push Chain::Call.new('super', node_to_argchains(n.children.last), @in_block > 0 || block_passed?(n))
81
- elsif [:COLON2, :COLON3, :CONST].include?(n.type)
82
- const = unpack_name(n)
83
- result.push Chain::Constant.new(const)
84
- elsif [:LVAR, :LASGN, :DVAR].include?(n.type)
85
- result.push Chain::Call.new(n.children[0].to_s)
86
- elsif [:IVAR, :IASGN].include?(n.type)
87
- result.push Chain::InstanceVariable.new(n.children[0].to_s)
88
- elsif [:CVAR, :CVASGN].include?(n.type)
89
- result.push Chain::ClassVariable.new(n.children[0].to_s)
90
- elsif [:GVAR, :GASGN].include?(n.type)
91
- result.push Chain::GlobalVariable.new(n.children[0].to_s)
92
- elsif n.type == :OP_ASGN_OR
93
- result.concat generate_links n.children[2]
94
- elsif [:class, :module, :def, :defs].include?(n.type)
95
- # @todo Undefined or what?
96
- result.push Chain::UNDEFINED_CALL
97
- elsif n.type == :AND
98
- result.concat generate_links(n.children.last)
99
- elsif n.type == :OR
100
- result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename)])
101
- elsif n.type == :begin
102
- result.concat generate_links(n.children[0])
103
- elsif n.type == :BLOCK_PASS
104
- result.push Chain::BlockVariable.new("&#{n.children[1].children[0].to_s}")
105
- elsif n.type == :HASH
106
- result.push Chain::Hash.new('::Hash', hash_is_splatted?(n))
107
- else
108
- lit = infer_literal_node_type(n)
109
- if lit
110
- if lit == '::Hash'
111
- result.push Chain::Hash.new(lit, hash_is_splatted?(n))
112
- else
113
- result.push Chain::Literal.new(lit)
114
- end
115
- else
116
- result.push Chain::Link.new
117
- end
118
- # result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
119
- end
120
- result
121
- end
122
-
123
- def hash_is_splatted? node
124
- return false unless Parser.is_ast_node?(node.children[0]) && node.children[0].type == :LIST
125
- list = node.children[0].children
126
- eol = list.rindex(&:nil?)
127
- eol && Parser.is_ast_node?(list[eol + 1])
128
- end
129
-
130
- def block_passed? node
131
- node.children.last.is_a?(RubyVM::AbstractSyntaxTree::Node) && node.children.last.type == :BLOCK_PASS
132
- end
133
-
134
- def node_to_argchains node
135
- return [] unless Parser.is_ast_node?(node)
136
- if [:ZARRAY, :ARRAY, :LIST].include?(node.type)
137
- node.children[0..-2].map { |c| NodeChainer.chain(c) }
138
- elsif node.type == :SPLAT
139
- [NodeChainer.chain(node)]
140
- elsif node.type == :ARGSPUSH
141
- result = node_to_argchains(node.children[0])
142
- result.push NodeChainer.chain(node.children[1]) if Parser.is_ast_node?(node.children[1])
143
- elsif node.type == :ARGSCAT
144
- result = node.children[0].children[0..-2].map { |c| NodeChainer.chain(c) }
145
- result.push NodeChainer.chain(node.children[1])
146
- # @todo Smelly instance variable access
147
- result.last.instance_variable_set(:@splat, true)
148
- result
149
- elsif node.type == :BLOCK_PASS
150
- result = node_to_argchains(node.children[0])
151
- result.push Chain.new([Chain::BlockVariable.new("&#{node.children[1].children[0].to_s}")])
152
- result
153
- else
154
- []
155
- end
156
- end
157
- end
158
- end
159
- end
160
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Rubyvm
6
+ # A factory for generating chains from nodes.
7
+ #
8
+ class NodeChainer
9
+ include Rubyvm::NodeMethods
10
+
11
+ Chain = Source::Chain
12
+
13
+ # @param node [Parser::AST::Node]
14
+ # @param filename [String]
15
+ def initialize node, filename = nil, in_block = false
16
+ @node = node
17
+ @filename = filename
18
+ @in_block = in_block ? 1 : 0
19
+ end
20
+
21
+ # @return [Source::Chain]
22
+ def chain
23
+ links = generate_links(@node)
24
+ Chain.new(links, @node, (Parser.is_ast_node?(@node) && @node.type == :SPLAT))
25
+ end
26
+
27
+ class << self
28
+ # @param node [Parser::AST::Node]
29
+ # @param filename [String]
30
+ # @return [Source::Chain]
31
+ def chain node, filename = nil, in_block = false
32
+ NodeChainer.new(node, filename, in_block).chain
33
+ end
34
+
35
+ # @param code [String]
36
+ # @return [Source::Chain]
37
+ def load_string(code)
38
+ node = Parser.parse(code.sub(/\.$/, ''))
39
+ chain = NodeChainer.new(node).chain
40
+ chain.links.push(Chain::Link.new) if code.end_with?('.')
41
+ chain
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ # @param n [Parser::AST::Node]
48
+ # @return [Array<Chain::Link>]
49
+ def generate_links n
50
+ return [] unless Parser.is_ast_node?(n)
51
+ return generate_links(n.children[2]) if n.type == :SCOPE
52
+ return generate_links(n.children[0]) if n.type == :SPLAT
53
+ result = []
54
+ if n.type == :ITER
55
+ @in_block += 1
56
+ result.concat generate_links(n.children[0])
57
+ @in_block -= 1
58
+ elsif n.type == :CALL || n.type == :OPCALL
59
+ n.children[0..-3].each do |c|
60
+ result.concat generate_links(c)
61
+ end
62
+ result.push Chain::Call.new(n.children[-2].to_s, node_to_argchains(n.children.last), @in_block > 0 || block_passed?(n))
63
+ elsif n.type == :QCALL
64
+ n.children[0..-3].each do |c|
65
+ result.concat generate_links(c)
66
+ end
67
+ result.push Chain::QCall.new(n.children[-2].to_s, node_to_argchains(n.children.last), @in_block > 0 || block_passed?(n))
68
+ elsif n.type == :ATTRASGN
69
+ result.concat generate_links(n.children[0])
70
+ result.push Chain::Call.new(n.children[1].to_s, node_to_argchains(n.children[2]), @in_block > 0 || block_passed?(n))
71
+ elsif n.type == :VCALL
72
+ result.push Chain::Call.new(n.children[0].to_s, [], @in_block > 0 || block_passed?(n))
73
+ elsif n.type == :FCALL
74
+ result.push Chain::Call.new(n.children[0].to_s, node_to_argchains(n.children[1]), @in_block > 0 || block_passed?(n))
75
+ elsif n.type == :SELF
76
+ result.push Chain::Head.new('self')
77
+ elsif n.type == :ZSUPER
78
+ result.push Chain::ZSuper.new('super', @in_block > 0 || block_passed?(n))
79
+ elsif n.type == :SUPER
80
+ result.push Chain::Call.new('super', node_to_argchains(n.children.last), @in_block > 0 || block_passed?(n))
81
+ elsif [:COLON2, :COLON3, :CONST].include?(n.type)
82
+ const = unpack_name(n)
83
+ result.push Chain::Constant.new(const)
84
+ elsif [:LVAR, :LASGN, :DVAR].include?(n.type)
85
+ result.push Chain::Call.new(n.children[0].to_s)
86
+ elsif [:IVAR, :IASGN].include?(n.type)
87
+ result.push Chain::InstanceVariable.new(n.children[0].to_s)
88
+ elsif [:CVAR, :CVASGN].include?(n.type)
89
+ result.push Chain::ClassVariable.new(n.children[0].to_s)
90
+ elsif [:GVAR, :GASGN].include?(n.type)
91
+ result.push Chain::GlobalVariable.new(n.children[0].to_s)
92
+ elsif n.type == :OP_ASGN_OR
93
+ result.concat generate_links n.children[2]
94
+ elsif [:class, :module, :def, :defs].include?(n.type)
95
+ # @todo Undefined or what?
96
+ result.push Chain::UNDEFINED_CALL
97
+ elsif n.type == :AND
98
+ result.concat generate_links(n.children.last)
99
+ elsif n.type == :OR
100
+ result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename)])
101
+ elsif n.type == :begin
102
+ result.concat generate_links(n.children[0])
103
+ elsif n.type == :BLOCK_PASS
104
+ result.push Chain::BlockVariable.new("&#{n.children[1].children[0].to_s}")
105
+ elsif n.type == :HASH
106
+ result.push Chain::Hash.new('::Hash', hash_is_splatted?(n))
107
+ else
108
+ lit = infer_literal_node_type(n)
109
+ if lit
110
+ if lit == '::Hash'
111
+ result.push Chain::Hash.new(lit, hash_is_splatted?(n))
112
+ else
113
+ result.push Chain::Literal.new(lit)
114
+ end
115
+ else
116
+ result.push Chain::Link.new
117
+ end
118
+ # result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
119
+ end
120
+ result
121
+ end
122
+
123
+ def hash_is_splatted? node
124
+ return false unless Parser.is_ast_node?(node.children[0]) && node.children[0].type == :LIST
125
+ list = node.children[0].children
126
+ eol = list.rindex(&:nil?)
127
+ eol && Parser.is_ast_node?(list[eol + 1])
128
+ end
129
+
130
+ def block_passed? node
131
+ node.children.last.is_a?(RubyVM::AbstractSyntaxTree::Node) && node.children.last.type == :BLOCK_PASS
132
+ end
133
+
134
+ def node_to_argchains node
135
+ return [] unless Parser.is_ast_node?(node)
136
+ if [:ZARRAY, :ARRAY, :LIST].include?(node.type)
137
+ node.children[0..-2].map { |c| NodeChainer.chain(c) }
138
+ elsif node.type == :SPLAT
139
+ [NodeChainer.chain(node)]
140
+ elsif node.type == :ARGSPUSH
141
+ result = node_to_argchains(node.children[0])
142
+ result.push NodeChainer.chain(node.children[1]) if Parser.is_ast_node?(node.children[1])
143
+ elsif node.type == :ARGSCAT
144
+ result = node.children[0].children[0..-2].map { |c| NodeChainer.chain(c) }
145
+ result.push NodeChainer.chain(node.children[1])
146
+ # @todo Smelly instance variable access
147
+ result.last.instance_variable_set(:@splat, true)
148
+ result
149
+ elsif node.type == :BLOCK_PASS
150
+ result = node_to_argchains(node.children[0])
151
+ result.push Chain.new([Chain::BlockVariable.new("&#{node.children[1].children[0].to_s}")])
152
+ result
153
+ else
154
+ []
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end