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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +39 -0
- data/lib/solargraph/api_map/cache.rb +10 -1
- data/lib/solargraph/api_map/index.rb +167 -0
- data/lib/solargraph/api_map/store.rb +71 -122
- data/lib/solargraph/api_map.rb +97 -36
- data/lib/solargraph/bench.rb +17 -1
- data/lib/solargraph/complex_type/type_methods.rb +7 -0
- data/lib/solargraph/complex_type/unique_type.rb +109 -8
- data/lib/solargraph/complex_type.rb +48 -18
- 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 +2 -0
- data/lib/solargraph/doc_map.rb +43 -18
- data/lib/solargraph/equality.rb +33 -0
- data/lib/solargraph/language_server/host/message_worker.rb +31 -11
- data/lib/solargraph/language_server/host.rb +13 -11
- data/lib/solargraph/language_server/message/base.rb +19 -12
- data/lib/solargraph/language_server/message/initialize.rb +3 -1
- data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
- data/lib/solargraph/language_server/message/text_document/formatting.rb +4 -0
- data/lib/solargraph/library.rb +7 -8
- data/lib/solargraph/location.rb +15 -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 +15 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +11 -6
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +17 -23
- data/lib/solargraph/parser/parser_gem/node_methods.rb +5 -3
- 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/lvasgn_node.rb +2 -2
- 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 +35 -19
- data/lib/solargraph/pin/base_variable.rb +10 -3
- data/lib/solargraph/pin/block.rb +3 -3
- data/lib/solargraph/pin/breakable.rb +9 -0
- data/lib/solargraph/pin/callable.rb +3 -3
- data/lib/solargraph/pin/local_variable.rb +7 -1
- data/lib/solargraph/pin/method.rb +26 -18
- data/lib/solargraph/pin/namespace.rb +10 -7
- data/lib/solargraph/pin/parameter.rb +15 -6
- 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/position.rb +7 -0
- data/lib/solargraph/range.rb +7 -0
- data/lib/solargraph/rbs_map/conversions.rb +16 -10
- data/lib/solargraph/rbs_map/core_fills.rb +10 -3
- data/lib/solargraph/rbs_map.rb +1 -0
- data/lib/solargraph/shell.rb +2 -0
- data/lib/solargraph/source/chain/array.rb +5 -4
- data/lib/solargraph/source/chain/call.rb +55 -19
- data/lib/solargraph/source/chain/constant.rb +1 -1
- data/lib/solargraph/source/chain/hash.rb +8 -2
- data/lib/solargraph/source/chain/if.rb +5 -0
- data/lib/solargraph/source/chain/link.rb +19 -5
- data/lib/solargraph/source/chain/literal.rb +27 -2
- data/lib/solargraph/source/chain/z_super.rb +1 -1
- data/lib/solargraph/source/chain.rb +107 -63
- data/lib/solargraph/source/cursor.rb +1 -11
- data/lib/solargraph/source/source_chainer.rb +2 -2
- data/lib/solargraph/source.rb +2 -1
- data/lib/solargraph/source_map/clip.rb +4 -2
- data/lib/solargraph/type_checker/checks.rb +4 -0
- data/lib/solargraph/type_checker.rb +41 -14
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +7 -3
- data/lib/solargraph/workspace.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_constant.rb +1 -0
- data/lib/solargraph/yard_map/mapper/to_method.rb +42 -15
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
- data/lib/solargraph/yard_map/mapper.rb +1 -0
- data/lib/solargraph/yardoc.rb +1 -1
- data/lib/solargraph.rb +1 -0
- data/solargraph.gemspec +5 -5
- metadata +39 -25
|
@@ -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]
|
|
@@ -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
|
-
|
|
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 [
|
|
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
|
-
|
|
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
|
|
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
|
|
280
|
-
def
|
|
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
|
|
283
|
-
path + ' ' +
|
|
291
|
+
if rbs
|
|
292
|
+
path + ' ' + rbs
|
|
284
293
|
else
|
|
285
294
|
path
|
|
286
295
|
end
|
|
287
296
|
else
|
|
288
|
-
|
|
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
|
|
104
|
-
"#{
|
|
110
|
+
def type_desc
|
|
111
|
+
"#{super} = #{assignment&.type.inspect}"
|
|
105
112
|
end
|
|
106
113
|
|
|
107
114
|
private
|
data/lib/solargraph/pin/block.rb
CHANGED
|
@@ -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]
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Solargraph
|
|
4
4
|
module Pin
|
|
5
5
|
class Callable < Closure
|
|
6
|
-
# @return [
|
|
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 [
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
202
|
+
method_docs ||= super || ''
|
|
198
203
|
param_tags = docstring.tags(:param)
|
|
199
204
|
unless param_tags.nil? or param_tags.empty?
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
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
|
-
|
|
214
|
-
|
|
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
|
-
|
|
227
|
+
method_docs += lines.join("\n")
|
|
223
228
|
end
|
|
224
229
|
yieldreturn_tags = docstring.tags(:yieldreturn)
|
|
225
230
|
unless yieldreturn_tags.empty?
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
240
|
+
method_docs += lines.join("\n")
|
|
236
241
|
end
|
|
237
242
|
return_tags = docstring.tags(:return)
|
|
238
243
|
unless return_tags.empty?
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
253
|
+
method_docs += lines.join("\n")
|
|
249
254
|
end
|
|
250
|
-
|
|
251
|
-
|
|
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
|
-
|
|
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
|
|