solargraph 0.51.2 → 0.54.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +40 -0
  3. data/.github/workflows/rspec.yml +1 -3
  4. data/.github/workflows/typecheck.yml +34 -0
  5. data/.yardopts +2 -2
  6. data/CHANGELOG.md +127 -5
  7. data/README.md +13 -16
  8. data/SPONSORS.md +1 -7
  9. data/lib/solargraph/api_map/cache.rb +50 -20
  10. data/lib/solargraph/api_map/source_to_yard.rb +17 -10
  11. data/lib/solargraph/api_map/store.rb +60 -15
  12. data/lib/solargraph/api_map.rb +282 -123
  13. data/lib/solargraph/bench.rb +3 -2
  14. data/lib/solargraph/cache.rb +29 -5
  15. data/lib/solargraph/complex_type/type_methods.rb +122 -39
  16. data/lib/solargraph/complex_type/unique_type.rb +310 -76
  17. data/lib/solargraph/complex_type.rb +166 -44
  18. data/lib/solargraph/convention.rb +0 -1
  19. data/lib/solargraph/converters/dd.rb +5 -0
  20. data/lib/solargraph/converters/dl.rb +3 -0
  21. data/lib/solargraph/converters/dt.rb +3 -0
  22. data/lib/solargraph/diagnostics/rubocop.rb +8 -7
  23. data/lib/solargraph/diagnostics/rubocop_helpers.rb +1 -0
  24. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  25. data/lib/solargraph/diagnostics.rb +2 -2
  26. data/lib/solargraph/doc_map.rb +187 -0
  27. data/lib/solargraph/gem_pins.rb +72 -0
  28. data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
  29. data/lib/solargraph/language_server/host/dispatch.rb +22 -5
  30. data/lib/solargraph/language_server/host/message_worker.rb +49 -5
  31. data/lib/solargraph/language_server/host/sources.rb +8 -65
  32. data/lib/solargraph/language_server/host.rb +65 -84
  33. data/lib/solargraph/language_server/message/base.rb +19 -12
  34. data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
  35. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
  36. data/lib/solargraph/language_server/message/initialize.rb +19 -2
  37. data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
  38. data/lib/solargraph/language_server/message/text_document/definition.rb +3 -3
  39. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
  40. data/lib/solargraph/language_server/message/text_document/formatting.rb +1 -0
  41. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -1
  42. data/lib/solargraph/language_server/message/text_document/type_definition.rb +3 -3
  43. data/lib/solargraph/language_server/message/text_document.rb +0 -1
  44. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
  46. data/lib/solargraph/language_server/progress.rb +135 -0
  47. data/lib/solargraph/language_server/transport/adapter.rb +16 -1
  48. data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
  49. data/lib/solargraph/language_server.rb +1 -0
  50. data/lib/solargraph/library.rb +207 -111
  51. data/lib/solargraph/location.rb +15 -1
  52. data/lib/solargraph/page.rb +6 -0
  53. data/lib/solargraph/parser/comment_ripper.rb +4 -0
  54. data/lib/solargraph/parser/node_methods.rb +47 -7
  55. data/lib/solargraph/parser/node_processor/base.rb +11 -1
  56. data/lib/solargraph/parser/node_processor.rb +1 -0
  57. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -9
  58. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
  59. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +62 -43
  60. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  61. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
  62. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
  63. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
  64. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
  65. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +2 -2
  66. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +1 -1
  67. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +7 -20
  68. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
  69. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
  70. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
  71. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +4 -4
  72. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
  73. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
  74. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
  75. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
  76. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +1 -1
  77. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +8 -6
  78. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +1 -1
  79. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  80. data/lib/solargraph/parser/parser_gem.rb +12 -0
  81. data/lib/solargraph/parser/region.rb +1 -1
  82. data/lib/solargraph/parser/snippet.rb +2 -0
  83. data/lib/solargraph/parser.rb +8 -12
  84. data/lib/solargraph/pin/base.rb +78 -10
  85. data/lib/solargraph/pin/base_variable.rb +40 -7
  86. data/lib/solargraph/pin/block.rb +69 -46
  87. data/lib/solargraph/pin/callable.rb +147 -0
  88. data/lib/solargraph/pin/closure.rb +23 -3
  89. data/lib/solargraph/pin/common.rb +6 -6
  90. data/lib/solargraph/pin/conversions.rb +36 -5
  91. data/lib/solargraph/pin/delegated_method.rb +6 -2
  92. data/lib/solargraph/pin/documenting.rb +25 -32
  93. data/lib/solargraph/pin/instance_variable.rb +6 -2
  94. data/lib/solargraph/pin/local_variable.rb +13 -1
  95. data/lib/solargraph/pin/method.rb +205 -32
  96. data/lib/solargraph/pin/namespace.rb +20 -7
  97. data/lib/solargraph/pin/parameter.rb +41 -36
  98. data/lib/solargraph/pin/proxy_type.rb +1 -1
  99. data/lib/solargraph/pin/reference/override.rb +2 -2
  100. data/lib/solargraph/pin/reference.rb +8 -0
  101. data/lib/solargraph/pin/search.rb +3 -3
  102. data/lib/solargraph/pin/signature.rb +8 -14
  103. data/lib/solargraph/pin.rb +4 -2
  104. data/lib/solargraph/range.rb +4 -6
  105. data/lib/solargraph/rbs_map/conversions.rb +326 -76
  106. data/lib/solargraph/rbs_map/core_fills.rb +16 -33
  107. data/lib/solargraph/rbs_map/core_map.rb +3 -13
  108. data/lib/solargraph/rbs_map/stdlib_map.rb +2 -8
  109. data/lib/solargraph/rbs_map.rb +32 -13
  110. data/lib/solargraph/shell.rb +95 -72
  111. data/lib/solargraph/source/chain/array.rb +33 -0
  112. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  113. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  114. data/lib/solargraph/source/chain/call.rb +152 -69
  115. data/lib/solargraph/source/chain/constant.rb +15 -1
  116. data/lib/solargraph/source/chain/if.rb +23 -0
  117. data/lib/solargraph/source/chain/link.rb +17 -2
  118. data/lib/solargraph/source/chain/or.rb +2 -2
  119. data/lib/solargraph/source/chain/z_super.rb +3 -3
  120. data/lib/solargraph/source/chain.rb +85 -26
  121. data/lib/solargraph/source/change.rb +3 -0
  122. data/lib/solargraph/source/cursor.rb +16 -2
  123. data/lib/solargraph/source/source_chainer.rb +8 -5
  124. data/lib/solargraph/source/updater.rb +1 -0
  125. data/lib/solargraph/source.rb +120 -148
  126. data/lib/solargraph/source_map/clip.rb +16 -27
  127. data/lib/solargraph/source_map/data.rb +30 -0
  128. data/lib/solargraph/source_map/mapper.rb +15 -3
  129. data/lib/solargraph/source_map.rb +48 -24
  130. data/lib/solargraph/type_checker/checks.rb +10 -2
  131. data/lib/solargraph/type_checker/rules.rb +6 -1
  132. data/lib/solargraph/type_checker.rb +150 -39
  133. data/lib/solargraph/version.rb +1 -1
  134. data/lib/solargraph/views/environment.erb +3 -5
  135. data/lib/solargraph/workspace/config.rb +9 -6
  136. data/lib/solargraph/workspace.rb +30 -3
  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 +16 -3
  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 -292
  143. data/lib/solargraph/yard_tags.rb +20 -0
  144. data/lib/solargraph/yardoc.rb +52 -0
  145. data/lib/solargraph.rb +6 -4
  146. data/solargraph.gemspec +7 -6
  147. metadata +71 -82
  148. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  149. data/lib/solargraph/documentor.rb +0 -76
  150. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  151. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  152. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  153. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -50
  154. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  155. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
  156. data/lib/solargraph/parser/legacy/node_processors.rb +0 -55
  157. data/lib/solargraph/parser/legacy.rb +0 -12
  158. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -153
  159. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  160. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -317
  161. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  162. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  163. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -33
  164. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  165. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
  166. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
  167. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  168. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  169. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  170. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  171. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  172. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  173. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  174. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  175. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -51
  176. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
  177. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  178. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
  179. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -64
  180. data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
  181. data/lib/solargraph/parser/rubyvm.rb +0 -40
  182. data/lib/solargraph/rbs_map/core_signs.rb +0 -33
  183. data/lib/yard-solargraph.rb +0 -33
@@ -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,14 +2,14 @@
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
- here = get_node_start_position(node)
12
- presence = Range.new(here, region.closure.location.range.ending)
11
+ # variable not visible until next statement
12
+ presence = Range.new(get_node_end_position(node), region.closure.location.range.ending)
13
13
  loc = get_node_location(node)
14
14
  locals.push Solargraph::Pin::LocalVariable.new(
15
15
  location: loc,
@@ -0,0 +1,53 @@
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
+ pin = if lhs.type == :lvasgn
34
+ # lvasgn is a local variable
35
+ locals.find { |l| l.location == location }
36
+ else
37
+ # e.g., ivasgn is an instance variable, etc
38
+ pins.find { |iv| iv.location == location && iv.is_a?(Pin::BaseVariable) }
39
+ end
40
+ # @todo in line below, nothing in typechecking alerts
41
+ # when a non-existant method is called on 'l'
42
+ if pin.nil?
43
+ Solargraph.logger.debug { "Could not find local for masgn= value in location #{location.inspect} in #{lhs_arr} - masgn = #{masgn}, lhs.type = #{lhs.type}" }
44
+ next
45
+ end
46
+ pin.mass_assignment = [mass_rhs, i]
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ 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])
@@ -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 SclassNode < 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 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,9 +89,10 @@ 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?
94
- pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '), 'value')
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?
95
+ pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
95
96
  end
96
97
  end
97
98
  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 Rubyvm
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,14 @@ module Solargraph
10
9
  class SyntaxError < StandardError
11
10
  end
12
11
 
13
- # True if the parser can use RubyVM.
14
- #
15
- def self.rubyvm?
16
- # !!defined?(RubyVM::AbstractSyntaxTree)
17
- false
18
- end
12
+ # @deprecated
13
+ Legacy = ParserGem
19
14
 
20
- selected = rubyvm? ? Rubyvm : Legacy
21
- # include selected
22
- extend selected::ClassMethods
15
+ ClassMethods = ParserGem::ClassMethods
16
+ # @todo should be able to just 'extend ClassMethods' here and
17
+ # typecheck things off it in strict mode
18
+ extend ParserGem::ClassMethods
23
19
 
24
- NodeMethods = (rubyvm? ? Rubyvm::NodeMethods : Legacy::NodeMethods)
20
+ NodeMethods = ParserGem::NodeMethods
25
21
  end
26
22
  end
@@ -15,6 +15,9 @@ module Solargraph
15
15
  # @return [Solargraph::Location]
16
16
  attr_reader :location
17
17
 
18
+ # @return [Solargraph::Location]
19
+ attr_reader :type_location
20
+
18
21
  # @return [String]
19
22
  attr_reader :name
20
23
 
@@ -25,12 +28,13 @@ module Solargraph
25
28
  attr_accessor :source
26
29
 
27
30
  # @param location [Solargraph::Location, nil]
28
- # @param kind [Integer]
31
+ # @param type_location [Solargraph::Location, nil]
29
32
  # @param closure [Solargraph::Pin::Closure, nil]
30
33
  # @param name [String]
31
34
  # @param comments [String]
32
- def initialize location: nil, closure: nil, name: '', comments: ''
35
+ def initialize location: nil, type_location: nil, closure: nil, name: '', comments: ''
33
36
  @location = location
37
+ @type_location = type_location
34
38
  @closure = closure
35
39
  @name = name
36
40
  @comments = comments
@@ -41,6 +45,46 @@ module Solargraph
41
45
  @comments ||= ''
42
46
  end
43
47
 
48
+ # @param generics_to_resolve [Enumerable<String>]
49
+ # @param return_type_context [ComplexType, nil]
50
+ # @param context [ComplexType]
51
+ # @param resolved_generic_values [Hash{String => ComplexType}]
52
+ # @return [self]
53
+ def resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {})
54
+ proxy return_type.resolve_generics_from_context(generics_to_resolve,
55
+ return_type_context,
56
+ resolved_generic_values: resolved_generic_values)
57
+ end
58
+
59
+ # @yieldparam [ComplexType]
60
+ # @yieldreturn [ComplexType]
61
+ # @return [self]
62
+ def transform_types(&transform)
63
+ proxy return_type.transform(&transform)
64
+ end
65
+
66
+ # Determine the concrete type for each of the generic type
67
+ # parameters used in this method based on the parameters passed
68
+ # into the its class and return a new method pin.
69
+ #
70
+ # @param definitions [Pin::Namespace] The module/class which uses generic types
71
+ # @param context_type [ComplexType] The receiver type
72
+ # @return [self]
73
+ def resolve_generics definitions, context_type
74
+ transform_types { |t| t.resolve_generics(definitions, context_type) if t }
75
+ end
76
+
77
+ def all_rooted?
78
+ !return_type || return_type.all_rooted?
79
+ end
80
+
81
+ # @param generics_to_erase [Enumerable<String>]
82
+ # @return [self]
83
+ def erase_generics(generics_to_erase)
84
+ return self if generics_to_erase.empty?
85
+ transform_types { |t| t.erase_generics(generics_to_erase) }
86
+ end
87
+
44
88
  # @return [String, nil]
45
89
  def filename
46
90
  return nil if location.nil?
@@ -58,7 +102,7 @@ module Solargraph
58
102
  end
59
103
 
60
104
  def to_s
61
- name.to_s
105
+ to_rbs
62
106
  end
63
107
 
64
108
  # @return [Boolean]
@@ -66,6 +110,11 @@ module Solargraph
66
110
  false
67
111
  end
68
112
 
113
+ # @return [Location, nil]
114
+ def best_location
115
+ location || type_location
116
+ end
117
+
69
118
  # Pin equality is determined using the #nearly? method and also
70
119
  # requiring both pins to have the same location.
71
120
  #
@@ -103,13 +152,13 @@ module Solargraph
103
152
  @docstring ||= Solargraph::Source.parse_docstring('').to_docstring
104
153
  end
105
154
 
106
- # @return [Array<YARD::Tags::Directive>]
155
+ # @return [::Array<YARD::Tags::Directive>]
107
156
  def directives
108
157
  parse_comments unless defined?(@directives)
109
158
  @directives
110
159
  end
111
160
 
112
- # @return [Array<YARD::Tags::MacroDirective>]
161
+ # @return [::Array<YARD::Tags::MacroDirective>]
113
162
  def macros
114
163
  @macros ||= collect_macros
115
164
  end
@@ -216,12 +265,31 @@ module Solargraph
216
265
  result
217
266
  end
218
267
 
268
+ # @return [String]
219
269
  def identity
220
- @identity ||= "#{closure.context.namespace}|#{name}"
270
+ @identity ||= "#{closure.path}|#{name}"
271
+ end
272
+
273
+ # @return [String, nil]
274
+ def to_rbs
275
+ return_type.to_rbs
276
+ end
277
+
278
+ # @return [String, nil]
279
+ def desc
280
+ if path
281
+ if to_rbs
282
+ path + ' ' + to_rbs
283
+ else
284
+ path
285
+ end
286
+ else
287
+ to_rbs
288
+ end
221
289
  end
222
290
 
223
291
  def inspect
224
- "#<#{self.class} `#{self.path}` at #{self.location.inspect}>"
292
+ "#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
225
293
  end
226
294
 
227
295
  protected
@@ -266,8 +334,8 @@ module Solargraph
266
334
  true
267
335
  end
268
336
 
269
- # @param dir1 [Array<YARD::Tags::Directive>]
270
- # @param dir2 [Array<YARD::Tags::Directive>]
337
+ # @param dir1 [::Array<YARD::Tags::Directive>]
338
+ # @param dir2 [::Array<YARD::Tags::Directive>]
271
339
  # @return [Boolean]
272
340
  def compare_directives dir1, dir2
273
341
  return false if dir1.length != dir2.length
@@ -288,7 +356,7 @@ module Solargraph
288
356
  tag1.types == tag2.types
289
357
  end
290
358
 
291
- # @return [Array<YARD::Tags::Handlers::Directive>]
359
+ # @return [::Array<YARD::Tags::Handlers::Directive>]
292
360
  def collect_macros
293
361
  return [] unless maybe_directives?
294
362
  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_type(closure.context)
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(&:to_s))
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]