solargraph 0.54.5 → 0.55.4

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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/typecheck.yml +1 -1
  3. data/CHANGELOG.md +27 -0
  4. data/lib/solargraph/api_map/store.rb +9 -4
  5. data/lib/solargraph/api_map.rb +116 -39
  6. data/lib/solargraph/complex_type/type_methods.rb +1 -0
  7. data/lib/solargraph/complex_type/unique_type.rb +91 -9
  8. data/lib/solargraph/complex_type.rb +35 -6
  9. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +60 -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 +83 -23
  14. data/lib/solargraph/gem_pins.rb +2 -1
  15. data/lib/solargraph/language_server/host/message_worker.rb +10 -7
  16. data/lib/solargraph/language_server/host.rb +3 -1
  17. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +1 -0
  18. data/lib/solargraph/location.rb +8 -0
  19. data/lib/solargraph/logging.rb +1 -0
  20. data/lib/solargraph/parser/comment_ripper.rb +12 -6
  21. data/lib/solargraph/parser/flow_sensitive_typing.rb +227 -0
  22. data/lib/solargraph/parser/node_methods.rb +14 -0
  23. data/lib/solargraph/parser/node_processor.rb +3 -2
  24. data/lib/solargraph/parser/parser_gem/class_methods.rb +9 -0
  25. data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
  26. data/lib/solargraph/parser/parser_gem/node_methods.rb +4 -2
  27. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  28. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
  29. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +4 -2
  30. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +4 -2
  31. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +23 -2
  32. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  33. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +6 -3
  34. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  35. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  36. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
  37. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +4 -2
  38. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -1
  39. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +29 -6
  40. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
  41. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  42. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -3
  43. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +28 -16
  44. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +2 -1
  45. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  46. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  47. data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
  48. data/lib/solargraph/parser/region.rb +1 -1
  49. data/lib/solargraph/parser.rb +1 -0
  50. data/lib/solargraph/pin/base.rb +34 -5
  51. data/lib/solargraph/pin/base_variable.rb +7 -1
  52. data/lib/solargraph/pin/block.rb +2 -0
  53. data/lib/solargraph/pin/breakable.rb +9 -0
  54. data/lib/solargraph/pin/callable.rb +5 -3
  55. data/lib/solargraph/pin/closure.rb +6 -1
  56. data/lib/solargraph/pin/common.rb +5 -0
  57. data/lib/solargraph/pin/delegated_method.rb +20 -1
  58. data/lib/solargraph/pin/documenting.rb +16 -0
  59. data/lib/solargraph/pin/keyword.rb +7 -2
  60. data/lib/solargraph/pin/local_variable.rb +7 -1
  61. data/lib/solargraph/pin/method.rb +34 -27
  62. data/lib/solargraph/pin/namespace.rb +17 -9
  63. data/lib/solargraph/pin/parameter.rb +17 -5
  64. data/lib/solargraph/pin/proxy_type.rb +12 -6
  65. data/lib/solargraph/pin/reference/override.rb +10 -6
  66. data/lib/solargraph/pin/reference/require.rb +2 -2
  67. data/lib/solargraph/pin/signature.rb +4 -0
  68. data/lib/solargraph/pin/singleton.rb +1 -1
  69. data/lib/solargraph/pin/symbol.rb +3 -2
  70. data/lib/solargraph/pin/until.rb +18 -0
  71. data/lib/solargraph/pin/while.rb +18 -0
  72. data/lib/solargraph/pin.rb +4 -1
  73. data/lib/solargraph/rbs_map/conversions.rb +172 -56
  74. data/lib/solargraph/rbs_map/core_fills.rb +32 -16
  75. data/lib/solargraph/rbs_map/core_map.rb +3 -2
  76. data/lib/solargraph/shell.rb +1 -0
  77. data/lib/solargraph/source/chain/array.rb +11 -7
  78. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  79. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  80. data/lib/solargraph/source/chain/call.rb +53 -23
  81. data/lib/solargraph/source/chain/constant.rb +1 -1
  82. data/lib/solargraph/source/chain/hash.rb +4 -3
  83. data/lib/solargraph/source/chain/head.rb +1 -1
  84. data/lib/solargraph/source/chain/if.rb +1 -1
  85. data/lib/solargraph/source/chain/link.rb +2 -0
  86. data/lib/solargraph/source/chain/literal.rb +22 -2
  87. data/lib/solargraph/source/chain/or.rb +1 -1
  88. data/lib/solargraph/source/chain/z_super.rb +1 -1
  89. data/lib/solargraph/source/chain.rb +78 -48
  90. data/lib/solargraph/source/source_chainer.rb +2 -2
  91. data/lib/solargraph/source_map/clip.rb +3 -1
  92. data/lib/solargraph/source_map/mapper.rb +9 -5
  93. data/lib/solargraph/type_checker/checks.rb +4 -0
  94. data/lib/solargraph/type_checker.rb +35 -8
  95. data/lib/solargraph/version.rb +1 -1
  96. data/lib/solargraph/yard_map/mapper/to_constant.rb +4 -2
  97. data/lib/solargraph/yard_map/mapper/to_method.rb +55 -15
  98. data/lib/solargraph/yard_map/mapper/to_namespace.rb +4 -2
  99. data/lib/solargraph/yard_map/mapper.rb +4 -3
  100. data/lib/solargraph/yard_map/to_method.rb +4 -2
  101. data/lib/solargraph.rb +20 -0
  102. data/rbs/fills/tuple.rbs +150 -0
  103. metadata +15 -2
@@ -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
@@ -24,7 +24,8 @@ module Solargraph
24
24
  closure: region.closure,
25
25
  name: node.children[1].children[0].to_s,
26
26
  comments: "@type [#{types.join(',')}]",
27
- presence: presence
27
+ presence: presence,
28
+ source: :parser
28
29
  )
29
30
  end
30
31
  NodeProcessor.process(node.children[2], region, pins, locals)
@@ -17,7 +17,7 @@ module Solargraph
17
17
  names.concat [NodeMethods.unpack_name(sclass.children[0]), sclass.children[1].to_s]
18
18
  end
19
19
  name = names.reject(&:empty?).join('::')
20
- closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location)
20
+ closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
21
21
  elsif sclass.is_a?(AST::Node) && sclass.type == :const
22
22
  names = [region.closure.namespace, region.closure.name]
23
23
  also = NodeMethods.unpack_name(sclass)
@@ -25,13 +25,14 @@ module Solargraph
25
25
  names << also
26
26
  end
27
27
  name = names.reject(&:empty?).join('::')
28
- closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location)
28
+ closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
29
29
  else
30
30
  return
31
31
  end
32
32
  pins.push Solargraph::Pin::Singleton.new(
33
33
  location: get_node_location(node),
34
- closure: closure
34
+ closure: closure,
35
+ source: :parser,
35
36
  )
36
37
  process_children region.update(visibility: :public, scope: :class, closure: pins.last)
37
38
  end
@@ -34,7 +34,7 @@ module Solargraph
34
34
  return if process_private_class_method
35
35
  end
36
36
  elsif node.children[1] == :require && node.children[0].to_s == '(const nil :Bundler)'
37
- pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require')
37
+ pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require', source: :parser)
38
38
  end
39
39
  process_children
40
40
  end
@@ -76,7 +76,8 @@ module Solargraph
76
76
  comments: cmnt,
77
77
  scope: region.scope || :instance,
78
78
  visibility: region.visibility,
79
- attribute: true
79
+ attribute: true,
80
+ source: :parser
80
81
  )
81
82
  end
82
83
  if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
@@ -87,10 +88,11 @@ module Solargraph
87
88
  comments: cmnt,
88
89
  scope: region.scope || :instance,
89
90
  visibility: region.visibility,
90
- attribute: true
91
+ attribute: true,
92
+ source: :parser
91
93
  )
92
94
  pins.push method_pin
93
- method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
95
+ method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last, source: :parser)
94
96
  if method_pin.return_type.defined?
95
97
  pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
96
98
  end
@@ -107,7 +109,8 @@ module Solargraph
107
109
  pins.push type.new(
108
110
  location: get_node_location(i),
109
111
  closure: cp,
110
- name: unpack_name(i)
112
+ name: unpack_name(i),
113
+ source: :parser
111
114
  )
112
115
  end
113
116
  end
@@ -121,7 +124,8 @@ module Solargraph
121
124
  pins.push Pin::Reference::Prepend.new(
122
125
  location: get_node_location(i),
123
126
  closure: cp,
124
- name: unpack_name(i)
127
+ name: unpack_name(i),
128
+ source: :parser
125
129
  )
126
130
  end
127
131
  end
@@ -135,13 +139,15 @@ module Solargraph
135
139
  pins.push Pin::Reference::Extend.new(
136
140
  location: loc,
137
141
  closure: region.closure,
138
- name: region.closure.full_context.namespace
142
+ name: region.closure.full_context.namespace,
143
+ source: :parser
139
144
  )
140
145
  else
141
146
  pins.push Pin::Reference::Extend.new(
142
147
  location: loc,
143
148
  closure: region.closure,
144
- name: unpack_name(i)
149
+ name: unpack_name(i),
150
+ source: :parser
145
151
  )
146
152
  end
147
153
  end
@@ -151,7 +157,7 @@ module Solargraph
151
157
  def process_require
152
158
  if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
153
159
  path = node.children[2].children[0].to_s
154
- pins.push Pin::Reference::Require.new(get_node_location(node), path)
160
+ pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
155
161
  end
156
162
  end
157
163
 
@@ -159,7 +165,7 @@ module Solargraph
159
165
  def process_autoload
160
166
  if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
161
167
  path = node.children[3].children[0].to_s
162
- pins.push Pin::Reference::Require.new(get_node_location(node), path)
168
+ pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
163
169
  end
164
170
  end
165
171
 
@@ -171,7 +177,8 @@ module Solargraph
171
177
  elsif node.children[2].type == :sym || node.children[2].type == :str
172
178
  node.children[2..-1].each do |x|
173
179
  cn = x.children[0].to_s
174
- ref = pins.select{ |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }.first
180
+ # @type [Pin::Method]
181
+ ref = pins.find { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }
175
182
  unless ref.nil?
176
183
  pins.delete ref
177
184
  mm = Solargraph::Pin::Method.new(
@@ -182,7 +189,8 @@ module Solargraph
182
189
  comments: ref.comments,
183
190
  scope: :class,
184
191
  visibility: :public,
185
- node: ref.node
192
+ node: ref.node,
193
+ source: :parser
186
194
  )
187
195
  cm = Solargraph::Pin::Method.new(
188
196
  location: ref.location,
@@ -192,7 +200,8 @@ module Solargraph
192
200
  comments: ref.comments,
193
201
  scope: :instance,
194
202
  visibility: :private,
195
- node: ref.node)
203
+ node: ref.node,
204
+ source: :parser)
196
205
  pins.push mm, cm
197
206
  pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
198
207
  pins.delete ivar
@@ -201,14 +210,16 @@ module Solargraph
201
210
  closure: cm,
202
211
  name: ivar.name,
203
212
  comments: ivar.comments,
204
- assignment: ivar.assignment
213
+ assignment: ivar.assignment,
214
+ source: :parser
205
215
  )
206
216
  pins.push Solargraph::Pin::InstanceVariable.new(
207
217
  location: ivar.location,
208
218
  closure: mm,
209
219
  name: ivar.name,
210
220
  comments: ivar.comments,
211
- assignment: ivar.assignment
221
+ assignment: ivar.assignment,
222
+ source: :parser
212
223
  )
213
224
  end
214
225
  end
@@ -236,7 +247,8 @@ module Solargraph
236
247
  closure: region.closure,
237
248
  name: node.children[2].children[0].to_s,
238
249
  original: node.children[3].children[0].to_s,
239
- scope: region.scope || :instance
250
+ scope: region.scope || :instance,
251
+ source: :parser
240
252
  )
241
253
  end
242
254
 
@@ -8,7 +8,8 @@ module Solargraph
8
8
  def process
9
9
  pins.push Solargraph::Pin::Symbol.new(
10
10
  get_node_location(node),
11
- ":#{node.children[0]}"
11
+ ":#{node.children[0]}",
12
+ source: :parser
12
13
  )
13
14
  end
14
15
  end
@@ -0,0 +1,29 @@
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
+ source: :parser,
22
+ )
23
+ process_children region
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
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
+ source: :parser,
22
+ )
23
+ process_children region
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ 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
@@ -29,7 +29,7 @@ module Solargraph
29
29
  scope: nil, visibility: :public, lvars: []
30
30
  @source = source
31
31
  # @closure = closure
32
- @closure = closure || Pin::Namespace.new(name: '', location: source.location)
32
+ @closure = closure || Pin::Namespace.new(name: '', location: source.location, source: :parser)
33
33
  @scope = scope
34
34
  @visibility = visibility
35
35
  @lvars = lvars
@@ -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,27 @@ 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
40
44
  @comments = comments
45
+ @source = source
46
+ assert_source_provided
47
+ end
48
+
49
+ def assert_source_provided
50
+ Solargraph.assert_or_log(:source, "source not provided - #{@path} #{@source} #{self.class}") if source.nil?
41
51
  end
42
52
 
43
53
  # @return [String]
@@ -268,7 +278,7 @@ module Solargraph
268
278
  # @deprecated
269
279
  # @return [String]
270
280
  def identity
271
- @identity ||= "#{closure&.path}|#{name}"
281
+ @identity ||= "#{closure&.path}|#{name}|#{location}"
272
282
  end
273
283
 
274
284
  # @return [String, nil]
@@ -293,14 +303,33 @@ module Solargraph
293
303
  end
294
304
 
295
305
  # @return [String]
296
- def desc
306
+ def inner_desc
297
307
  closure_info = closure&.desc
298
308
  binder_info = binder&.desc
299
- "[#{type_desc}, closure=#{closure_info}, binder=#{binder}"
309
+ "name=#{name.inspect} return_type=#{type_desc}, context=#{context.rooted_tags}, closure=#{closure_info}, binder=#{binder_info}"
310
+ end
311
+
312
+ def desc
313
+ "[#{inner_desc}]"
300
314
  end
301
315
 
302
316
  def inspect
303
- "#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
317
+ "#<#{self.class} `#{self.inner_desc}`#{all_location_text} via #{source.inspect}>"
318
+ end
319
+
320
+ def all_location_text
321
+ if location.nil? && type_location.nil?
322
+ ''
323
+ elsif !location.nil? && type_location.nil?
324
+ " at #{location.inspect})"
325
+ elsif !type_location.nil? && location.nil?
326
+ " at #{type_location.inspect})"
327
+ else
328
+ " at (#{location.inspect} and #{type_location.inspect})"
329
+ end
330
+ end
331
+
332
+ def reset_generated!
304
333
  end
305
334
 
306
335
  protected
@@ -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,7 +6,7 @@ module Solargraph
6
6
  # @return [Signature]
7
7
  attr_reader :block
8
8
 
9
- attr_reader :parameters
9
+ attr_accessor :parameters
10
10
 
11
11
  # @return [ComplexType, nil]
12
12
  attr_reader :return_type
@@ -21,6 +21,10 @@ module Solargraph
21
21
  @parameters = parameters
22
22
  end
23
23
 
24
+ def method_namespace
25
+ closure.namespace
26
+ end
27
+
24
28
  # @return [::Array<String>]
25
29
  def parameter_names
26
30
  @parameter_names ||= parameters.map(&:name)
@@ -140,8 +144,6 @@ module Solargraph
140
144
  protected
141
145
 
142
146
  attr_writer :block
143
-
144
- attr_writer :parameters
145
147
  end
146
148
  end
147
149
  end
@@ -8,10 +8,15 @@ module Solargraph
8
8
 
9
9
  # @param scope [::Symbol] :class or :instance
10
10
  # @param generics [::Array<Pin::Parameter>, nil]
11
- def initialize scope: :class, generics: nil, **splat
11
+ def initialize scope: :class, generics: nil, generic_defaults: {}, **splat
12
12
  super(**splat)
13
13
  @scope = scope
14
14
  @generics = generics
15
+ @generic_defaults = generic_defaults
16
+ end
17
+
18
+ def generic_defaults
19
+ @generic_defaults ||= {}
15
20
  end
16
21
 
17
22
  def context
@@ -9,6 +9,11 @@ module Solargraph
9
9
  # @return [Pin::Closure, nil]
10
10
  attr_reader :closure
11
11
 
12
+ def closure
13
+ Solargraph.assert_or_log(:closure, "Closure not set on #{self.class} #{name.inspect} from #{source.inspect}") unless @closure
14
+ @closure
15
+ end
16
+
12
17
  # @return [String]
13
18
  def name
14
19
  @name ||= ''
@@ -24,8 +24,26 @@ module Solargraph
24
24
  @receiver_method_name = receiver_method_name
25
25
  end
26
26
 
27
- %i[comments parameters return_type location].each do |method|
27
+ def inner_desc
28
+ "#{name} => #{@receiver_chain}##{@receiver_method_name}"
29
+ end
30
+
31
+ def location
32
+ return super if super
33
+
34
+ @resolved_method&.send(:location)
35
+ end
36
+
37
+
38
+ def type_location
39
+ return super if super
40
+
41
+ @resolved_method&.send(:type_location)
42
+ end
43
+
44
+ %i[comments parameters return_type signatures].each do |method|
28
45
  define_method(method) do
46
+ # @sg-ignore Need to set context correctly in define_method blocks
29
47
  @resolved_method ? @resolved_method.send(method) : super()
30
48
  end
31
49
  end
@@ -34,6 +52,7 @@ module Solargraph
34
52
  # @param api_map [ApiMap]
35
53
  define_method(method) do |api_map|
36
54
  resolve_method(api_map)
55
+ # @sg-ignore Need to set context correctly in define_method blocks
37
56
  @resolved_method ? @resolved_method.send(method, api_map) : super(api_map)
38
57
  end
39
58
  end
@@ -9,6 +9,22 @@ require 'solargraph/converters/dt'
9
9
  require 'solargraph/converters/dd'
10
10
  require 'solargraph/converters/misc'
11
11
 
12
+ # @todo upstream this definition
13
+
14
+ # @!parse
15
+ # module ::Kramdown
16
+ # class Document
17
+ # # @return [String]
18
+ # def to_html; end
19
+ # end
20
+ # end
21
+ # module ReverseMarkdown
22
+ # # @param input [String]
23
+ # # @param options [Hash]
24
+ # # @return [String]
25
+ # def self.convert(input, options = {}); end
26
+ # end
27
+
12
28
  module Solargraph
13
29
  module Pin
14
30
  # A module to add the Pin::Base#documentation method.
@@ -3,8 +3,13 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class Keyword < Base
6
- def initialize name
7
- super(name: name)
6
+ def initialize(name, **kwargs)
7
+ # @sg-ignore "Unrecognized keyword argument kwargs to Solargraph::Pin::Base#initialize"
8
+ super(name: name, **kwargs)
9
+ end
10
+
11
+ def closure
12
+ @closure ||= Pin::ROOT_PIN
8
13
  end
9
14
 
10
15
  def name
@@ -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]