solargraph 0.54.4 → 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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/lib/solargraph/api_map/index.rb +1 -1
  4. data/lib/solargraph/api_map/store.rb +40 -19
  5. data/lib/solargraph/api_map.rb +24 -19
  6. data/lib/solargraph/bench.rb +17 -1
  7. data/lib/solargraph/complex_type/unique_type.rb +88 -7
  8. data/lib/solargraph/complex_type.rb +35 -6
  9. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +51 -0
  10. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +100 -0
  11. data/lib/solargraph/convention/struct_definition.rb +101 -0
  12. data/lib/solargraph/convention.rb +1 -0
  13. data/lib/solargraph/doc_map.rb +42 -18
  14. data/lib/solargraph/language_server/host/message_worker.rb +10 -7
  15. data/lib/solargraph/language_server/host.rb +1 -0
  16. data/lib/solargraph/library.rb +2 -1
  17. data/lib/solargraph/location.rb +8 -0
  18. data/lib/solargraph/parser/comment_ripper.rb +11 -6
  19. data/lib/solargraph/parser/flow_sensitive_typing.rb +226 -0
  20. data/lib/solargraph/parser/node_methods.rb +14 -0
  21. data/lib/solargraph/parser/node_processor.rb +0 -1
  22. data/lib/solargraph/parser/parser_gem/class_methods.rb +11 -6
  23. data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
  24. data/lib/solargraph/parser/parser_gem/node_methods.rb +3 -1
  25. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
  26. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +21 -1
  27. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
  28. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +26 -5
  29. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
  30. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +28 -0
  31. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +28 -0
  32. data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
  33. data/lib/solargraph/parser.rb +1 -0
  34. data/lib/solargraph/pin/base.rb +9 -3
  35. data/lib/solargraph/pin/base_variable.rb +7 -1
  36. data/lib/solargraph/pin/block.rb +2 -0
  37. data/lib/solargraph/pin/breakable.rb +9 -0
  38. data/lib/solargraph/pin/local_variable.rb +7 -1
  39. data/lib/solargraph/pin/method.rb +20 -18
  40. data/lib/solargraph/pin/namespace.rb +10 -7
  41. data/lib/solargraph/pin/parameter.rb +13 -5
  42. data/lib/solargraph/pin/proxy_type.rb +12 -6
  43. data/lib/solargraph/pin/until.rb +18 -0
  44. data/lib/solargraph/pin/while.rb +18 -0
  45. data/lib/solargraph/pin.rb +3 -0
  46. data/lib/solargraph/rbs_map/conversions.rb +8 -8
  47. data/lib/solargraph/rbs_map/core_fills.rb +10 -3
  48. data/lib/solargraph/source/chain/array.rb +4 -3
  49. data/lib/solargraph/source/chain/call.rb +46 -17
  50. data/lib/solargraph/source/chain/constant.rb +1 -1
  51. data/lib/solargraph/source/chain/hash.rb +3 -2
  52. data/lib/solargraph/source/chain/link.rb +2 -0
  53. data/lib/solargraph/source/chain/literal.rb +22 -2
  54. data/lib/solargraph/source/chain/z_super.rb +1 -1
  55. data/lib/solargraph/source/chain.rb +77 -47
  56. data/lib/solargraph/source/source_chainer.rb +2 -2
  57. data/lib/solargraph/source_map/clip.rb +3 -1
  58. data/lib/solargraph/type_checker/checks.rb +4 -0
  59. data/lib/solargraph/type_checker.rb +35 -8
  60. data/lib/solargraph/version.rb +1 -1
  61. data/lib/solargraph/yard_map/mapper/to_method.rb +42 -15
  62. data/lib/solargraph/yardoc.rb +1 -1
  63. metadata +15 -3
@@ -57,22 +57,22 @@ module Solargraph
57
57
  elsif n.type == :send
58
58
  if n.children[0].is_a?(::Parser::AST::Node)
59
59
  result.concat generate_links(n.children[0])
60
- result.push Chain::Call.new(n.children[1].to_s, node_args(n), passed_block(n))
60
+ result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
61
61
  elsif n.children[0].nil?
62
62
  args = []
63
63
  n.children[2..-1].each do |c|
64
64
  args.push NodeChainer.chain(c, @filename, n)
65
65
  end
66
- result.push Chain::Call.new(n.children[1].to_s, node_args(n), passed_block(n))
66
+ result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
67
67
  else
68
68
  raise "No idea what to do with #{n}"
69
69
  end
70
70
  elsif n.type == :csend
71
71
  if n.children[0].is_a?(::Parser::AST::Node)
72
72
  result.concat generate_links(n.children[0])
73
- result.push Chain::QCall.new(n.children[1].to_s, node_args(n))
73
+ result.push Chain::QCall.new(n.children[1].to_s, Location.from_node(n), node_args(n))
74
74
  elsif n.children[0].nil?
75
- result.push Chain::QCall.new(n.children[1].to_s, node_args(n))
75
+ result.push Chain::QCall.new(n.children[1].to_s, Location.from_node(n), node_args(n))
76
76
  else
77
77
  raise "No idea what to do with #{n}"
78
78
  end
@@ -82,15 +82,15 @@ module Solargraph
82
82
  result.push Chain::ZSuper.new('super')
83
83
  elsif n.type == :super
84
84
  args = n.children.map { |c| NodeChainer.chain(c, @filename, n) }
85
- result.push Chain::Call.new('super', args)
85
+ result.push Chain::Call.new('super', Location.from_node(n), args)
86
86
  elsif n.type == :yield
87
87
  args = n.children.map { |c| NodeChainer.chain(c, @filename, n) }
88
- result.push Chain::Call.new('yield', args)
88
+ result.push Chain::Call.new('yield', Location.from_node(n), args)
89
89
  elsif n.type == :const
90
90
  const = unpack_name(n)
91
91
  result.push Chain::Constant.new(const)
92
92
  elsif [:lvar, :lvasgn].include?(n.type)
93
- result.push Chain::Call.new(n.children[0].to_s)
93
+ result.push Chain::Call.new(n.children[0].to_s, Location.from_node(n))
94
94
  elsif [:ivar, :ivasgn].include?(n.type)
95
95
  result.push Chain::InstanceVariable.new(n.children[0].to_s)
96
96
  elsif [:cvar, :cvasgn].include?(n.type)
@@ -124,13 +124,13 @@ module Solargraph
124
124
  end
125
125
  end
126
126
  elsif n.type == :hash
127
- result.push Chain::Hash.new('::Hash', hash_is_splatted?(n))
127
+ result.push Chain::Hash.new('::Hash', n, hash_is_splatted?(n))
128
128
  elsif n.type == :array
129
129
  chained_children = n.children.map { |c| NodeChainer.chain(c) }
130
- result.push Source::Chain::Array.new(chained_children)
130
+ result.push Source::Chain::Array.new(chained_children, n)
131
131
  else
132
132
  lit = infer_literal_node_type(n)
133
- result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
133
+ result.push (lit ? Chain::Literal.new(lit, n) : Chain::Link.new)
134
134
  end
135
135
  result
136
136
  end
@@ -40,7 +40,7 @@ module Solargraph
40
40
  if n.is_a?(AST::Node)
41
41
  if n.type == :cbase
42
42
  parts = [''] + pack_name(n)
43
- else
43
+ elsif n.type == :const
44
44
  parts += pack_name(n)
45
45
  end
46
46
  else
@@ -59,6 +59,8 @@ module Solargraph
59
59
  return '::String'
60
60
  elsif node.type == :array
61
61
  return '::Array'
62
+ elsif node.type == :nil
63
+ return '::NilClass'
62
64
  elsif node.type == :hash
63
65
  return '::Hash'
64
66
  elsif node.type == :int
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class AndNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ process_children
12
+
13
+ position = get_node_start_position(node)
14
+ enclosing_breakable_pin = pins.select{|pin| pin.is_a?(Pin::Breakable) && pin.location.range.contain?(position)}.last
15
+ FlowSensitiveTyping.new(locals, enclosing_breakable_pin).process_and(node)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -8,6 +8,17 @@ module Solargraph
8
8
  include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
+ if Convention::StructDefinition::StructAssignmentNode.valid?(node)
12
+ process_struct_assignment
13
+ else
14
+ process_constant_assignment
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ # @return [void]
21
+ def process_constant_assignment
11
22
  pins.push Solargraph::Pin::Constant.new(
12
23
  location: get_node_location(node),
13
24
  closure: region.closure,
@@ -18,7 +29,16 @@ module Solargraph
18
29
  process_children
19
30
  end
20
31
 
21
- private
32
+ # TODO: Move this out of [CasgnNode] once [Solargraph::Parser::NodeProcessor] supports
33
+ # multiple processors.
34
+ def process_struct_assignment
35
+ processor_klass = Convention::StructDefinition::NodeProcessors::StructNode
36
+ processor = processor_klass.new(node, region, pins, locals)
37
+ processor.process
38
+
39
+ @pins = processor.pins
40
+ @locals = processor.locals
41
+ end
22
42
 
23
43
  # @return [String]
24
44
  def const_name
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class IfNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ process_children
12
+
13
+ position = get_node_start_position(node)
14
+ enclosing_breakable_pin = pins.select{|pin| pin.is_a?(Pin::Breakable) && pin.location.range.contain?(position)}.last
15
+ FlowSensitiveTyping.new(locals, enclosing_breakable_pin).process_if(node)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -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