solargraph 0.54.5 → 0.55.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/lib/solargraph/api_map/store.rb +3 -1
  4. data/lib/solargraph/api_map.rb +18 -8
  5. data/lib/solargraph/complex_type/unique_type.rb +88 -7
  6. data/lib/solargraph/complex_type.rb +35 -6
  7. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +51 -0
  8. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +100 -0
  9. data/lib/solargraph/convention/struct_definition.rb +101 -0
  10. data/lib/solargraph/convention.rb +1 -0
  11. data/lib/solargraph/doc_map.rb +42 -18
  12. data/lib/solargraph/language_server/host/message_worker.rb +10 -7
  13. data/lib/solargraph/language_server/host.rb +1 -0
  14. data/lib/solargraph/location.rb +8 -0
  15. data/lib/solargraph/parser/comment_ripper.rb +11 -6
  16. data/lib/solargraph/parser/flow_sensitive_typing.rb +226 -0
  17. data/lib/solargraph/parser/node_methods.rb +14 -0
  18. data/lib/solargraph/parser/node_processor.rb +0 -1
  19. data/lib/solargraph/parser/parser_gem/class_methods.rb +9 -0
  20. data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
  21. data/lib/solargraph/parser/parser_gem/node_methods.rb +3 -1
  22. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
  23. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +21 -1
  24. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
  25. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +26 -5
  26. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
  27. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +28 -0
  28. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +28 -0
  29. data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
  30. data/lib/solargraph/parser.rb +1 -0
  31. data/lib/solargraph/pin/base.rb +9 -3
  32. data/lib/solargraph/pin/base_variable.rb +7 -1
  33. data/lib/solargraph/pin/block.rb +2 -0
  34. data/lib/solargraph/pin/breakable.rb +9 -0
  35. data/lib/solargraph/pin/local_variable.rb +7 -1
  36. data/lib/solargraph/pin/method.rb +20 -18
  37. data/lib/solargraph/pin/namespace.rb +10 -7
  38. data/lib/solargraph/pin/parameter.rb +13 -5
  39. data/lib/solargraph/pin/proxy_type.rb +12 -6
  40. data/lib/solargraph/pin/until.rb +18 -0
  41. data/lib/solargraph/pin/while.rb +18 -0
  42. data/lib/solargraph/pin.rb +3 -0
  43. data/lib/solargraph/rbs_map/conversions.rb +8 -8
  44. data/lib/solargraph/rbs_map/core_fills.rb +10 -3
  45. data/lib/solargraph/source/chain/array.rb +4 -3
  46. data/lib/solargraph/source/chain/call.rb +46 -17
  47. data/lib/solargraph/source/chain/constant.rb +1 -1
  48. data/lib/solargraph/source/chain/hash.rb +3 -2
  49. data/lib/solargraph/source/chain/link.rb +2 -0
  50. data/lib/solargraph/source/chain/literal.rb +22 -2
  51. data/lib/solargraph/source/chain/z_super.rb +1 -1
  52. data/lib/solargraph/source/chain.rb +77 -47
  53. data/lib/solargraph/source/source_chainer.rb +2 -2
  54. data/lib/solargraph/source_map/clip.rb +3 -1
  55. data/lib/solargraph/type_checker/checks.rb +4 -0
  56. data/lib/solargraph/type_checker.rb +35 -8
  57. data/lib/solargraph/version.rb +1 -1
  58. data/lib/solargraph/yard_map/mapper/to_method.rb +42 -15
  59. metadata +14 -2
@@ -8,10 +8,20 @@ module Solargraph
8
8
  include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
- sc = nil
12
- if node.type == :class and !node.children[1].nil?
13
- sc = unpack_name(node.children[1])
11
+ superclass_name = nil
12
+ superclass_name = unpack_name(node.children[1]) if node.type == :class && node.children[1]&.type == :const
13
+
14
+ if Convention::StructDefinition::StructDefintionNode.valid?(node)
15
+ process_struct_definition
16
+ else
17
+ process_namespace(superclass_name)
14
18
  end
19
+ end
20
+
21
+ private
22
+
23
+ # @param superclass_name [String, nil]
24
+ def process_namespace(superclass_name)
15
25
  loc = get_node_location(node)
16
26
  nspin = Solargraph::Pin::Namespace.new(
17
27
  type: node.type,
@@ -23,15 +33,26 @@ module Solargraph
23
33
  gates: region.closure.gates.freeze
24
34
  )
25
35
  pins.push nspin
26
- unless sc.nil?
36
+ unless superclass_name.nil?
27
37
  pins.push Pin::Reference::Superclass.new(
28
38
  location: loc,
29
39
  closure: pins.last,
30
- name: sc
40
+ name: superclass_name
31
41
  )
32
42
  end
33
43
  process_children region.update(closure: nspin, visibility: :public)
34
44
  end
45
+
46
+ # TODO: Move this out of [NamespaceNode] once [Solargraph::Parser::NodeProcessor] supports
47
+ # multiple processors.
48
+ def process_struct_definition
49
+ processor_klass = Convention::StructDefinition::NodeProcessors::StructNode
50
+ processor = processor_klass.new(node, region, pins, locals)
51
+ processor.process
52
+
53
+ @pins = processor.pins
54
+ @locals = processor.locals
55
+ end
35
56
  end
36
57
  end
37
58
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parser'
4
+
5
+ module Solargraph
6
+ module Parser
7
+ module ParserGem
8
+ module NodeProcessors
9
+ class OpasgnNode < Parser::NodeProcessor::Base
10
+ def process
11
+ # Parser::CurrentRuby.parse("a += 2")
12
+ # => s(:op_asgn,
13
+ # s(:lvasgn, :a), :+,
14
+ # s(:int, 2))
15
+ asgn = node.children[0]
16
+ variable_name = asgn.children[0]
17
+ operator = node.children[1]
18
+ argument = node.children[2]
19
+ # for lvasgn, gvasgn, cvasgn, convert to lvar, gvar, cvar
20
+ # [6] pry(main)> Parser::CurrentRuby.parse("a = a + 1")
21
+ # => s(:lvasgn, :a,
22
+ # s(:send,
23
+ # s(:lvar, :a), :+,
24
+ # s(:int, 1)))
25
+ # [7] pry(main)>
26
+ variable_reference_type = asgn.type.to_s.sub(/vasgn$/, 'var').to_sym
27
+ variable_reference = node.updated(variable_reference_type, asgn.children)
28
+ send_children = [
29
+ variable_reference,
30
+ operator,
31
+ argument
32
+ ]
33
+ send_node = node.updated(:send, send_children)
34
+ new_asgn = node.updated(asgn.type, [variable_name, send_node])
35
+ NodeProcessor.process(new_asgn, region, pins, locals)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class UntilNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ location = get_node_location(node)
12
+ # Note - this should not be considered a block, as the
13
+ # until statement doesn't create a closure - e.g.,
14
+ # variables created inside can be seen from outside as
15
+ # well
16
+ pins.push Solargraph::Pin::Until.new(
17
+ location: location,
18
+ closure: region.closure,
19
+ node: node,
20
+ comments: comments_for(node),
21
+ )
22
+ process_children region
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class WhileNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ location = get_node_location(node)
12
+ # Note - this should not be considered a block, as the
13
+ # while statement doesn't create a closure - e.g.,
14
+ # variables created inside can be seen from outside as
15
+ # well
16
+ pins.push Solargraph::Pin::While.new(
17
+ location: location,
18
+ closure: region.closure,
19
+ node: node,
20
+ comments: comments_for(node),
21
+ )
22
+ process_children region
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -13,6 +13,7 @@ module Solargraph
13
13
  autoload :NamespaceNode, 'solargraph/parser/parser_gem/node_processors/namespace_node'
14
14
  autoload :SclassNode, 'solargraph/parser/parser_gem/node_processors/sclass_node'
15
15
  autoload :IvasgnNode, 'solargraph/parser/parser_gem/node_processors/ivasgn_node'
16
+ autoload :IfNode, 'solargraph/parser/parser_gem/node_processors/if_node'
16
17
  autoload :CvasgnNode, 'solargraph/parser/parser_gem/node_processors/cvasgn_node'
17
18
  autoload :LvasgnNode, 'solargraph/parser/parser_gem/node_processors/lvasgn_node'
18
19
  autoload :GvasgnNode, 'solargraph/parser/parser_gem/node_processors/gvasgn_node'
@@ -22,8 +23,12 @@ module Solargraph
22
23
  autoload :ArgsNode, 'solargraph/parser/parser_gem/node_processors/args_node'
23
24
  autoload :BlockNode, 'solargraph/parser/parser_gem/node_processors/block_node'
24
25
  autoload :OrasgnNode, 'solargraph/parser/parser_gem/node_processors/orasgn_node'
26
+ autoload :OpasgnNode, 'solargraph/parser/parser_gem/node_processors/opasgn_node'
25
27
  autoload :SymNode, 'solargraph/parser/parser_gem/node_processors/sym_node'
26
28
  autoload :ResbodyNode, 'solargraph/parser/parser_gem/node_processors/resbody_node'
29
+ autoload :UntilNode, 'solargraph/parser/parser_gem/node_processors/until_node'
30
+ autoload :WhileNode, 'solargraph/parser/parser_gem/node_processors/while_node'
31
+ autoload :AndNode, 'solargraph/parser/parser_gem/node_processors/and_node'
27
32
  end
28
33
  end
29
34
 
@@ -35,6 +40,7 @@ module Solargraph
35
40
  register :resbody, ParserGem::NodeProcessors::ResbodyNode
36
41
  register :def, ParserGem::NodeProcessors::DefNode
37
42
  register :defs, ParserGem::NodeProcessors::DefsNode
43
+ register :if, ParserGem::NodeProcessors::IfNode
38
44
  register :send, ParserGem::NodeProcessors::SendNode
39
45
  register :class, ParserGem::NodeProcessors::NamespaceNode
40
46
  register :module, ParserGem::NodeProcessors::NamespaceNode
@@ -50,7 +56,11 @@ module Solargraph
50
56
  register :forward_args, ParserGem::NodeProcessors::ArgsNode
51
57
  register :block, ParserGem::NodeProcessors::BlockNode
52
58
  register :or_asgn, ParserGem::NodeProcessors::OrasgnNode
59
+ register :op_asgn, ParserGem::NodeProcessors::OpasgnNode
53
60
  register :sym, ParserGem::NodeProcessors::SymNode
61
+ register :until, ParserGem::NodeProcessors::UntilNode
62
+ register :while, ParserGem::NodeProcessors::WhileNode
63
+ register :and, ParserGem::NodeProcessors::AndNode
54
64
  end
55
65
  end
56
66
  end
@@ -4,6 +4,7 @@ module Solargraph
4
4
  autoload :ParserGem, 'solargraph/parser/parser_gem'
5
5
  autoload :Region, 'solargraph/parser/region'
6
6
  autoload :NodeProcessor, 'solargraph/parser/node_processor'
7
+ autoload :FlowSensitiveTyping, 'solargraph/parser/flow_sensitive_typing'
7
8
  autoload :Snippet, 'solargraph/parser/snippet'
8
9
 
9
10
  class SyntaxError < StandardError
@@ -27,17 +27,23 @@ module Solargraph
27
27
  # @return [::Symbol]
28
28
  attr_accessor :source
29
29
 
30
+ def presence_certain?
31
+ true
32
+ end
33
+
30
34
  # @param location [Solargraph::Location, nil]
31
35
  # @param type_location [Solargraph::Location, nil]
32
36
  # @param closure [Solargraph::Pin::Closure, nil]
33
37
  # @param name [String]
34
38
  # @param comments [String]
35
- def initialize location: nil, type_location: nil, closure: nil, name: '', comments: ''
39
+ def initialize location: nil, type_location: nil, closure: nil, source: nil, name: '', comments: ''
36
40
  @location = location
37
41
  @type_location = type_location
38
42
  @closure = closure
39
43
  @name = name
44
+ @source = source
40
45
  @comments = comments
46
+ @source = source
41
47
  end
42
48
 
43
49
  # @return [String]
@@ -268,7 +274,7 @@ module Solargraph
268
274
  # @deprecated
269
275
  # @return [String]
270
276
  def identity
271
- @identity ||= "#{closure&.path}|#{name}"
277
+ @identity ||= "#{closure&.path}|#{name}|#{location}"
272
278
  end
273
279
 
274
280
  # @return [String, nil]
@@ -296,7 +302,7 @@ module Solargraph
296
302
  def desc
297
303
  closure_info = closure&.desc
298
304
  binder_info = binder&.desc
299
- "[#{type_desc}, closure=#{closure_info}, binder=#{binder}"
305
+ "[name=#{name.inspect} return_type=#{type_desc}, context=#{context.rooted_tags}, closure=#{closure_info}, binder=#{binder_info}]"
300
306
  end
301
307
 
302
308
  def inspect
@@ -11,12 +11,14 @@ module Solargraph
11
11
 
12
12
  attr_accessor :mass_assignment
13
13
 
14
+ # @param return_type [ComplexType, nil]
14
15
  # @param assignment [Parser::AST::Node, nil]
15
- def initialize assignment: nil, **splat
16
+ def initialize assignment: nil, return_type: nil, **splat
16
17
  super(**splat)
17
18
  @assignment = assignment
18
19
  # @type [nil, ::Array(Parser::AST::Node, Integer)]
19
20
  @mass_assignment = nil
21
+ @return_type = return_type
20
22
  end
21
23
 
22
24
  def completion_item_kind
@@ -32,7 +34,10 @@ module Solargraph
32
34
  @return_type ||= generate_complex_type
33
35
  end
34
36
 
37
+ # @sg-ignore
35
38
  def nil_assignment?
39
+ # this will always be false - should it be return_type ==
40
+ # ComplexType::NIL or somesuch?
36
41
  return_type.nil?
37
42
  end
38
43
 
@@ -88,6 +93,7 @@ module Solargraph
88
93
  ComplexType::UNDEFINED
89
94
  end
90
95
 
96
+ # @param other [Object]
91
97
  def == other
92
98
  return false unless super
93
99
  assignment == other.assignment
@@ -3,6 +3,8 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class Block < Callable
6
+ include Breakable
7
+
6
8
  # @return [Parser::AST::Node]
7
9
  attr_reader :receiver
8
10
 
@@ -0,0 +1,9 @@
1
+ module Solargraph
2
+ module Pin
3
+ # Mix-in for pins which enclose code which the 'break' statement works with-in - e.g., blocks, when, until, ...
4
+ module Breakable
5
+ # @return [Parser::AST::Node]
6
+ attr_reader :node
7
+ end
8
+ end
9
+ end
@@ -6,13 +6,19 @@ module Solargraph
6
6
  # @return [Range]
7
7
  attr_reader :presence
8
8
 
9
+ def presence_certain?
10
+ @presence_certain
11
+ end
12
+
9
13
  # @param assignment [AST::Node, nil]
10
14
  # @param presence [Range, nil]
15
+ # @param presence_certain [Boolean]
11
16
  # @param splat [Hash]
12
- def initialize assignment: nil, presence: nil, **splat
17
+ def initialize assignment: nil, presence: nil, presence_certain: false, **splat
13
18
  super(**splat)
14
19
  @assignment = assignment
15
20
  @presence = presence
21
+ @presence_certain = presence_certain
16
22
  end
17
23
 
18
24
  # @param pin [self]
@@ -166,9 +166,9 @@ module Solargraph
166
166
  def desc
167
167
  # ensure the signatures line up when logged
168
168
  if signatures.length > 1
169
- "\n#{to_rbs}\n"
169
+ path + " \n#{to_rbs}\n"
170
170
  else
171
- to_rbs
171
+ super
172
172
  end
173
173
  end
174
174
 
@@ -196,13 +196,14 @@ module Solargraph
196
196
  name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
197
197
  end
198
198
 
199
+ # @sg-ignore
199
200
  def documentation
200
201
  if @documentation.nil?
201
- @documentation ||= super || ''
202
+ method_docs ||= super || ''
202
203
  param_tags = docstring.tags(:param)
203
204
  unless param_tags.nil? or param_tags.empty?
204
- @documentation += "\n\n" unless @documentation.empty?
205
- @documentation += "Params:\n"
205
+ method_docs += "\n\n" unless method_docs.empty?
206
+ method_docs += "Params:\n"
206
207
  lines = []
207
208
  param_tags.each do |p|
208
209
  l = "* #{p.name}"
@@ -210,12 +211,12 @@ module Solargraph
210
211
  l += " #{p.text}"
211
212
  lines.push l
212
213
  end
213
- @documentation += lines.join("\n")
214
+ method_docs += lines.join("\n")
214
215
  end
215
216
  yieldparam_tags = docstring.tags(:yieldparam)
216
217
  unless yieldparam_tags.nil? or yieldparam_tags.empty?
217
- @documentation += "\n\n" unless @documentation.empty?
218
- @documentation += "Block Params:\n"
218
+ method_docs += "\n\n" unless method_docs.empty?
219
+ method_docs += "Block Params:\n"
219
220
  lines = []
220
221
  yieldparam_tags.each do |p|
221
222
  l = "* #{p.name}"
@@ -223,12 +224,12 @@ module Solargraph
223
224
  l += " #{p.text}"
224
225
  lines.push l
225
226
  end
226
- @documentation += lines.join("\n")
227
+ method_docs += lines.join("\n")
227
228
  end
228
229
  yieldreturn_tags = docstring.tags(:yieldreturn)
229
230
  unless yieldreturn_tags.empty?
230
- @documentation += "\n\n" unless @documentation.empty?
231
- @documentation += "Block Returns:\n"
231
+ method_docs += "\n\n" unless method_docs.empty?
232
+ method_docs += "Block Returns:\n"
232
233
  lines = []
233
234
  yieldreturn_tags.each do |r|
234
235
  l = "*"
@@ -236,12 +237,12 @@ module Solargraph
236
237
  l += " #{r.text}"
237
238
  lines.push l
238
239
  end
239
- @documentation += lines.join("\n")
240
+ method_docs += lines.join("\n")
240
241
  end
241
242
  return_tags = docstring.tags(:return)
242
243
  unless return_tags.empty?
243
- @documentation += "\n\n" unless @documentation.empty?
244
- @documentation += "Returns:\n"
244
+ method_docs += "\n\n" unless method_docs.empty?
245
+ method_docs += "Returns:\n"
245
246
  lines = []
246
247
  return_tags.each do |r|
247
248
  l = "*"
@@ -249,10 +250,11 @@ module Solargraph
249
250
  l += " #{r.text}"
250
251
  lines.push l
251
252
  end
252
- @documentation += lines.join("\n")
253
+ method_docs += lines.join("\n")
253
254
  end
254
- @documentation += "\n\n" unless @documentation.empty?
255
- @documentation += "Visibility: #{visibility}"
255
+ method_docs += "\n\n" unless method_docs.empty?
256
+ method_docs += "Visibility: #{visibility}"
257
+ @documentation = method_docs
256
258
  concat_example_tags
257
259
  end
258
260
  @documentation.to_s
@@ -315,7 +317,7 @@ module Solargraph
315
317
  @anon_splat
316
318
  end
317
319
 
318
- # @param [ApiMap]
320
+ # @param api_map [ApiMap]
319
321
  # @return [self]
320
322
  def resolve_ref_tag api_map
321
323
  return self if @resolved_ref_tag
@@ -14,21 +14,23 @@ module Solargraph
14
14
  # @param type [::Symbol] :class or :module
15
15
  # @param visibility [::Symbol] :public or :private
16
16
  # @param gates [::Array<String>]
17
- def initialize type: :class, visibility: :public, gates: [''], **splat
17
+ # @param name [String]
18
+ def initialize type: :class, visibility: :public, gates: [''], name: '', **splat
18
19
  # super(location, namespace, name, comments)
19
- super(**splat)
20
+ super(**splat, name: name)
20
21
  @type = type
21
22
  @visibility = visibility
22
23
  if name.start_with?('::')
23
- @name = name[2..-1]
24
+ # @type [String]
25
+ name = name[2..-1] || ''
24
26
  @closure = Solargraph::Pin::ROOT_PIN
25
27
  end
26
28
  @open_gates = gates
27
- if @name.include?('::')
29
+ if name.include?('::')
28
30
  # In this case, a chained namespace was opened (e.g., Foo::Bar)
29
31
  # but Foo does not exist.
30
- parts = @name.split('::')
31
- @name = parts.pop
32
+ parts = name.split('::')
33
+ name = parts.pop
32
34
  closure_name = if [Solargraph::Pin::ROOT_PIN, nil].include?(closure)
33
35
  ''
34
36
  else
@@ -38,6 +40,7 @@ module Solargraph
38
40
  @closure = Pin::Namespace.new(name: closure_name, gates: [parts.join('::')])
39
41
  @context = nil
40
42
  end
43
+ @name = name
41
44
  end
42
45
 
43
46
  def to_rbs
@@ -48,7 +51,7 @@ module Solargraph
48
51
  if name.nil? || name.empty?
49
52
  '(top-level)'
50
53
  else
51
- return_type.rooted_tags
54
+ super
52
55
  end
53
56
  end
54
57
 
@@ -11,12 +11,10 @@ module Solargraph
11
11
 
12
12
  # @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
13
13
  # @param asgn_code [String, nil]
14
- # @param return_type [ComplexType, nil]
15
- def initialize decl: :arg, asgn_code: nil, return_type: nil, **splat
14
+ def initialize decl: :arg, asgn_code: nil, **splat
16
15
  super(**splat)
17
16
  @asgn_code = asgn_code
18
17
  @decl = decl
19
- @return_type = return_type
20
18
  end
21
19
 
22
20
  def keyword?
@@ -115,6 +113,15 @@ module Solargraph
115
113
  closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
116
114
  end
117
115
 
116
+ # @param atype [ComplexType]
117
+ # @param api_map [ApiMap]
118
+ def compatible_arg?(atype, api_map)
119
+ # make sure we get types from up the method
120
+ # inheritance chain if we don't have them on this pin
121
+ ptype = typify api_map
122
+ ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
123
+ end
124
+
118
125
  def documentation
119
126
  tag = param_tag
120
127
  return '' if tag.nil? || tag.text.nil?
@@ -141,8 +148,9 @@ module Solargraph
141
148
  # @param api_map [ApiMap]
142
149
  # @return [ComplexType]
143
150
  def typify_block_param api_map
144
- if closure.is_a?(Pin::Block) && closure.receiver
145
- return closure.typify_parameters(api_map)[index]
151
+ block_pin = closure
152
+ if block_pin.is_a?(Pin::Block) && block_pin.receiver
153
+ return block_pin.typify_parameters(api_map)[index]
146
154
  end
147
155
  ComplexType::UNDEFINED
148
156
  end
@@ -4,24 +4,30 @@ module Solargraph
4
4
  module Pin
5
5
  class ProxyType < Base
6
6
  # @param return_type [ComplexType]
7
- def initialize return_type: ComplexType::UNDEFINED, **splat
7
+ def initialize return_type: ComplexType::UNDEFINED, binder: nil, **splat
8
8
  super(**splat)
9
9
  @return_type = return_type
10
+ @binder = binder if binder
10
11
  end
11
12
 
12
13
  def context
13
14
  @return_type
14
15
  end
15
16
 
16
- # @param return_type [ComplexType]
17
+ # @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
18
+ # @param closure [Pin::Namespace, nil] Used as the closure for this pin
19
+ # @param binder [ComplexType, ComplexType::UniqueType, nil]
17
20
  # @return [ProxyType]
18
- def self.anonymous return_type
19
- parts = return_type.namespace.split('::')
20
- namespace = parts[0..-2].join('::').to_s
21
+ def self.anonymous context, closure: nil, binder: nil
22
+ unless closure
23
+ parts = context.namespace.split('::')
24
+ namespace = parts[0..-2].join('::').to_s
25
+ closure = Solargraph::Pin::Namespace.new(name: namespace)
26
+ end
21
27
  # name = parts.last.to_s
22
28
  # ProxyType.new(nil, namespace, name, return_type)
23
29
  ProxyType.new(
24
- closure: Solargraph::Pin::Namespace.new(name: namespace), return_type: return_type
30
+ closure: closure, return_type: context, binder: binder || context
25
31
  )
26
32
  end
27
33
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Until < Base
6
+ include Breakable
7
+
8
+ # @param receiver [Parser::AST::Node, nil]
9
+ # @param node [Parser::AST::Node, nil]
10
+ # @param context [ComplexType, nil]
11
+ # @param args [::Array<Parameter>]
12
+ def initialize node: nil, **splat
13
+ super(**splat)
14
+ @node = node
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class While < Base
6
+ include Breakable
7
+
8
+ # @param receiver [Parser::AST::Node, nil]
9
+ # @param node [Parser::AST::Node, nil]
10
+ # @param context [ComplexType, nil]
11
+ # @param args [::Array<Parameter>]
12
+ def initialize node: nil, **splat
13
+ super(**splat)
14
+ @node = node
15
+ end
16
+ end
17
+ end
18
+ end
@@ -34,6 +34,9 @@ module Solargraph
34
34
  autoload :Singleton, 'solargraph/pin/singleton'
35
35
  autoload :KeywordParam, 'solargraph/pin/keyword_param'
36
36
  autoload :Search, 'solargraph/pin/search'
37
+ autoload :Breakable, 'solargraph/pin/breakable'
38
+ autoload :Until, 'solargraph/pin/until'
39
+ autoload :While, 'solargraph/pin/while'
37
40
  autoload :Callable, 'solargraph/pin/callable'
38
41
 
39
42
  ROOT_PIN = Pin::Namespace.new(type: :class, name: '', closure: nil)
@@ -351,34 +351,34 @@ module Solargraph
351
351
  parameters = []
352
352
  arg_num = -1
353
353
  type.type.required_positionals.each do |param|
354
- name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
354
+ name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
355
355
  parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
356
356
  end
357
357
  type.type.optional_positionals.each do |param|
358
- name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
358
+ name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
359
359
  parameters.push Solargraph::Pin::Parameter.new(decl: :optarg, name: name, closure: pin,
360
360
  return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
361
361
  end
362
362
  if type.type.rest_positionals
363
- name = type.type.rest_positionals.name ? type.type.rest_positionals.name.to_s : "arg#{arg_num += 1}"
363
+ name = type.type.rest_positionals.name ? type.type.rest_positionals.name.to_s : "arg_#{arg_num += 1}"
364
364
  parameters.push Solargraph::Pin::Parameter.new(decl: :restarg, name: name, closure: pin)
365
365
  end
366
366
  type.type.trailing_positionals.each do |param|
367
- name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
367
+ name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
368
368
  parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin)
369
369
  end
370
370
  type.type.required_keywords.each do |orig, param|
371
- name = orig ? orig.to_s : "arg#{arg_num += 1}"
371
+ name = orig ? orig.to_s : "arg_#{arg_num += 1}"
372
372
  parameters.push Solargraph::Pin::Parameter.new(decl: :kwarg, name: name, closure: pin,
373
373
  return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
374
374
  end
375
375
  type.type.optional_keywords.each do |orig, param|
376
- name = orig ? orig.to_s : "arg#{arg_num += 1}"
376
+ name = orig ? orig.to_s : "arg_#{arg_num += 1}"
377
377
  parameters.push Solargraph::Pin::Parameter.new(decl: :kwoptarg, name: name, closure: pin,
378
378
  return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
379
379
  end
380
380
  if type.type.rest_keywords
381
- name = type.type.rest_keywords.name ? type.type.rest_keywords.name.to_s : "arg#{arg_num += 1}"
381
+ name = type.type.rest_keywords.name ? type.type.rest_keywords.name.to_s : "arg_#{arg_num += 1}"
382
382
  parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg, name: type.type.rest_keywords.name.to_s, closure: pin)
383
383
  end
384
384
 
@@ -575,7 +575,7 @@ module Solargraph
575
575
  elsif type.is_a?(RBS::Types::Tuple)
576
576
  "Array(#{type.types.map { |t| other_type_to_tag(t) }.join(', ')})"
577
577
  elsif type.is_a?(RBS::Types::Literal)
578
- type.literal.to_s
578
+ type.literal.inspect
579
579
  elsif type.is_a?(RBS::Types::Union)
580
580
  type.types.map { |t| other_type_to_tag(t) }.join(', ')
581
581
  elsif type.is_a?(RBS::Types::Record)