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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/lib/solargraph/api_map/store.rb +3 -1
- data/lib/solargraph/api_map.rb +18 -8
- data/lib/solargraph/complex_type/unique_type.rb +88 -7
- data/lib/solargraph/complex_type.rb +35 -6
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +51 -0
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +100 -0
- data/lib/solargraph/convention/struct_definition.rb +101 -0
- data/lib/solargraph/convention.rb +1 -0
- data/lib/solargraph/doc_map.rb +42 -18
- data/lib/solargraph/language_server/host/message_worker.rb +10 -7
- data/lib/solargraph/language_server/host.rb +1 -0
- data/lib/solargraph/location.rb +8 -0
- data/lib/solargraph/parser/comment_ripper.rb +11 -6
- data/lib/solargraph/parser/flow_sensitive_typing.rb +226 -0
- data/lib/solargraph/parser/node_methods.rb +14 -0
- data/lib/solargraph/parser/node_processor.rb +0 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +9 -0
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
- data/lib/solargraph/parser/parser_gem/node_methods.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +21 -1
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +26 -5
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +28 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +28 -0
- data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
- data/lib/solargraph/parser.rb +1 -0
- data/lib/solargraph/pin/base.rb +9 -3
- data/lib/solargraph/pin/base_variable.rb +7 -1
- data/lib/solargraph/pin/block.rb +2 -0
- data/lib/solargraph/pin/breakable.rb +9 -0
- data/lib/solargraph/pin/local_variable.rb +7 -1
- data/lib/solargraph/pin/method.rb +20 -18
- data/lib/solargraph/pin/namespace.rb +10 -7
- data/lib/solargraph/pin/parameter.rb +13 -5
- data/lib/solargraph/pin/proxy_type.rb +12 -6
- data/lib/solargraph/pin/until.rb +18 -0
- data/lib/solargraph/pin/while.rb +18 -0
- data/lib/solargraph/pin.rb +3 -0
- data/lib/solargraph/rbs_map/conversions.rb +8 -8
- data/lib/solargraph/rbs_map/core_fills.rb +10 -3
- data/lib/solargraph/source/chain/array.rb +4 -3
- data/lib/solargraph/source/chain/call.rb +46 -17
- data/lib/solargraph/source/chain/constant.rb +1 -1
- data/lib/solargraph/source/chain/hash.rb +3 -2
- data/lib/solargraph/source/chain/link.rb +2 -0
- data/lib/solargraph/source/chain/literal.rb +22 -2
- data/lib/solargraph/source/chain/z_super.rb +1 -1
- data/lib/solargraph/source/chain.rb +77 -47
- data/lib/solargraph/source/source_chainer.rb +2 -2
- data/lib/solargraph/source_map/clip.rb +3 -1
- data/lib/solargraph/type_checker/checks.rb +4 -0
- data/lib/solargraph/type_checker.rb +35 -8
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_method.rb +42 -15
- metadata +14 -2
@@ -8,10 +8,20 @@ module Solargraph
|
|
8
8
|
include ParserGem::NodeMethods
|
9
9
|
|
10
10
|
def process
|
11
|
-
|
12
|
-
if node.type == :class
|
13
|
-
|
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
|
36
|
+
unless superclass_name.nil?
|
27
37
|
pins.push Pin::Reference::Superclass.new(
|
28
38
|
location: loc,
|
29
39
|
closure: pins.last,
|
30
|
-
name:
|
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
|
data/lib/solargraph/parser.rb
CHANGED
@@ -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
|
data/lib/solargraph/pin/base.rb
CHANGED
@@ -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
|
-
"[
|
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
|
data/lib/solargraph/pin/block.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
202
|
+
method_docs ||= super || ''
|
202
203
|
param_tags = docstring.tags(:param)
|
203
204
|
unless param_tags.nil? or param_tags.empty?
|
204
|
-
|
205
|
-
|
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
|
-
|
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
|
-
|
218
|
-
|
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
|
-
|
227
|
+
method_docs += lines.join("\n")
|
227
228
|
end
|
228
229
|
yieldreturn_tags = docstring.tags(:yieldreturn)
|
229
230
|
unless yieldreturn_tags.empty?
|
230
|
-
|
231
|
-
|
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
|
-
|
240
|
+
method_docs += lines.join("\n")
|
240
241
|
end
|
241
242
|
return_tags = docstring.tags(:return)
|
242
243
|
unless return_tags.empty?
|
243
|
-
|
244
|
-
|
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
|
-
|
253
|
+
method_docs += lines.join("\n")
|
253
254
|
end
|
254
|
-
|
255
|
-
|
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
|
-
|
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
|
-
@
|
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
|
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 =
|
31
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
145
|
-
|
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
|
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
|
19
|
-
|
20
|
-
|
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:
|
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
|
data/lib/solargraph/pin.rb
CHANGED
@@ -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 : "
|
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 : "
|
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 : "
|
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 : "
|
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 : "
|
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 : "
|
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 : "
|
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.
|
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)
|