solargraph 0.39.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +28 -0
  5. data/.yardopts +2 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE +21 -0
  8. data/README.md +104 -0
  9. data/Rakefile +14 -0
  10. data/SPONSORS.md +9 -0
  11. data/bin/solargraph +5 -0
  12. data/lib/.rubocop.yml +21 -0
  13. data/lib/solargraph.rb +66 -0
  14. data/lib/solargraph/api_map.rb +745 -0
  15. data/lib/solargraph/api_map/bundler_methods.rb +27 -0
  16. data/lib/solargraph/api_map/cache.rb +66 -0
  17. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  18. data/lib/solargraph/api_map/store.rb +267 -0
  19. data/lib/solargraph/bundle.rb +26 -0
  20. data/lib/solargraph/complex_type.rb +213 -0
  21. data/lib/solargraph/complex_type/type_methods.rb +127 -0
  22. data/lib/solargraph/complex_type/unique_type.rb +75 -0
  23. data/lib/solargraph/convention.rb +38 -0
  24. data/lib/solargraph/convention/base.rb +25 -0
  25. data/lib/solargraph/convention/gemfile.rb +18 -0
  26. data/lib/solargraph/convention/gemspec.rb +25 -0
  27. data/lib/solargraph/convention/rspec.rb +24 -0
  28. data/lib/solargraph/converters/dd.rb +12 -0
  29. data/lib/solargraph/converters/dl.rb +12 -0
  30. data/lib/solargraph/converters/dt.rb +12 -0
  31. data/lib/solargraph/converters/misc.rb +1 -0
  32. data/lib/solargraph/core_fills.rb +159 -0
  33. data/lib/solargraph/diagnostics.rb +55 -0
  34. data/lib/solargraph/diagnostics/base.rb +29 -0
  35. data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
  36. data/lib/solargraph/diagnostics/rubocop.rb +90 -0
  37. data/lib/solargraph/diagnostics/rubocop_helpers.rb +64 -0
  38. data/lib/solargraph/diagnostics/severities.rb +15 -0
  39. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  40. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  41. data/lib/solargraph/documentor.rb +76 -0
  42. data/lib/solargraph/environ.rb +40 -0
  43. data/lib/solargraph/language_server.rb +19 -0
  44. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  45. data/lib/solargraph/language_server/error_codes.rb +20 -0
  46. data/lib/solargraph/language_server/host.rb +741 -0
  47. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  48. data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
  49. data/lib/solargraph/language_server/host/dispatch.rb +112 -0
  50. data/lib/solargraph/language_server/host/sources.rb +156 -0
  51. data/lib/solargraph/language_server/message.rb +92 -0
  52. data/lib/solargraph/language_server/message/base.rb +85 -0
  53. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  54. data/lib/solargraph/language_server/message/client.rb +11 -0
  55. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  56. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
  58. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  59. data/lib/solargraph/language_server/message/extended.rb +21 -0
  60. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +95 -0
  61. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  62. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  63. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
  64. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  66. data/lib/solargraph/language_server/message/initialize.rb +153 -0
  67. data/lib/solargraph/language_server/message/initialized.rb +26 -0
  68. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  69. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  70. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  71. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  72. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  73. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  74. data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
  75. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  76. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  77. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  78. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  79. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  80. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  81. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  82. data/lib/solargraph/language_server/message/text_document/formatting.rb +78 -0
  83. data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
  84. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  85. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  86. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  87. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  88. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
  89. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  90. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
  91. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
  92. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  93. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  94. data/lib/solargraph/language_server/message_types.rb +14 -0
  95. data/lib/solargraph/language_server/request.rb +24 -0
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  97. data/lib/solargraph/language_server/transport.rb +13 -0
  98. data/lib/solargraph/language_server/transport/adapter.rb +56 -0
  99. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  101. data/lib/solargraph/library.rb +414 -0
  102. data/lib/solargraph/location.rb +37 -0
  103. data/lib/solargraph/logging.rb +27 -0
  104. data/lib/solargraph/page.rb +83 -0
  105. data/lib/solargraph/parser.rb +26 -0
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  107. data/lib/solargraph/parser/legacy.rb +12 -0
  108. data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
  109. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  110. data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
  111. data/lib/solargraph/parser/legacy/node_methods.rb +300 -0
  112. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  113. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  114. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  115. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  116. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
  117. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
  118. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  119. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  120. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  121. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  122. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  123. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  124. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  125. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  126. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  127. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
  128. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +234 -0
  129. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  130. data/lib/solargraph/parser/node_methods.rb +43 -0
  131. data/lib/solargraph/parser/node_processor.rb +43 -0
  132. data/lib/solargraph/parser/node_processor/base.rb +77 -0
  133. data/lib/solargraph/parser/region.rb +66 -0
  134. data/lib/solargraph/parser/rubyvm.rb +40 -0
  135. data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
  136. data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
  137. data/lib/solargraph/parser/rubyvm/node_methods.rb +284 -0
  138. data/lib/solargraph/parser/rubyvm/node_processors.rb +61 -0
  139. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  140. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +62 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +31 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +255 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  160. data/lib/solargraph/parser/snippet.rb +13 -0
  161. data/lib/solargraph/pin.rb +39 -0
  162. data/lib/solargraph/pin/attribute.rb +49 -0
  163. data/lib/solargraph/pin/base.rb +296 -0
  164. data/lib/solargraph/pin/base_method.rb +141 -0
  165. data/lib/solargraph/pin/base_variable.rb +84 -0
  166. data/lib/solargraph/pin/block.rb +48 -0
  167. data/lib/solargraph/pin/class_variable.rb +8 -0
  168. data/lib/solargraph/pin/closure.rb +37 -0
  169. data/lib/solargraph/pin/common.rb +70 -0
  170. data/lib/solargraph/pin/constant.rb +43 -0
  171. data/lib/solargraph/pin/conversions.rb +97 -0
  172. data/lib/solargraph/pin/documenting.rb +110 -0
  173. data/lib/solargraph/pin/duck_method.rb +16 -0
  174. data/lib/solargraph/pin/global_variable.rb +8 -0
  175. data/lib/solargraph/pin/instance_variable.rb +30 -0
  176. data/lib/solargraph/pin/keyword.rb +15 -0
  177. data/lib/solargraph/pin/keyword_param.rb +8 -0
  178. data/lib/solargraph/pin/local_variable.rb +21 -0
  179. data/lib/solargraph/pin/localized.rb +43 -0
  180. data/lib/solargraph/pin/method.rb +111 -0
  181. data/lib/solargraph/pin/method_alias.rb +31 -0
  182. data/lib/solargraph/pin/namespace.rb +85 -0
  183. data/lib/solargraph/pin/parameter.rb +206 -0
  184. data/lib/solargraph/pin/proxy_type.rb +29 -0
  185. data/lib/solargraph/pin/reference.rb +14 -0
  186. data/lib/solargraph/pin/reference/extend.rb +10 -0
  187. data/lib/solargraph/pin/reference/include.rb +10 -0
  188. data/lib/solargraph/pin/reference/override.rb +29 -0
  189. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  190. data/lib/solargraph/pin/reference/require.rb +14 -0
  191. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  192. data/lib/solargraph/pin/singleton.rb +11 -0
  193. data/lib/solargraph/pin/symbol.rb +47 -0
  194. data/lib/solargraph/pin/yard_pin.rb +12 -0
  195. data/lib/solargraph/pin/yard_pin/constant.rb +25 -0
  196. data/lib/solargraph/pin/yard_pin/method.rb +65 -0
  197. data/lib/solargraph/pin/yard_pin/namespace.rb +27 -0
  198. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +26 -0
  199. data/lib/solargraph/position.rb +112 -0
  200. data/lib/solargraph/range.rb +95 -0
  201. data/lib/solargraph/server_methods.rb +16 -0
  202. data/lib/solargraph/shell.rb +221 -0
  203. data/lib/solargraph/source.rb +533 -0
  204. data/lib/solargraph/source/chain.rb +172 -0
  205. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  206. data/lib/solargraph/source/chain/call.rb +203 -0
  207. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  208. data/lib/solargraph/source/chain/constant.rb +75 -0
  209. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  210. data/lib/solargraph/source/chain/head.rb +35 -0
  211. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  212. data/lib/solargraph/source/chain/link.rb +67 -0
  213. data/lib/solargraph/source/chain/literal.rb +23 -0
  214. data/lib/solargraph/source/chain/or.rb +23 -0
  215. data/lib/solargraph/source/chain/variable.rb +13 -0
  216. data/lib/solargraph/source/chain/z_super.rb +184 -0
  217. data/lib/solargraph/source/change.rb +79 -0
  218. data/lib/solargraph/source/cursor.rb +164 -0
  219. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  220. data/lib/solargraph/source/source_chainer.rb +189 -0
  221. data/lib/solargraph/source/updater.rb +54 -0
  222. data/lib/solargraph/source_map.rb +170 -0
  223. data/lib/solargraph/source_map/clip.rb +190 -0
  224. data/lib/solargraph/source_map/completion.rb +23 -0
  225. data/lib/solargraph/source_map/mapper.rb +199 -0
  226. data/lib/solargraph/stdlib_fills.rb +32 -0
  227. data/lib/solargraph/type_checker.rb +498 -0
  228. data/lib/solargraph/type_checker/checks.rb +95 -0
  229. data/lib/solargraph/type_checker/param_def.rb +35 -0
  230. data/lib/solargraph/type_checker/problem.rb +32 -0
  231. data/lib/solargraph/type_checker/rules.rb +53 -0
  232. data/lib/solargraph/version.rb +5 -0
  233. data/lib/solargraph/views/_method.erb +62 -0
  234. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  235. data/lib/solargraph/views/_namespace.erb +24 -0
  236. data/lib/solargraph/views/document.erb +23 -0
  237. data/lib/solargraph/views/environment.erb +58 -0
  238. data/lib/solargraph/views/layout.erb +44 -0
  239. data/lib/solargraph/views/search.erb +11 -0
  240. data/lib/solargraph/workspace.rb +209 -0
  241. data/lib/solargraph/workspace/config.rb +215 -0
  242. data/lib/solargraph/yard_map.rb +420 -0
  243. data/lib/solargraph/yard_map/cache.rb +19 -0
  244. data/lib/solargraph/yard_map/core_docs.rb +170 -0
  245. data/lib/solargraph/yard_map/core_gen.rb +76 -0
  246. data/lib/solargraph/yard_map/mapper.rb +71 -0
  247. data/lib/solargraph/yard_map/rdoc_to_yard.rb +136 -0
  248. data/lib/yard-solargraph.rb +30 -0
  249. data/solargraph.gemspec +41 -0
  250. data/travis-bundler.rb +11 -0
  251. data/yardoc/2.2.2.tar.gz +0 -0
  252. metadata +575 -0
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ module NodeProcessors
7
+ class SymNode < Parser::NodeProcessor::Base
8
+ def process
9
+ pins.push Solargraph::Pin::Symbol.new(
10
+ get_node_location(node),
11
+ ":#{node.children[0]}"
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ module Solargraph
2
+ module Parser
3
+ class NodeMethods
4
+ module_function
5
+
6
+ def unpack_name node
7
+ raise NotImplementedError
8
+ end
9
+
10
+ def infer_literal_type node
11
+ raise NotImplementedError
12
+ end
13
+
14
+ def calls_from node
15
+ raise NotImplementedError
16
+ end
17
+
18
+ def returns_from node
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def process node
23
+ raise NotImplementedError
24
+ end
25
+
26
+ def references node
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def chain node, filename = nil, in_block = false
31
+ raise NotImplementedError
32
+ end
33
+
34
+ def node? node
35
+ raise NotImplementedError
36
+ end
37
+
38
+ def convert_hash node
39
+ raise NotImplementedError
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ # The processor classes used by SourceMap::Mapper to generate pins from
6
+ # parser nodes.
7
+ #
8
+ module NodeProcessor
9
+ autoload :Base, 'solargraph/parser/node_processor/base'
10
+
11
+ class << self
12
+ @@processors ||= {}
13
+
14
+ # Register a processor for a node type.
15
+ #
16
+ # @param type [Symbol]
17
+ # @param cls [Class<NodeProcessor::Base>]
18
+ # @return [Class<NodeProcessor::Base>]
19
+ def register type, cls
20
+ @@processors[type] = cls
21
+ end
22
+ end
23
+
24
+ # @param node [Parser::AST::Node]
25
+ # @param region [Region]
26
+ # @param pins [Array<Pin::Base>]
27
+ # @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
28
+ def self.process node, region = Region.new, pins = [], locals = []
29
+ if pins.empty?
30
+ pins.push Pin::Namespace.new(
31
+ location: region.source.location,
32
+ name: ''
33
+ )
34
+ end
35
+ return [pins, locals] unless Parser.is_ast_node?(node)
36
+ klass = @@processors[node.type] || NodeProcessor::Base
37
+ processor = klass.new(node, region, pins, locals)
38
+ processor.process
39
+ [processor.pins, processor.locals]
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module NodeProcessor
6
+ class Base
7
+ # @todo The base node processor should not include legacy node methods
8
+ # include Legacy::NodeMethods
9
+
10
+ # @return [Parser::AST::Node]
11
+ attr_reader :node
12
+
13
+ # @return [Region]
14
+ attr_reader :region
15
+
16
+ # @return [Array<Pin::Base>]
17
+ attr_reader :pins
18
+
19
+ # @return [Array<Pin::Base>]
20
+ attr_reader :locals
21
+
22
+ # @param node [Parser::AST::Node]
23
+ # @param region [Region]
24
+ # @param pins [Array<Pin::Base>]
25
+ def initialize node, region, pins, locals
26
+ @node = node
27
+ @region = region
28
+ @pins = pins
29
+ @locals = locals
30
+ end
31
+
32
+ # Subclasses should override this method to generate new pins.
33
+ #
34
+ # @return [void]
35
+ def process
36
+ process_children
37
+ end
38
+
39
+ private
40
+
41
+ # @param subregion [Region]
42
+ # @return [void]
43
+ def process_children subregion = region
44
+ node.children.each do |child|
45
+ next unless Parser.is_ast_node?(child)
46
+ NodeProcessor.process(child, subregion, pins, locals)
47
+ end
48
+ end
49
+
50
+ # @param node [Parser::AST::Node]
51
+ # @return [Solargraph::Location]
52
+ def get_node_location(node)
53
+ range = Parser.node_range(node)
54
+ Location.new(region.filename, range)
55
+ end
56
+
57
+ def comments_for(node)
58
+ region.source.comments_for(node)
59
+ end
60
+
61
+ def named_path_pin position
62
+ pins.select{|pin| pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)}.last
63
+ end
64
+
65
+ # @todo Candidate for deprecation
66
+ def block_pin position
67
+ pins.select{|pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position)}.last
68
+ end
69
+
70
+ # @todo Candidate for deprecation
71
+ def closure_pin position
72
+ pins.select{|pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position)}.last
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ # Data used by the parser to track context at various locations in a
6
+ # source.
7
+ #
8
+ class Region
9
+ # @return [Pin::Closure]
10
+ attr_reader :closure
11
+
12
+ # @return [Symbol]
13
+ attr_reader :scope
14
+
15
+ # @return [Symbol]
16
+ attr_reader :visibility
17
+
18
+ # @return [Solargraph::Source]
19
+ attr_reader :source
20
+
21
+ # @return [Array<Symbol>]
22
+ attr_reader :lvars
23
+
24
+ # @param source [Source]
25
+ # @param namespace [String]
26
+ # @param scope [Symbol]
27
+ # @param visibility [Symbol]
28
+ def initialize source: Solargraph::Source.load_string(''), closure: nil,
29
+ scope: nil, visibility: :public, lvars: []
30
+ @source = source
31
+ # @closure = closure
32
+ @closure = closure || Pin::Namespace.new(name: '', location: source.location)
33
+ @scope = scope
34
+ @visibility = visibility
35
+ @lvars = lvars
36
+ end
37
+
38
+ # @return [String]
39
+ def filename
40
+ source.filename
41
+ end
42
+
43
+ # Generate a new Region with the provided attribute changes.
44
+ #
45
+ # @param closure [Pin::Closure, nil]
46
+ # @param scope [Symbol, nil]
47
+ # @param visibility [Symbol, nil]
48
+ # @return [Region]
49
+ def update closure: nil, scope: nil, visibility: nil, lvars: nil
50
+ Region.new(
51
+ source: source,
52
+ closure: closure || self.closure,
53
+ scope: scope || self.scope,
54
+ visibility: visibility || self.visibility,
55
+ lvars: lvars || self.lvars
56
+ )
57
+ end
58
+
59
+ # @param node [Parser::AST::Node]
60
+ # @return [String]
61
+ def code_for node
62
+ source.code_for(node)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,40 @@
1
+ module Solargraph
2
+ module Parser
3
+ module Rubyvm
4
+ autoload :ClassMethods, 'solargraph/parser/rubyvm/class_methods'
5
+ autoload :NodeChainer, 'solargraph/parser/rubyvm/node_chainer'
6
+ autoload :NodeMethods, 'solargraph/parser/rubyvm/node_methods'
7
+ end
8
+ end
9
+ end
10
+
11
+ require 'solargraph/parser/rubyvm/node_processors'
12
+
13
+ class RubyVM::AbstractSyntaxTree::Node
14
+ def to_sexp
15
+ sexp self
16
+ end
17
+
18
+ def == other
19
+ return false unless other.is_a?(self.class)
20
+ here = Solargraph::Range.from_node(self)
21
+ there = Solargraph::Range.from_node(other)
22
+ here == there && to_sexp == other.to_sexp
23
+ end
24
+
25
+ private
26
+
27
+ def sexp node, depth = 0
28
+ result = ''
29
+ if node.is_a?(RubyVM::AbstractSyntaxTree::Node)
30
+ result += "#{' ' * depth}(:#{node.type}"
31
+ node.children.each do |child|
32
+ result += "\n" + sexp(child, depth + 1)
33
+ end
34
+ result += ")"
35
+ else
36
+ result += "#{' ' * depth}#{node.inspect}"
37
+ end
38
+ result
39
+ end
40
+ end
@@ -0,0 +1,150 @@
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
+ inner_node_references(name, source.node).map do |n|
44
+ rng = Range.from_node(n)
45
+ offset = Position.to_offset(source.code, rng.start)
46
+ soff = source.code.index(name, offset)
47
+ eoff = soff + name.length
48
+ Location.new(
49
+ source.filename,
50
+ Range.new(
51
+ Position.from_offset(source.code, soff),
52
+ Position.from_offset(source.code, eoff)
53
+ )
54
+ )
55
+ end
56
+ end
57
+
58
+ # @param name [String]
59
+ # @param top [AST::Node]
60
+ # @return [Array<AST::Node>]
61
+ def inner_node_references name, top
62
+ result = []
63
+ if Parser.rubyvm?
64
+ if Parser.is_ast_node?(top)
65
+ result.push top if match_rubyvm_node_to_ref(top, name)
66
+ top.children.each { |c| result.concat inner_node_references(name, c) }
67
+ end
68
+ else
69
+ if Parser.is_ast_node?(top) && top.to_s.include?(":#{name}")
70
+ result.push top if top.children.any? { |c| c.to_s == name }
71
+ top.children.each { |c| result.concat inner_node_references(name, c) }
72
+ end
73
+ end
74
+ result
75
+ end
76
+
77
+ def match_rubyvm_node_to_ref(top, name)
78
+ top.children.select { |c| c.is_a?(Symbol) }.any? { |c| c.to_s == name } ||
79
+ top.children.select { |c| c.is_a?(Array) }.any? { |c| c.include?(name.to_sym) }
80
+ end
81
+
82
+ def chain *args
83
+ NodeChainer.chain *args
84
+ end
85
+
86
+ def chain_string *args
87
+ NodeChainer.load_string *args
88
+ end
89
+
90
+ def process_node *args
91
+ Solargraph::Parser::NodeProcessor.process *args
92
+ end
93
+
94
+ def infer_literal_node_type node
95
+ # NodeMethods.infer_literal_node_type node
96
+ end
97
+
98
+ def version
99
+ Ruby::VERSION
100
+ end
101
+
102
+ def is_ast_node? node
103
+ if Parser.rubyvm?
104
+ node.is_a?(RubyVM::AbstractSyntaxTree::Node)
105
+ else
106
+ node.is_a?(::Parser::AST::Node)
107
+ end
108
+ end
109
+
110
+ def node_range node
111
+ st = Position.new(node.first_lineno - 1, node.first_column)
112
+ en = Position.new(node.last_lineno - 1, node.last_column)
113
+ Range.new(st, en)
114
+ end
115
+
116
+ def recipient_node tree
117
+ tree.each_with_index do |node, idx|
118
+ return tree[idx + 1] if [:ARRAY, :ZARRAY, :LIST].include?(node.type) && tree[idx + 1] && [:FCALL, :VCALL, :CALL].include?(tree[idx + 1].type)
119
+ end
120
+ nil
121
+ end
122
+
123
+ def string_ranges node
124
+ return [] unless is_ast_node?(node)
125
+ result = []
126
+ if node.type == :STR
127
+ result.push Range.from_node(node)
128
+ elsif node.type == :DSTR
129
+ here = Range.from_node(node)
130
+ there = Range.from_node(node.children[1])
131
+ result.push Range.new(here.start, there.start)
132
+ end
133
+ node.children.each do |child|
134
+ result.concat string_ranges(child)
135
+ end
136
+ if node.type == :DSTR && node.children.last.nil?
137
+ # result.push Range.new(result.last.ending, result.last.ending)
138
+ last = node.children[-2]
139
+ unless last.nil?
140
+ rng = Range.from_node(last)
141
+ pos = Position.new(rng.ending.line, rng.ending.column - 1)
142
+ result.push Range.new(pos, pos)
143
+ end
144
+ end
145
+ result
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,135 @@
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
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 = true
56
+ result.concat generate_links(n.children[0])
57
+ @in_block = false
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 || block_passed?(n))
63
+ elsif n.type == :ATTRASGN
64
+ result.concat generate_links(n.children[0])
65
+ result.push Chain::Call.new(n.children[1].to_s, node_to_argchains(n.children[2]), @in_block || block_passed?(n))
66
+ elsif n.type == :VCALL
67
+ result.push Chain::Call.new(n.children[0].to_s, [], @in_block || block_passed?(n))
68
+ elsif n.type == :FCALL
69
+ result.push Chain::Call.new(n.children[0].to_s, node_to_argchains(n.children[1]), @in_block || block_passed?(n))
70
+ elsif n.type == :SELF
71
+ result.push Chain::Head.new('self')
72
+ elsif n.type == :ZSUPER
73
+ result.push Chain::ZSuper.new('super', @in_block || block_passed?(n))
74
+ elsif n.type == :SUPER
75
+ result.push Chain::Call.new('super', node_to_argchains(n.children.last), @in_block || block_passed?(n))
76
+ elsif [:COLON2, :COLON3, :CONST].include?(n.type)
77
+ const = unpack_name(n)
78
+ result.push Chain::Constant.new(const)
79
+ elsif [:LVAR, :LASGN, :DVAR].include?(n.type)
80
+ result.push Chain::Call.new(n.children[0].to_s)
81
+ elsif [:IVAR, :IASGN].include?(n.type)
82
+ result.push Chain::InstanceVariable.new(n.children[0].to_s)
83
+ elsif [:CVAR, :CVASGN].include?(n.type)
84
+ result.push Chain::ClassVariable.new(n.children[0].to_s)
85
+ elsif [:GVAR, :GASGN].include?(n.type)
86
+ result.push Chain::GlobalVariable.new(n.children[0].to_s)
87
+ elsif n.type == :OP_ASGN_OR
88
+ result.concat generate_links n.children[2]
89
+ elsif [:class, :module, :def, :defs].include?(n.type)
90
+ # @todo Undefined or what?
91
+ result.push Chain::UNDEFINED_CALL
92
+ elsif n.type == :AND
93
+ result.concat generate_links(n.children.last)
94
+ elsif n.type == :OR
95
+ result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename)])
96
+ elsif n.type == :begin
97
+ result.concat generate_links(n.children[0])
98
+ elsif n.type == :BLOCK_PASS
99
+ result.push Chain::BlockVariable.new("&#{n.children[1].children[0].to_s}")
100
+ else
101
+ lit = infer_literal_node_type(n)
102
+ result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
103
+ end
104
+ result
105
+ end
106
+
107
+ def block_passed? node
108
+ node.children.last.is_a?(RubyVM::AbstractSyntaxTree::Node) && node.children.last.type == :BLOCK_PASS
109
+ end
110
+
111
+ def node_to_argchains node
112
+ # @todo Process array, splat, argscat
113
+ return [] unless Parser.is_ast_node?(node)
114
+ if [:ZARRAY, :ARRAY, :LIST].include?(node.type)
115
+ node.children[0..-2].map { |c| NodeChainer.chain(c) }
116
+ elsif node.type == :SPLAT
117
+ [NodeChainer.chain(node)]
118
+ elsif node.type == :ARGSCAT
119
+ result = node.children[0].children[0..-2].map { |c| NodeChainer.chain(c) }
120
+ result.push NodeChainer.chain(node.children[1])
121
+ # @todo Smelly instance variable access
122
+ result.last.instance_variable_set(:@splat, true)
123
+ result
124
+ elsif node.type == :BLOCK_PASS
125
+ result = node_to_argchains(node.children[0])
126
+ result.push Chain.new([Chain::BlockVariable.new("&#{node.children[1].children[0].to_s}")])
127
+ result
128
+ else
129
+ []
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end