solargraph 0.54.4 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/lib/solargraph/api_map/index.rb +1 -1
- data/lib/solargraph/api_map/store.rb +40 -19
- data/lib/solargraph/api_map.rb +24 -19
- data/lib/solargraph/bench.rb +17 -1
- 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/library.rb +2 -1
- 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 +11 -6
- 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
- data/lib/solargraph/yardoc.rb +1 -1
- metadata +15 -3
@@ -57,22 +57,22 @@ module Solargraph
|
|
57
57
|
elsif n.type == :send
|
58
58
|
if n.children[0].is_a?(::Parser::AST::Node)
|
59
59
|
result.concat generate_links(n.children[0])
|
60
|
-
result.push Chain::Call.new(n.children[1].to_s, node_args(n), passed_block(n))
|
60
|
+
result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
|
61
61
|
elsif n.children[0].nil?
|
62
62
|
args = []
|
63
63
|
n.children[2..-1].each do |c|
|
64
64
|
args.push NodeChainer.chain(c, @filename, n)
|
65
65
|
end
|
66
|
-
result.push Chain::Call.new(n.children[1].to_s, node_args(n), passed_block(n))
|
66
|
+
result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
|
67
67
|
else
|
68
68
|
raise "No idea what to do with #{n}"
|
69
69
|
end
|
70
70
|
elsif n.type == :csend
|
71
71
|
if n.children[0].is_a?(::Parser::AST::Node)
|
72
72
|
result.concat generate_links(n.children[0])
|
73
|
-
result.push Chain::QCall.new(n.children[1].to_s, node_args(n))
|
73
|
+
result.push Chain::QCall.new(n.children[1].to_s, Location.from_node(n), node_args(n))
|
74
74
|
elsif n.children[0].nil?
|
75
|
-
result.push Chain::QCall.new(n.children[1].to_s, node_args(n))
|
75
|
+
result.push Chain::QCall.new(n.children[1].to_s, Location.from_node(n), node_args(n))
|
76
76
|
else
|
77
77
|
raise "No idea what to do with #{n}"
|
78
78
|
end
|
@@ -82,15 +82,15 @@ module Solargraph
|
|
82
82
|
result.push Chain::ZSuper.new('super')
|
83
83
|
elsif n.type == :super
|
84
84
|
args = n.children.map { |c| NodeChainer.chain(c, @filename, n) }
|
85
|
-
result.push Chain::Call.new('super', args)
|
85
|
+
result.push Chain::Call.new('super', Location.from_node(n), args)
|
86
86
|
elsif n.type == :yield
|
87
87
|
args = n.children.map { |c| NodeChainer.chain(c, @filename, n) }
|
88
|
-
result.push Chain::Call.new('yield', args)
|
88
|
+
result.push Chain::Call.new('yield', Location.from_node(n), args)
|
89
89
|
elsif n.type == :const
|
90
90
|
const = unpack_name(n)
|
91
91
|
result.push Chain::Constant.new(const)
|
92
92
|
elsif [:lvar, :lvasgn].include?(n.type)
|
93
|
-
result.push Chain::Call.new(n.children[0].to_s)
|
93
|
+
result.push Chain::Call.new(n.children[0].to_s, Location.from_node(n))
|
94
94
|
elsif [:ivar, :ivasgn].include?(n.type)
|
95
95
|
result.push Chain::InstanceVariable.new(n.children[0].to_s)
|
96
96
|
elsif [:cvar, :cvasgn].include?(n.type)
|
@@ -124,13 +124,13 @@ module Solargraph
|
|
124
124
|
end
|
125
125
|
end
|
126
126
|
elsif n.type == :hash
|
127
|
-
result.push Chain::Hash.new('::Hash', hash_is_splatted?(n))
|
127
|
+
result.push Chain::Hash.new('::Hash', n, hash_is_splatted?(n))
|
128
128
|
elsif n.type == :array
|
129
129
|
chained_children = n.children.map { |c| NodeChainer.chain(c) }
|
130
|
-
result.push Source::Chain::Array.new(chained_children)
|
130
|
+
result.push Source::Chain::Array.new(chained_children, n)
|
131
131
|
else
|
132
132
|
lit = infer_literal_node_type(n)
|
133
|
-
result.push (lit ? Chain::Literal.new(lit) : Chain::Link.new)
|
133
|
+
result.push (lit ? Chain::Literal.new(lit, n) : Chain::Link.new)
|
134
134
|
end
|
135
135
|
result
|
136
136
|
end
|
@@ -40,7 +40,7 @@ module Solargraph
|
|
40
40
|
if n.is_a?(AST::Node)
|
41
41
|
if n.type == :cbase
|
42
42
|
parts = [''] + pack_name(n)
|
43
|
-
|
43
|
+
elsif n.type == :const
|
44
44
|
parts += pack_name(n)
|
45
45
|
end
|
46
46
|
else
|
@@ -59,6 +59,8 @@ module Solargraph
|
|
59
59
|
return '::String'
|
60
60
|
elsif node.type == :array
|
61
61
|
return '::Array'
|
62
|
+
elsif node.type == :nil
|
63
|
+
return '::NilClass'
|
62
64
|
elsif node.type == :hash
|
63
65
|
return '::Hash'
|
64
66
|
elsif node.type == :int
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Parser
|
5
|
+
module ParserGem
|
6
|
+
module NodeProcessors
|
7
|
+
class AndNode < Parser::NodeProcessor::Base
|
8
|
+
include ParserGem::NodeMethods
|
9
|
+
|
10
|
+
def process
|
11
|
+
process_children
|
12
|
+
|
13
|
+
position = get_node_start_position(node)
|
14
|
+
enclosing_breakable_pin = pins.select{|pin| pin.is_a?(Pin::Breakable) && pin.location.range.contain?(position)}.last
|
15
|
+
FlowSensitiveTyping.new(locals, enclosing_breakable_pin).process_and(node)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -8,6 +8,17 @@ module Solargraph
|
|
8
8
|
include ParserGem::NodeMethods
|
9
9
|
|
10
10
|
def process
|
11
|
+
if Convention::StructDefinition::StructAssignmentNode.valid?(node)
|
12
|
+
process_struct_assignment
|
13
|
+
else
|
14
|
+
process_constant_assignment
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
# @return [void]
|
21
|
+
def process_constant_assignment
|
11
22
|
pins.push Solargraph::Pin::Constant.new(
|
12
23
|
location: get_node_location(node),
|
13
24
|
closure: region.closure,
|
@@ -18,7 +29,16 @@ module Solargraph
|
|
18
29
|
process_children
|
19
30
|
end
|
20
31
|
|
21
|
-
|
32
|
+
# TODO: Move this out of [CasgnNode] once [Solargraph::Parser::NodeProcessor] supports
|
33
|
+
# multiple processors.
|
34
|
+
def process_struct_assignment
|
35
|
+
processor_klass = Convention::StructDefinition::NodeProcessors::StructNode
|
36
|
+
processor = processor_klass.new(node, region, pins, locals)
|
37
|
+
processor.process
|
38
|
+
|
39
|
+
@pins = processor.pins
|
40
|
+
@locals = processor.locals
|
41
|
+
end
|
22
42
|
|
23
43
|
# @return [String]
|
24
44
|
def const_name
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Parser
|
5
|
+
module ParserGem
|
6
|
+
module NodeProcessors
|
7
|
+
class IfNode < Parser::NodeProcessor::Base
|
8
|
+
include ParserGem::NodeMethods
|
9
|
+
|
10
|
+
def process
|
11
|
+
process_children
|
12
|
+
|
13
|
+
position = get_node_start_position(node)
|
14
|
+
enclosing_breakable_pin = pins.select{|pin| pin.is_a?(Pin::Breakable) && pin.location.range.contain?(position)}.last
|
15
|
+
FlowSensitiveTyping.new(locals, enclosing_breakable_pin).process_if(node)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -8,10 +8,20 @@ module Solargraph
|
|
8
8
|
include ParserGem::NodeMethods
|
9
9
|
|
10
10
|
def process
|
11
|
-
|
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
|
|