solargraph 0.54.1 → 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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -0
  3. data/lib/solargraph/api_map/cache.rb +10 -1
  4. data/lib/solargraph/api_map/index.rb +167 -0
  5. data/lib/solargraph/api_map/store.rb +71 -122
  6. data/lib/solargraph/api_map.rb +97 -36
  7. data/lib/solargraph/bench.rb +17 -1
  8. data/lib/solargraph/complex_type/type_methods.rb +7 -0
  9. data/lib/solargraph/complex_type/unique_type.rb +109 -8
  10. data/lib/solargraph/complex_type.rb +48 -18
  11. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +51 -0
  12. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +100 -0
  13. data/lib/solargraph/convention/struct_definition.rb +101 -0
  14. data/lib/solargraph/convention.rb +2 -0
  15. data/lib/solargraph/doc_map.rb +43 -18
  16. data/lib/solargraph/equality.rb +33 -0
  17. data/lib/solargraph/language_server/host/message_worker.rb +31 -11
  18. data/lib/solargraph/language_server/host.rb +13 -11
  19. data/lib/solargraph/language_server/message/base.rb +19 -12
  20. data/lib/solargraph/language_server/message/initialize.rb +3 -1
  21. data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
  22. data/lib/solargraph/language_server/message/text_document/formatting.rb +4 -0
  23. data/lib/solargraph/library.rb +7 -8
  24. data/lib/solargraph/location.rb +15 -0
  25. data/lib/solargraph/parser/comment_ripper.rb +11 -6
  26. data/lib/solargraph/parser/flow_sensitive_typing.rb +226 -0
  27. data/lib/solargraph/parser/node_methods.rb +15 -1
  28. data/lib/solargraph/parser/parser_gem/class_methods.rb +11 -6
  29. data/lib/solargraph/parser/parser_gem/node_chainer.rb +17 -23
  30. data/lib/solargraph/parser/parser_gem/node_methods.rb +5 -3
  31. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
  32. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +21 -1
  33. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
  34. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -2
  35. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +26 -5
  36. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
  37. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +28 -0
  38. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +28 -0
  39. data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
  40. data/lib/solargraph/parser.rb +1 -0
  41. data/lib/solargraph/pin/base.rb +35 -19
  42. data/lib/solargraph/pin/base_variable.rb +10 -3
  43. data/lib/solargraph/pin/block.rb +3 -3
  44. data/lib/solargraph/pin/breakable.rb +9 -0
  45. data/lib/solargraph/pin/callable.rb +3 -3
  46. data/lib/solargraph/pin/local_variable.rb +7 -1
  47. data/lib/solargraph/pin/method.rb +26 -18
  48. data/lib/solargraph/pin/namespace.rb +10 -7
  49. data/lib/solargraph/pin/parameter.rb +15 -6
  50. data/lib/solargraph/pin/proxy_type.rb +12 -6
  51. data/lib/solargraph/pin/until.rb +18 -0
  52. data/lib/solargraph/pin/while.rb +18 -0
  53. data/lib/solargraph/pin.rb +3 -0
  54. data/lib/solargraph/position.rb +7 -0
  55. data/lib/solargraph/range.rb +7 -0
  56. data/lib/solargraph/rbs_map/conversions.rb +16 -10
  57. data/lib/solargraph/rbs_map/core_fills.rb +10 -3
  58. data/lib/solargraph/rbs_map.rb +1 -0
  59. data/lib/solargraph/shell.rb +2 -0
  60. data/lib/solargraph/source/chain/array.rb +5 -4
  61. data/lib/solargraph/source/chain/call.rb +55 -19
  62. data/lib/solargraph/source/chain/constant.rb +1 -1
  63. data/lib/solargraph/source/chain/hash.rb +8 -2
  64. data/lib/solargraph/source/chain/if.rb +5 -0
  65. data/lib/solargraph/source/chain/link.rb +19 -5
  66. data/lib/solargraph/source/chain/literal.rb +27 -2
  67. data/lib/solargraph/source/chain/z_super.rb +1 -1
  68. data/lib/solargraph/source/chain.rb +107 -63
  69. data/lib/solargraph/source/cursor.rb +1 -11
  70. data/lib/solargraph/source/source_chainer.rb +2 -2
  71. data/lib/solargraph/source.rb +2 -1
  72. data/lib/solargraph/source_map/clip.rb +4 -2
  73. data/lib/solargraph/type_checker/checks.rb +4 -0
  74. data/lib/solargraph/type_checker.rb +41 -14
  75. data/lib/solargraph/version.rb +1 -1
  76. data/lib/solargraph/workspace/config.rb +7 -3
  77. data/lib/solargraph/workspace.rb +1 -1
  78. data/lib/solargraph/yard_map/mapper/to_constant.rb +1 -0
  79. data/lib/solargraph/yard_map/mapper/to_method.rb +42 -15
  80. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
  81. data/lib/solargraph/yard_map/mapper.rb +1 -0
  82. data/lib/solargraph/yardoc.rb +1 -1
  83. data/lib/solargraph.rb +1 -0
  84. data/solargraph.gemspec +5 -5
  85. metadata +39 -25
@@ -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]
@@ -71,15 +77,14 @@ module Solargraph
71
77
  # @param context_type [ComplexType] The receiver type
72
78
  # @return [self]
73
79
  def resolve_generics definitions, context_type
74
- transformed = transform_types { |t| t.resolve_generics(definitions, context_type) if t }
75
- transformed.erase_generics(definitions.generics)
80
+ transform_types { |t| t.resolve_generics(definitions, context_type) if t }
76
81
  end
77
82
 
78
83
  def all_rooted?
79
84
  !return_type || return_type.all_rooted?
80
85
  end
81
86
 
82
- # @param generics_to_erase [Enumerable<String>]
87
+ # @param generics_to_erase [::Array<String>]
83
88
  # @return [self]
84
89
  def erase_generics(generics_to_erase)
85
90
  return self if generics_to_erase.empty?
@@ -103,7 +108,7 @@ module Solargraph
103
108
  end
104
109
 
105
110
  def to_s
106
- to_rbs
111
+ desc
107
112
  end
108
113
 
109
114
  # @return [Boolean]
@@ -116,14 +121,6 @@ module Solargraph
116
121
  location || type_location
117
122
  end
118
123
 
119
- # Pin equality is determined using the #nearly? method and also
120
- # requiring both pins to have the same location.
121
- #
122
- def == other
123
- return false unless nearly? other
124
- comments == other.comments and location == other.location
125
- end
126
-
127
124
  # True if the specified pin is a near match to this one. A near match
128
125
  # indicates that the pins contain mostly the same data. Any differences
129
126
  # between them should not have an impact on the API surface.
@@ -140,6 +137,14 @@ module Solargraph
140
137
  )
141
138
  end
142
139
 
140
+ # Pin equality is determined using the #nearly? method and also
141
+ # requiring both pins to have the same location.
142
+ #
143
+ def == other
144
+ return false unless nearly? other
145
+ comments == other.comments && location == other.location
146
+ end
147
+
143
148
  # The pin's return type.
144
149
  #
145
150
  # @return [ComplexType]
@@ -266,9 +271,10 @@ module Solargraph
266
271
  result
267
272
  end
268
273
 
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]
@@ -276,19 +282,29 @@ module Solargraph
276
282
  return_type.to_rbs
277
283
  end
278
284
 
279
- # @return [String, nil]
280
- def desc
285
+ # @return [String]
286
+ def type_desc
287
+ rbs = to_rbs
288
+ # RBS doesn't have a way to represent a Class<x> type
289
+ rbs = return_type.rooted_tags if return_type.name == 'Class'
281
290
  if path
282
- if to_rbs
283
- path + ' ' + to_rbs
291
+ if rbs
292
+ path + ' ' + rbs
284
293
  else
285
294
  path
286
295
  end
287
296
  else
288
- to_rbs
297
+ rbs
289
298
  end
290
299
  end
291
300
 
301
+ # @return [String]
302
+ def desc
303
+ closure_info = closure&.desc
304
+ binder_info = binder&.desc
305
+ "[name=#{name.inspect} return_type=#{type_desc}, context=#{context.rooted_tags}, closure=#{closure_info}, binder=#{binder_info}]"
306
+ end
307
+
292
308
  def inspect
293
309
  "#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
294
310
  end
@@ -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,11 +93,13 @@ 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
94
100
  end
95
101
 
102
+ # @param pin [self]
96
103
  def try_merge! pin
97
104
  return false unless super
98
105
  @assignment = pin.assignment
@@ -100,8 +107,8 @@ module Solargraph
100
107
  true
101
108
  end
102
109
 
103
- def desc
104
- "#{to_rbs} = #{assignment&.type.inspect}"
110
+ def type_desc
111
+ "#{super} = #{assignment&.type.inspect}"
105
112
  end
106
113
 
107
114
  private
@@ -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
 
@@ -36,14 +38,12 @@ module Solargraph
36
38
  #
37
39
  # @return [::Array<ComplexType>]
38
40
  def destructure_yield_types(yield_types, parameters)
39
- return yield_types if yield_types.length == parameters.length
40
-
41
41
  # yielding a tuple into a block will destructure the tuple
42
42
  if yield_types.length == 1
43
43
  yield_type = yield_types.first
44
44
  return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
45
45
  end
46
- parameters.map { ComplexType::UNDEFINED }
46
+ parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
47
47
  end
48
48
 
49
49
  # @param api_map [ApiMap]
@@ -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
@@ -3,7 +3,7 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class Callable < Closure
6
- # @return [self]
6
+ # @return [Signature]
7
7
  attr_reader :block
8
8
 
9
9
  attr_reader :parameters
@@ -57,7 +57,7 @@ module Solargraph
57
57
  callable
58
58
  end
59
59
 
60
- # @param generics_to_resolve [Enumerable<String>]
60
+ # @param generics_to_resolve [::Array<String>]
61
61
  # @param arg_types [Array<ComplexType>, nil]
62
62
  # @param return_type_context [ComplexType, nil]
63
63
  # @param yield_arg_types [Array<ComplexType>, nil]
@@ -113,7 +113,7 @@ module Solargraph
113
113
  end
114
114
 
115
115
  # @param arguments [::Array<Chain>]
116
- # @param signature [Pin::Signature]
116
+ # @param with_block [Boolean]
117
117
  # @return [Boolean]
118
118
  def arity_matches? arguments, with_block
119
119
  argcount = arguments.length
@@ -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]
@@ -31,6 +31,10 @@ module Solargraph
31
31
  @anon_splat = anon_splat
32
32
  end
33
33
 
34
+ def == other
35
+ super && other.node == node
36
+ end
37
+
34
38
  def transform_types(&transform)
35
39
  # @todo 'super' alone should work here I think, but doesn't typecheck at level typed
36
40
  m = super(&transform)
@@ -162,9 +166,9 @@ module Solargraph
162
166
  def desc
163
167
  # ensure the signatures line up when logged
164
168
  if signatures.length > 1
165
- "\n#{to_rbs}\n"
169
+ path + " \n#{to_rbs}\n"
166
170
  else
167
- to_rbs
171
+ super
168
172
  end
169
173
  end
170
174
 
@@ -192,13 +196,14 @@ module Solargraph
192
196
  name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
193
197
  end
194
198
 
199
+ # @sg-ignore
195
200
  def documentation
196
201
  if @documentation.nil?
197
- @documentation ||= super || ''
202
+ method_docs ||= super || ''
198
203
  param_tags = docstring.tags(:param)
199
204
  unless param_tags.nil? or param_tags.empty?
200
- @documentation += "\n\n" unless @documentation.empty?
201
- @documentation += "Params:\n"
205
+ method_docs += "\n\n" unless method_docs.empty?
206
+ method_docs += "Params:\n"
202
207
  lines = []
203
208
  param_tags.each do |p|
204
209
  l = "* #{p.name}"
@@ -206,12 +211,12 @@ module Solargraph
206
211
  l += " #{p.text}"
207
212
  lines.push l
208
213
  end
209
- @documentation += lines.join("\n")
214
+ method_docs += lines.join("\n")
210
215
  end
211
216
  yieldparam_tags = docstring.tags(:yieldparam)
212
217
  unless yieldparam_tags.nil? or yieldparam_tags.empty?
213
- @documentation += "\n\n" unless @documentation.empty?
214
- @documentation += "Block Params:\n"
218
+ method_docs += "\n\n" unless method_docs.empty?
219
+ method_docs += "Block Params:\n"
215
220
  lines = []
216
221
  yieldparam_tags.each do |p|
217
222
  l = "* #{p.name}"
@@ -219,12 +224,12 @@ module Solargraph
219
224
  l += " #{p.text}"
220
225
  lines.push l
221
226
  end
222
- @documentation += lines.join("\n")
227
+ method_docs += lines.join("\n")
223
228
  end
224
229
  yieldreturn_tags = docstring.tags(:yieldreturn)
225
230
  unless yieldreturn_tags.empty?
226
- @documentation += "\n\n" unless @documentation.empty?
227
- @documentation += "Block Returns:\n"
231
+ method_docs += "\n\n" unless method_docs.empty?
232
+ method_docs += "Block Returns:\n"
228
233
  lines = []
229
234
  yieldreturn_tags.each do |r|
230
235
  l = "*"
@@ -232,12 +237,12 @@ module Solargraph
232
237
  l += " #{r.text}"
233
238
  lines.push l
234
239
  end
235
- @documentation += lines.join("\n")
240
+ method_docs += lines.join("\n")
236
241
  end
237
242
  return_tags = docstring.tags(:return)
238
243
  unless return_tags.empty?
239
- @documentation += "\n\n" unless @documentation.empty?
240
- @documentation += "Returns:\n"
244
+ method_docs += "\n\n" unless method_docs.empty?
245
+ method_docs += "Returns:\n"
241
246
  lines = []
242
247
  return_tags.each do |r|
243
248
  l = "*"
@@ -245,10 +250,11 @@ module Solargraph
245
250
  l += " #{r.text}"
246
251
  lines.push l
247
252
  end
248
- @documentation += lines.join("\n")
253
+ method_docs += lines.join("\n")
249
254
  end
250
- @documentation += "\n\n" unless @documentation.empty?
251
- @documentation += "Visibility: #{visibility}"
255
+ method_docs += "\n\n" unless method_docs.empty?
256
+ method_docs += "Visibility: #{visibility}"
257
+ @documentation = method_docs
252
258
  concat_example_tags
253
259
  end
254
260
  @documentation.to_s
@@ -262,6 +268,7 @@ module Solargraph
262
268
  @attribute
263
269
  end
264
270
 
271
+ # @parm other [Method]
265
272
  def nearly? other
266
273
  super &&
267
274
  parameters == other.parameters &&
@@ -273,6 +280,7 @@ module Solargraph
273
280
  attribute? ? infer_from_iv(api_map) : infer_from_return_nodes(api_map)
274
281
  end
275
282
 
283
+ # @param pin [Pin::Method]
276
284
  def try_merge! pin
277
285
  return false unless super
278
286
  @node = pin.node
@@ -309,7 +317,7 @@ module Solargraph
309
317
  @anon_splat
310
318
  end
311
319
 
312
- # @param [ApiMap]
320
+ # @param api_map [ApiMap]
313
321
  # @return [self]
314
322
  def resolve_ref_tag api_map
315
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
- to_rbs
54
+ super
52
55
  end
53
56
  end
54
57