solargraph 0.47.2 → 0.54.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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/plugins.yml +40 -0
  4. data/.github/workflows/rspec.yml +4 -8
  5. data/.github/workflows/typecheck.yml +34 -0
  6. data/.yardopts +2 -2
  7. data/CHANGELOG.md +166 -3
  8. data/LICENSE +1 -1
  9. data/README.md +19 -16
  10. data/SPONSORS.md +2 -9
  11. data/lib/solargraph/api_map/cache.rb +50 -20
  12. data/lib/solargraph/api_map/source_to_yard.rb +17 -10
  13. data/lib/solargraph/api_map/store.rb +68 -15
  14. data/lib/solargraph/api_map.rb +238 -112
  15. data/lib/solargraph/bench.rb +3 -2
  16. data/lib/solargraph/cache.rb +77 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +116 -35
  18. data/lib/solargraph/complex_type/unique_type.rb +261 -33
  19. data/lib/solargraph/complex_type.rb +149 -30
  20. data/lib/solargraph/convention/rakefile.rb +17 -0
  21. data/lib/solargraph/convention.rb +2 -3
  22. data/lib/solargraph/converters/dd.rb +5 -0
  23. data/lib/solargraph/converters/dl.rb +3 -0
  24. data/lib/solargraph/converters/dt.rb +3 -0
  25. data/lib/solargraph/diagnostics/rubocop.rb +23 -8
  26. data/lib/solargraph/diagnostics/rubocop_helpers.rb +4 -1
  27. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  28. data/lib/solargraph/diagnostics.rb +2 -2
  29. data/lib/solargraph/doc_map.rb +187 -0
  30. data/lib/solargraph/gem_pins.rb +72 -0
  31. data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
  32. data/lib/solargraph/language_server/host/dispatch.rb +22 -5
  33. data/lib/solargraph/language_server/host/message_worker.rb +4 -0
  34. data/lib/solargraph/language_server/host/sources.rb +8 -65
  35. data/lib/solargraph/language_server/host.rb +88 -93
  36. data/lib/solargraph/language_server/message/base.rb +1 -1
  37. data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
  38. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
  39. data/lib/solargraph/language_server/message/extended/download_core.rb +1 -5
  40. data/lib/solargraph/language_server/message/initialize.rb +27 -0
  41. data/lib/solargraph/language_server/message/initialized.rb +1 -0
  42. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +4 -1
  43. data/lib/solargraph/language_server/message/text_document/formatting.rb +5 -4
  44. data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
  45. data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -6
  46. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  47. data/lib/solargraph/language_server/message/text_document.rb +1 -1
  48. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
  49. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +10 -3
  50. data/lib/solargraph/language_server/message.rb +1 -0
  51. data/lib/solargraph/language_server/progress.rb +118 -0
  52. data/lib/solargraph/language_server/transport/adapter.rb +16 -1
  53. data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
  54. data/lib/solargraph/language_server.rb +1 -0
  55. data/lib/solargraph/library.rb +231 -104
  56. data/lib/solargraph/location.rb +1 -0
  57. data/lib/solargraph/page.rb +6 -0
  58. data/lib/solargraph/parser/comment_ripper.rb +4 -0
  59. data/lib/solargraph/parser/node_methods.rb +47 -7
  60. data/lib/solargraph/parser/node_processor/base.rb +11 -1
  61. data/lib/solargraph/parser/node_processor.rb +1 -0
  62. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -9
  63. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
  64. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +57 -41
  65. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  66. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
  67. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +53 -0
  68. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
  69. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
  70. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +14 -4
  71. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/cvasgn_node.rb +1 -1
  72. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +7 -20
  73. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
  74. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
  75. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
  76. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +2 -2
  77. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +47 -0
  78. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
  79. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
  80. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
  81. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
  82. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +7 -5
  83. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +1 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  85. data/lib/solargraph/parser/parser_gem.rb +12 -0
  86. data/lib/solargraph/parser/region.rb +1 -1
  87. data/lib/solargraph/parser/snippet.rb +2 -0
  88. data/lib/solargraph/parser.rb +9 -10
  89. data/lib/solargraph/pin/base.rb +69 -11
  90. data/lib/solargraph/pin/base_variable.rb +40 -7
  91. data/lib/solargraph/pin/block.rb +81 -33
  92. data/lib/solargraph/pin/closure.rb +17 -2
  93. data/lib/solargraph/pin/common.rb +7 -3
  94. data/lib/solargraph/pin/conversions.rb +34 -8
  95. data/lib/solargraph/pin/delegated_method.rb +101 -0
  96. data/lib/solargraph/pin/documenting.rb +25 -32
  97. data/lib/solargraph/pin/instance_variable.rb +4 -0
  98. data/lib/solargraph/pin/local_variable.rb +13 -1
  99. data/lib/solargraph/pin/method.rb +273 -17
  100. data/lib/solargraph/pin/namespace.rb +17 -1
  101. data/lib/solargraph/pin/parameter.rb +40 -28
  102. data/lib/solargraph/pin/reference/override.rb +2 -2
  103. data/lib/solargraph/pin/reference.rb +8 -0
  104. data/lib/solargraph/pin/search.rb +4 -4
  105. data/lib/solargraph/pin/signature.rb +143 -0
  106. data/lib/solargraph/pin.rb +2 -1
  107. data/lib/solargraph/range.rb +4 -6
  108. data/lib/solargraph/rbs_map/conversions.rb +607 -0
  109. data/lib/solargraph/rbs_map/core_fills.rb +50 -0
  110. data/lib/solargraph/rbs_map/core_map.rb +28 -0
  111. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
  112. data/lib/solargraph/rbs_map.rb +92 -0
  113. data/lib/solargraph/shell.rb +85 -59
  114. data/lib/solargraph/source/chain/array.rb +32 -0
  115. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  116. data/lib/solargraph/source/chain/call.rb +125 -61
  117. data/lib/solargraph/source/chain/constant.rb +15 -1
  118. data/lib/solargraph/source/chain/if.rb +23 -0
  119. data/lib/solargraph/source/chain/link.rb +8 -2
  120. data/lib/solargraph/source/chain/or.rb +1 -1
  121. data/lib/solargraph/source/chain/z_super.rb +3 -3
  122. data/lib/solargraph/source/chain.rb +64 -14
  123. data/lib/solargraph/source/change.rb +3 -0
  124. data/lib/solargraph/source/cursor.rb +2 -0
  125. data/lib/solargraph/source/source_chainer.rb +8 -5
  126. data/lib/solargraph/source/updater.rb +1 -0
  127. data/lib/solargraph/source.rb +18 -63
  128. data/lib/solargraph/source_map/clip.rb +31 -23
  129. data/lib/solargraph/source_map/mapper.rb +23 -7
  130. data/lib/solargraph/source_map.rb +36 -11
  131. data/lib/solargraph/type_checker/checks.rb +10 -2
  132. data/lib/solargraph/type_checker.rb +229 -100
  133. data/lib/solargraph/version.rb +1 -1
  134. data/lib/solargraph/views/environment.erb +2 -2
  135. data/lib/solargraph/workspace/config.rb +15 -11
  136. data/lib/solargraph/workspace.rb +41 -17
  137. data/lib/solargraph/yard_map/cache.rb +6 -0
  138. data/lib/solargraph/yard_map/helpers.rb +1 -1
  139. data/lib/solargraph/yard_map/mapper/to_method.rb +23 -7
  140. data/lib/solargraph/yard_map/mapper.rb +1 -1
  141. data/lib/solargraph/yard_map/to_method.rb +11 -4
  142. data/lib/solargraph/yard_map.rb +1 -443
  143. data/lib/solargraph/yard_tags.rb +20 -0
  144. data/lib/solargraph/yardoc.rb +52 -0
  145. data/lib/solargraph.rb +8 -6
  146. data/solargraph.gemspec +19 -8
  147. metadata +164 -99
  148. data/.travis.yml +0 -19
  149. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  150. data/lib/solargraph/compat.rb +0 -37
  151. data/lib/solargraph/convention/rspec.rb +0 -30
  152. data/lib/solargraph/documentor.rb +0 -76
  153. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  154. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  155. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  156. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  157. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  158. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +0 -23
  159. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
  160. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
  161. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  162. data/lib/solargraph/parser/legacy.rb +0 -12
  163. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
  164. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  165. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  166. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  167. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  168. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
  169. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
  170. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  171. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  172. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  173. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  174. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  175. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  176. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  177. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  178. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  179. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
  180. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  181. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
  182. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
  183. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  184. data/lib/solargraph/parser/rubyvm.rb +0 -40
  185. data/lib/solargraph/yard_map/core_docs.rb +0 -170
  186. data/lib/solargraph/yard_map/core_fills.rb +0 -208
  187. data/lib/solargraph/yard_map/core_gen.rb +0 -76
  188. data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
  189. data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
  190. data/lib/yard-solargraph.rb +0 -33
  191. data/yardoc/2.2.2.tar.gz +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Solargraph
4
4
  module Parser
5
- module Legacy
5
+ module ParserGem
6
6
  module NodeProcessors
7
7
  class GvasgnNode < Parser::NodeProcessor::Base
8
8
  def process
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Solargraph
4
4
  module Parser
5
- module Legacy
5
+ module ParserGem
6
6
  module NodeProcessors
7
7
  class IvasgnNode < Parser::NodeProcessor::Base
8
- include Legacy::NodeMethods
8
+ include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
11
  loc = get_node_location(node)
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Solargraph
4
4
  module Parser
5
- module Legacy
5
+ module ParserGem
6
6
  module NodeProcessors
7
7
  class LvasgnNode < Parser::NodeProcessor::Base
8
- include Legacy::NodeMethods
8
+ include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
11
  here = get_node_start_position(node)
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class MasgnNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ # Example:
12
+ #
13
+ # s(:masgn,
14
+ # s(:mlhs,
15
+ # s(:send,
16
+ # s(:send, nil, :a), :b=),
17
+ # s(:lvasgn, :b),
18
+ # s(:ivasgn, :@c)),
19
+ # s(:array,
20
+ # s(:int, 1),
21
+ # s(:int, 2),
22
+ # s(:int, 3)))
23
+ masgn = node
24
+ mlhs = masgn.children.fetch(0)
25
+ lhs_arr = mlhs.children
26
+ mass_rhs = node.children.fetch(1)
27
+
28
+ # Get pins created for the mlhs node
29
+ process_children
30
+
31
+ lhs_arr.each_with_index do |lhs, i|
32
+ location = get_node_location(lhs)
33
+ # @todo in line below, nothing in typechecking alerts
34
+ # when a non-existant method is called on 'l'
35
+ pin = locals.find { |l| l.location == location }
36
+ if pin.nil?
37
+ Solargraph.logger.debug "Could not find pin in location #{location}"
38
+ next
39
+ end
40
+ pin.mass_assignment = [mass_rhs, i]
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Solargraph
4
4
  module Parser
5
- module Legacy
5
+ module ParserGem
6
6
  module NodeProcessors
7
7
  class NamespaceNode < Parser::NodeProcessor::Base
8
- include Legacy::NodeMethods
8
+ include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
11
  sc = nil
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Solargraph
4
4
  module Parser
5
- module Legacy
5
+ module ParserGem
6
6
  module NodeProcessors
7
7
  class OrasgnNode < Parser::NodeProcessor::Base
8
8
  def process
@@ -2,13 +2,13 @@
2
2
 
3
3
  module Solargraph
4
4
  module Parser
5
- module Legacy
5
+ module ParserGem
6
6
  module NodeProcessors
7
7
  class ResbodyNode < Parser::NodeProcessor::Base
8
- include Legacy::NodeMethods
8
+ include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
- if node.children[1]
11
+ if node.children[1] # Exception local variable name
12
12
  here = get_node_start_position(node.children[1])
13
13
  presence = Range.new(here, region.closure.location.range.ending)
14
14
  loc = get_node_location(node.children[1])
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class SclassNode < Parser::NodeProcessor::Base
8
+ def process
9
+ sclass = node.children[0]
10
+ if sclass.is_a?(AST::Node) && sclass.type == :self
11
+ closure = region.closure
12
+ elsif sclass.is_a?(AST::Node) && sclass.type == :casgn
13
+ names = [region.closure.namespace, region.closure.name]
14
+ if sclass.children[0].nil? && names.last != sclass.children[1].to_s
15
+ names << sclass.children[1].to_s
16
+ else
17
+ names.concat [NodeMethods.unpack_name(sclass.children[0]), sclass.children[1].to_s]
18
+ end
19
+ name = names.reject(&:empty?).join('::')
20
+ closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location)
21
+ elsif sclass.is_a?(AST::Node) && sclass.type == :const
22
+ names = [region.closure.namespace, region.closure.name]
23
+ also = NodeMethods.unpack_name(sclass)
24
+ if also != region.closure.name
25
+ names << also
26
+ end
27
+ name = names.reject(&:empty?).join('::')
28
+ closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location)
29
+ else
30
+ return
31
+ end
32
+ pins.push Solargraph::Pin::Singleton.new(
33
+ location: get_node_location(node),
34
+ closure: closure
35
+ )
36
+ process_children region.update(visibility: :public, scope: :class, closure: pins.last)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Solargraph
4
4
  module Parser
5
- module Legacy
5
+ module ParserGem
6
6
  module NodeProcessors
7
7
  class SendNode < Parser::NodeProcessor::Base
8
- include Legacy::NodeMethods
8
+ include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
11
  if node.children[0].nil?
@@ -80,7 +80,7 @@ module Solargraph
80
80
  )
81
81
  end
82
82
  if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
83
- pins.push Solargraph::Pin::Method.new(
83
+ method_pin = Solargraph::Pin::Method.new(
84
84
  location: loc,
85
85
  closure: clos,
86
86
  name: "#{a.children[0]}=",
@@ -89,8 +89,9 @@ module Solargraph
89
89
  visibility: region.visibility,
90
90
  attribute: true
91
91
  )
92
- pins.last.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
93
- if pins.last.return_type.defined?
92
+ pins.push method_pin
93
+ method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
94
+ if method_pin.return_type.defined?
94
95
  pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '), 'value')
95
96
  end
96
97
  end
@@ -112,6 +113,7 @@ module Solargraph
112
113
  end
113
114
  end
114
115
 
116
+ # @return [void]
115
117
  def process_prepend
116
118
  if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
117
119
  cp = region.closure
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Solargraph
4
4
  module Parser
5
- module Legacy
5
+ module ParserGem
6
6
  module NodeProcessors
7
7
  class SymNode < Parser::NodeProcessor::Base
8
8
  def process
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solargraph/parser/node_processor'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module ParserGem
8
+ module NodeProcessors
9
+ autoload :BeginNode, 'solargraph/parser/parser_gem/node_processors/begin_node'
10
+ autoload :DefNode, 'solargraph/parser/parser_gem/node_processors/def_node'
11
+ autoload :DefsNode, 'solargraph/parser/parser_gem/node_processors/defs_node'
12
+ autoload :SendNode, 'solargraph/parser/parser_gem/node_processors/send_node'
13
+ autoload :NamespaceNode, 'solargraph/parser/parser_gem/node_processors/namespace_node'
14
+ autoload :SclassNode, 'solargraph/parser/parser_gem/node_processors/sclass_node'
15
+ autoload :IvasgnNode, 'solargraph/parser/parser_gem/node_processors/ivasgn_node'
16
+ autoload :CvasgnNode, 'solargraph/parser/parser_gem/node_processors/cvasgn_node'
17
+ autoload :LvasgnNode, 'solargraph/parser/parser_gem/node_processors/lvasgn_node'
18
+ autoload :GvasgnNode, 'solargraph/parser/parser_gem/node_processors/gvasgn_node'
19
+ autoload :CasgnNode, 'solargraph/parser/parser_gem/node_processors/casgn_node'
20
+ autoload :MasgnNode, 'solargraph/parser/parser_gem/node_processors/masgn_node'
21
+ autoload :AliasNode, 'solargraph/parser/parser_gem/node_processors/alias_node'
22
+ autoload :ArgsNode, 'solargraph/parser/parser_gem/node_processors/args_node'
23
+ autoload :BlockNode, 'solargraph/parser/parser_gem/node_processors/block_node'
24
+ autoload :OrasgnNode, 'solargraph/parser/parser_gem/node_processors/orasgn_node'
25
+ autoload :SymNode, 'solargraph/parser/parser_gem/node_processors/sym_node'
26
+ autoload :ResbodyNode, 'solargraph/parser/parser_gem/node_processors/resbody_node'
27
+ end
28
+ end
29
+
30
+ module NodeProcessor
31
+ register :source, ParserGem::NodeProcessors::BeginNode
32
+ register :begin, ParserGem::NodeProcessors::BeginNode
33
+ register :kwbegin, ParserGem::NodeProcessors::BeginNode
34
+ register :rescue, ParserGem::NodeProcessors::BeginNode
35
+ register :resbody, ParserGem::NodeProcessors::ResbodyNode
36
+ register :def, ParserGem::NodeProcessors::DefNode
37
+ register :defs, ParserGem::NodeProcessors::DefsNode
38
+ register :send, ParserGem::NodeProcessors::SendNode
39
+ register :class, ParserGem::NodeProcessors::NamespaceNode
40
+ register :module, ParserGem::NodeProcessors::NamespaceNode
41
+ register :sclass, ParserGem::NodeProcessors::SclassNode
42
+ register :ivasgn, ParserGem::NodeProcessors::IvasgnNode
43
+ register :cvasgn, ParserGem::NodeProcessors::CvasgnNode
44
+ register :lvasgn, ParserGem::NodeProcessors::LvasgnNode
45
+ register :gvasgn, ParserGem::NodeProcessors::GvasgnNode
46
+ register :casgn, ParserGem::NodeProcessors::CasgnNode
47
+ register :masgn, ParserGem::NodeProcessors::MasgnNode
48
+ register :alias, ParserGem::NodeProcessors::AliasNode
49
+ register :args, ParserGem::NodeProcessors::ArgsNode
50
+ register :forward_args, ParserGem::NodeProcessors::ArgsNode
51
+ register :block, ParserGem::NodeProcessors::BlockNode
52
+ register :or_asgn, ParserGem::NodeProcessors::OrasgnNode
53
+ register :sym, ParserGem::NodeProcessors::SymNode
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,12 @@
1
+ module Solargraph
2
+ module Parser
3
+ module ParserGem
4
+ autoload :FlawedBuilder, 'solargraph/parser/parser_gem/flawed_builder'
5
+ autoload :ClassMethods, 'solargraph/parser/parser_gem/class_methods'
6
+ autoload :NodeMethods, 'solargraph/parser/parser_gem/node_methods'
7
+ autoload :NodeChainer, 'solargraph/parser/parser_gem/node_chainer'
8
+ end
9
+ end
10
+ end
11
+
12
+ require 'solargraph/parser/parser_gem/node_processors'
@@ -23,7 +23,7 @@ module Solargraph
23
23
 
24
24
  # @param source [Source]
25
25
  # @param namespace [String]
26
- # @param scope [Symbol]
26
+ # @param scope [Symbol, nil]
27
27
  # @param visibility [Symbol]
28
28
  def initialize source: Solargraph::Source.load_string(''), closure: nil,
29
29
  scope: nil, visibility: :public, lvars: []
@@ -1,7 +1,9 @@
1
1
  module Solargraph
2
2
  module Parser
3
3
  class Snippet
4
+ # @return [Range]
4
5
  attr_reader :range
6
+ # @return [String]
5
7
  attr_reader :text
6
8
 
7
9
  def initialize range, text
@@ -1,8 +1,7 @@
1
1
  module Solargraph
2
2
  module Parser
3
3
  autoload :CommentRipper, 'solargraph/parser/comment_ripper'
4
- autoload :Legacy, 'solargraph/parser/legacy'
5
- autoload :Rubyvm, 'solargraph/parser/rubyvm'
4
+ autoload :ParserGem, 'solargraph/parser/parser_gem'
6
5
  autoload :Region, 'solargraph/parser/region'
7
6
  autoload :NodeProcessor, 'solargraph/parser/node_processor'
8
7
  autoload :Snippet, 'solargraph/parser/snippet'
@@ -10,17 +9,17 @@ module Solargraph
10
9
  class SyntaxError < StandardError
11
10
  end
12
11
 
13
- # True if the parser can use RubyVM.
14
- #
15
12
  def self.rubyvm?
16
- !!defined?(RubyVM::AbstractSyntaxTree)
17
- # false
13
+ false
18
14
  end
19
15
 
20
- selected = rubyvm? ? Rubyvm : Legacy
21
- # include selected
22
- extend selected::ClassMethods
16
+ # @deprecated
17
+ Legacy = ParserGem
23
18
 
24
- NodeMethods = (rubyvm? ? Rubyvm::NodeMethods : Legacy::NodeMethods)
19
+ ClassMethods = ParserGem::ClassMethods
20
+
21
+ extend ParserGem::ClassMethods
22
+
23
+ NodeMethods = ParserGem::NodeMethods
25
24
  end
26
25
  end
@@ -21,9 +21,11 @@ module Solargraph
21
21
  # @return [String]
22
22
  attr_reader :path
23
23
 
24
- # @param location [Solargraph::Location]
25
- # @param kind [Integer]
26
- # @param closure [Solargraph::Pin::Closure]
24
+ # @return [::Symbol]
25
+ attr_accessor :source
26
+
27
+ # @param location [Solargraph::Location, nil]
28
+ # @param closure [Solargraph::Pin::Closure, nil]
27
29
  # @param name [String]
28
30
  # @param comments [String]
29
31
  def initialize location: nil, closure: nil, name: '', comments: ''
@@ -38,6 +40,43 @@ module Solargraph
38
40
  @comments ||= ''
39
41
  end
40
42
 
43
+ # @param generics_to_resolve [Enumerable<String>]
44
+ # @param return_type_context [ComplexType, nil]
45
+ # @param context [ComplexType]
46
+ # @param resolved_generic_values [Hash{String => ComplexType}]
47
+ # @return [self]
48
+ def resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {})
49
+ proxy return_type.resolve_generics_from_context(generics_to_resolve,
50
+ return_type_context,
51
+ resolved_generic_values: resolved_generic_values)
52
+ end
53
+
54
+ # @yieldparam [ComplexType]
55
+ # @yieldreturn [ComplexType]
56
+ # @return [self]
57
+ def transform_types(&transform)
58
+ proxy return_type.transform(&transform)
59
+ end
60
+
61
+ # Determine the concrete type for each of the generic type
62
+ # parameters used in this method based on the parameters passed
63
+ # into the its class and return a new method pin.
64
+ #
65
+ # @param definitions [Pin::Namespace] The module/class which uses generic types
66
+ # @param context_type [ComplexType] The receiver type
67
+ # @return [self]
68
+ def resolve_generics definitions, context_type
69
+ transformed = transform_types { |t| t.resolve_generics(definitions, context_type) if t }
70
+ transformed.erase_generics(definitions.generics)
71
+ end
72
+
73
+ # @param generics_to_erase [Enumerable<String>]
74
+ # @return [self]
75
+ def erase_generics(generics_to_erase)
76
+ return self if generics_to_erase.empty?
77
+ transform_types { |t| t.erase_generics(generics_to_erase) }
78
+ end
79
+
41
80
  # @return [String, nil]
42
81
  def filename
43
82
  return nil if location.nil?
@@ -55,7 +94,7 @@ module Solargraph
55
94
  end
56
95
 
57
96
  def to_s
58
- name.to_s
97
+ to_rbs
59
98
  end
60
99
 
61
100
  # @return [Boolean]
@@ -100,13 +139,13 @@ module Solargraph
100
139
  @docstring ||= Solargraph::Source.parse_docstring('').to_docstring
101
140
  end
102
141
 
103
- # @return [Array<YARD::Tags::Directive>]
142
+ # @return [::Array<YARD::Tags::Directive>]
104
143
  def directives
105
144
  parse_comments unless defined?(@directives)
106
145
  @directives
107
146
  end
108
147
 
109
- # @return [Array<YARD::Tags::MacroDirective>]
148
+ # @return [::Array<YARD::Tags::MacroDirective>]
110
149
  def macros
111
150
  @macros ||= collect_macros
112
151
  end
@@ -213,12 +252,31 @@ module Solargraph
213
252
  result
214
253
  end
215
254
 
255
+ # @return [String]
216
256
  def identity
217
- @identity ||= "#{closure.context.namespace}|#{name}"
257
+ @identity ||= "#{closure.path}|#{name}"
258
+ end
259
+
260
+ # @return [String, nil]
261
+ def to_rbs
262
+ return_type.to_rbs
263
+ end
264
+
265
+ # @return [String, nil]
266
+ def desc
267
+ if path
268
+ if to_rbs
269
+ path + ' ' + to_rbs
270
+ else
271
+ path
272
+ end
273
+ else
274
+ to_rbs
275
+ end
218
276
  end
219
277
 
220
278
  def inspect
221
- "#<#{self.class} `#{self.path}` at #{self.location.inspect}>"
279
+ "#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
222
280
  end
223
281
 
224
282
  protected
@@ -263,8 +321,8 @@ module Solargraph
263
321
  true
264
322
  end
265
323
 
266
- # @param dir1 [Array<YARD::Tags::Directive>]
267
- # @param dir2 [Array<YARD::Tags::Directive>]
324
+ # @param dir1 [::Array<YARD::Tags::Directive>]
325
+ # @param dir2 [::Array<YARD::Tags::Directive>]
268
326
  # @return [Boolean]
269
327
  def compare_directives dir1, dir2
270
328
  return false if dir1.length != dir2.length
@@ -285,7 +343,7 @@ module Solargraph
285
343
  tag1.types == tag2.types
286
344
  end
287
345
 
288
- # @return [Array<YARD::Tags::Handlers::Directive>]
346
+ # @return [::Array<YARD::Tags::Handlers::Directive>]
289
347
  def collect_macros
290
348
  return [] unless maybe_directives?
291
349
  parse = Solargraph::Source.parse_docstring(comments)
@@ -9,10 +9,14 @@ module Solargraph
9
9
  # @return [Parser::AST::Node, nil]
10
10
  attr_reader :assignment
11
11
 
12
+ attr_accessor :mass_assignment
13
+
12
14
  # @param assignment [Parser::AST::Node, nil]
13
15
  def initialize assignment: nil, **splat
14
16
  super(**splat)
15
17
  @assignment = assignment
18
+ # @type [nil, ::Array(Parser::AST::Node, Integer)]
19
+ @mass_assignment = nil
16
20
  end
17
21
 
18
22
  def completion_item_kind
@@ -36,10 +40,12 @@ module Solargraph
36
40
  true
37
41
  end
38
42
 
39
- def probe api_map
40
- return ComplexType::UNDEFINED if @assignment.nil?
43
+ # @param parent_node [Parser::AST::Node]
44
+ # @param api_map [ApiMap]
45
+ # @return [::Array<ComplexType>]
46
+ def return_types_from_node(parent_node, api_map)
41
47
  types = []
42
- returns_from(@assignment).each do |node|
48
+ value_position_nodes_only(parent_node).each do |node|
43
49
  # Nil nodes may not have a location
44
50
  if node.nil? || node.type == :NIL || node.type == :nil
45
51
  types.push ComplexType::NIL
@@ -50,13 +56,36 @@ module Solargraph
50
56
  clip = api_map.clip_at(location.filename, pos)
51
57
  # Use the return node for inference. The clip might infer from the
52
58
  # first node in a method call instead of the entire call.
53
- chain = Parser.chain(node, nil, clip.in_block?)
54
- result = chain.infer(api_map, closure, clip.locals)
59
+ chain = Parser.chain(node, nil, nil)
60
+ result = chain.infer(api_map, closure, clip.locals).self_to(closure.context.tag)
55
61
  types.push result unless result.undefined?
56
62
  end
57
63
  end
58
- return ComplexType::UNDEFINED if types.empty?
59
- ComplexType.try_parse(*types.map(&:tag))
64
+ types
65
+ end
66
+
67
+ # @param api_map [ApiMap]
68
+ # @return [ComplexType]
69
+ def probe api_map
70
+ unless @assignment.nil?
71
+ types = return_types_from_node(@assignment, api_map)
72
+ return ComplexType.new(types.uniq) unless types.empty?
73
+ end
74
+
75
+ unless @mass_assignment.nil?
76
+ mass_node, index = @mass_assignment
77
+ types = return_types_from_node(mass_node, api_map)
78
+ types.map! do |type|
79
+ if type.tuple?
80
+ type.all_params[index]
81
+ elsif ['::Array', '::Set', '::Enumerable'].include?(type.rooted_name)
82
+ type.all_params.first
83
+ end
84
+ end.compact!
85
+ return ComplexType.new(types.uniq) unless types.empty?
86
+ end
87
+
88
+ ComplexType::UNDEFINED
60
89
  end
61
90
 
62
91
  def == other
@@ -71,6 +100,10 @@ module Solargraph
71
100
  true
72
101
  end
73
102
 
103
+ def desc
104
+ "#{to_rbs} = #{assignment&.type.inspect}"
105
+ end
106
+
74
107
  private
75
108
 
76
109
  # @return [ComplexType]