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,155 +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 returns_from node
33
- # return [] unless Parser.is_ast_node?(node)
34
- # if node.type == :SCOPE
35
- # # node.children.select { |n| n.is_a?(RubyVM::AbstractSyntaxTree::Node) }.map { |n| DeepInference.get_return_nodes(n) }.flatten
36
- # DeepInference.get_return_nodes(node.children[2])
37
- # else
38
- # DeepInference.get_return_nodes(node)
39
- # end
40
- # end
41
-
42
- def references source, name
43
- if name.end_with?("=")
44
- reg = /#{Regexp.escape name[0..-2]}\s*=/
45
- extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
46
- else
47
- extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
48
- end
49
- inner_node_references(name, source.node).map do |n|
50
- rng = Range.from_node(n)
51
- offset = Position.to_offset(source.code, rng.start)
52
- soff, eoff = extract_offset[source.code, offset]
53
- Location.new(
54
- source.filename,
55
- Range.new(
56
- Position.from_offset(source.code, soff),
57
- Position.from_offset(source.code, eoff)
58
- )
59
- )
60
- end
61
- end
62
-
63
- # @param name [String]
64
- # @param top [AST::Node]
65
- # @return [Array<AST::Node>]
66
- def inner_node_references name, top
67
- result = []
68
- if Parser.rubyvm?
69
- if Parser.is_ast_node?(top)
70
- result.push top if match_rubyvm_node_to_ref(top, name)
71
- top.children.each { |c| result.concat inner_node_references(name, c) }
72
- end
73
- else
74
- if Parser.is_ast_node?(top) && top.to_s.include?(":#{name}")
75
- result.push top if top.children.any? { |c| c.to_s == name }
76
- top.children.each { |c| result.concat inner_node_references(name, c) }
77
- end
78
- end
79
- result
80
- end
81
-
82
- def match_rubyvm_node_to_ref(top, name)
83
- top.children.select { |c| c.is_a?(Symbol) }.any? { |c| c.to_s == name } ||
84
- top.children.select { |c| c.is_a?(Array) }.any? { |c| c.include?(name.to_sym) }
85
- end
86
-
87
- def chain *args
88
- NodeChainer.chain *args
89
- end
90
-
91
- def chain_string *args
92
- NodeChainer.load_string *args
93
- end
94
-
95
- def process_node *args
96
- Solargraph::Parser::NodeProcessor.process *args
97
- end
98
-
99
- def infer_literal_node_type node
100
- # NodeMethods.infer_literal_node_type node
101
- end
102
-
103
- def version
104
- Ruby::VERSION
105
- end
106
-
107
- def is_ast_node? node
108
- if Parser.rubyvm?
109
- node.is_a?(RubyVM::AbstractSyntaxTree::Node)
110
- else
111
- node.is_a?(::Parser::AST::Node)
112
- end
113
- end
114
-
115
- def node_range node
116
- st = Position.new(node.first_lineno - 1, node.first_column)
117
- en = Position.new(node.last_lineno - 1, node.last_column)
118
- Range.new(st, en)
119
- end
120
-
121
- def recipient_node tree
122
- tree.each_with_index do |node, idx|
123
- return tree[idx + 1] if [:ARRAY, :ZARRAY, :LIST].include?(node.type) && tree[idx + 1] && [:FCALL, :VCALL, :CALL].include?(tree[idx + 1].type)
124
- end
125
- nil
126
- end
127
-
128
- def string_ranges node
129
- return [] unless is_ast_node?(node)
130
- result = []
131
- if node.type == :STR
132
- result.push Range.from_node(node)
133
- elsif node.type == :DSTR
134
- here = Range.from_node(node)
135
- there = Range.from_node(node.children[1])
136
- result.push Range.new(here.start, there.start)
137
- end
138
- node.children.each do |child|
139
- result.concat string_ranges(child)
140
- end
141
- if node.type == :DSTR && node.children.last.nil?
142
- # result.push Range.new(result.last.ending, result.last.ending)
143
- last = node.children[-2]
144
- unless last.nil?
145
- rng = Range.from_node(last)
146
- pos = Position.new(rng.ending.line, rng.ending.column - 1)
147
- result.push Range.new(pos, pos)
148
- end
149
- end
150
- result
151
- end
152
- end
153
- end
154
- end
155
- 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