solargraph 0.51.2 → 0.54.2
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/.github/workflows/plugins.yml +40 -0
- data/.github/workflows/rspec.yml +1 -3
- data/.github/workflows/typecheck.yml +34 -0
- data/.yardopts +2 -2
- data/CHANGELOG.md +127 -5
- data/README.md +13 -16
- data/SPONSORS.md +1 -7
- data/lib/solargraph/api_map/cache.rb +50 -20
- data/lib/solargraph/api_map/source_to_yard.rb +17 -10
- data/lib/solargraph/api_map/store.rb +60 -15
- data/lib/solargraph/api_map.rb +282 -123
- data/lib/solargraph/bench.rb +3 -2
- data/lib/solargraph/cache.rb +29 -5
- data/lib/solargraph/complex_type/type_methods.rb +122 -39
- data/lib/solargraph/complex_type/unique_type.rb +310 -76
- data/lib/solargraph/complex_type.rb +166 -44
- data/lib/solargraph/convention.rb +0 -1
- data/lib/solargraph/converters/dd.rb +5 -0
- data/lib/solargraph/converters/dl.rb +3 -0
- data/lib/solargraph/converters/dt.rb +3 -0
- data/lib/solargraph/diagnostics/rubocop.rb +8 -7
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +1 -0
- data/lib/solargraph/diagnostics/type_check.rb +1 -0
- data/lib/solargraph/diagnostics.rb +2 -2
- data/lib/solargraph/doc_map.rb +187 -0
- data/lib/solargraph/gem_pins.rb +72 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
- data/lib/solargraph/language_server/host/dispatch.rb +22 -5
- data/lib/solargraph/language_server/host/message_worker.rb +49 -5
- data/lib/solargraph/language_server/host/sources.rb +8 -65
- data/lib/solargraph/language_server/host.rb +65 -84
- data/lib/solargraph/language_server/message/base.rb +19 -12
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
- data/lib/solargraph/language_server/message/initialize.rb +19 -2
- data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
- data/lib/solargraph/language_server/message/text_document/definition.rb +3 -3
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
- data/lib/solargraph/language_server/message/text_document/formatting.rb +1 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -1
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +3 -3
- data/lib/solargraph/language_server/message/text_document.rb +0 -1
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
- data/lib/solargraph/language_server/progress.rb +135 -0
- data/lib/solargraph/language_server/transport/adapter.rb +16 -1
- data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
- data/lib/solargraph/language_server.rb +1 -0
- data/lib/solargraph/library.rb +207 -111
- data/lib/solargraph/location.rb +15 -1
- data/lib/solargraph/page.rb +6 -0
- data/lib/solargraph/parser/comment_ripper.rb +4 -0
- data/lib/solargraph/parser/node_methods.rb +47 -7
- data/lib/solargraph/parser/node_processor/base.rb +11 -1
- data/lib/solargraph/parser/node_processor.rb +1 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -9
- data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +62 -43
- data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +7 -20
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +4 -4
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +8 -6
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -0
- data/lib/solargraph/parser/region.rb +1 -1
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +8 -12
- data/lib/solargraph/pin/base.rb +78 -10
- data/lib/solargraph/pin/base_variable.rb +40 -7
- data/lib/solargraph/pin/block.rb +69 -46
- data/lib/solargraph/pin/callable.rb +147 -0
- data/lib/solargraph/pin/closure.rb +23 -3
- data/lib/solargraph/pin/common.rb +6 -6
- data/lib/solargraph/pin/conversions.rb +36 -5
- data/lib/solargraph/pin/delegated_method.rb +6 -2
- data/lib/solargraph/pin/documenting.rb +25 -32
- data/lib/solargraph/pin/instance_variable.rb +6 -2
- data/lib/solargraph/pin/local_variable.rb +13 -1
- data/lib/solargraph/pin/method.rb +205 -32
- data/lib/solargraph/pin/namespace.rb +20 -7
- data/lib/solargraph/pin/parameter.rb +41 -36
- data/lib/solargraph/pin/proxy_type.rb +1 -1
- data/lib/solargraph/pin/reference/override.rb +2 -2
- data/lib/solargraph/pin/reference.rb +8 -0
- data/lib/solargraph/pin/search.rb +3 -3
- data/lib/solargraph/pin/signature.rb +8 -14
- data/lib/solargraph/pin.rb +4 -2
- data/lib/solargraph/range.rb +4 -6
- data/lib/solargraph/rbs_map/conversions.rb +326 -76
- data/lib/solargraph/rbs_map/core_fills.rb +16 -33
- data/lib/solargraph/rbs_map/core_map.rb +3 -13
- data/lib/solargraph/rbs_map/stdlib_map.rb +2 -8
- data/lib/solargraph/rbs_map.rb +32 -13
- data/lib/solargraph/shell.rb +95 -72
- data/lib/solargraph/source/chain/array.rb +33 -0
- data/lib/solargraph/source/chain/block_symbol.rb +13 -0
- data/lib/solargraph/source/chain/block_variable.rb +1 -1
- data/lib/solargraph/source/chain/call.rb +152 -69
- data/lib/solargraph/source/chain/constant.rb +15 -1
- data/lib/solargraph/source/chain/if.rb +23 -0
- data/lib/solargraph/source/chain/link.rb +17 -2
- data/lib/solargraph/source/chain/or.rb +2 -2
- data/lib/solargraph/source/chain/z_super.rb +3 -3
- data/lib/solargraph/source/chain.rb +85 -26
- data/lib/solargraph/source/change.rb +3 -0
- data/lib/solargraph/source/cursor.rb +16 -2
- data/lib/solargraph/source/source_chainer.rb +8 -5
- data/lib/solargraph/source/updater.rb +1 -0
- data/lib/solargraph/source.rb +120 -148
- data/lib/solargraph/source_map/clip.rb +16 -27
- data/lib/solargraph/source_map/data.rb +30 -0
- data/lib/solargraph/source_map/mapper.rb +15 -3
- data/lib/solargraph/source_map.rb +48 -24
- data/lib/solargraph/type_checker/checks.rb +10 -2
- data/lib/solargraph/type_checker/rules.rb +6 -1
- data/lib/solargraph/type_checker.rb +150 -39
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/environment.erb +3 -5
- data/lib/solargraph/workspace/config.rb +9 -6
- data/lib/solargraph/workspace.rb +30 -3
- data/lib/solargraph/yard_map/cache.rb +6 -0
- data/lib/solargraph/yard_map/helpers.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_method.rb +16 -3
- data/lib/solargraph/yard_map/mapper.rb +1 -1
- data/lib/solargraph/yard_map/to_method.rb +11 -4
- data/lib/solargraph/yard_map.rb +1 -292
- data/lib/solargraph/yard_tags.rb +20 -0
- data/lib/solargraph/yardoc.rb +52 -0
- data/lib/solargraph.rb +6 -4
- data/solargraph.gemspec +7 -6
- metadata +71 -82
- data/lib/solargraph/api_map/bundler_methods.rb +0 -22
- data/lib/solargraph/documentor.rb +0 -76
- data/lib/solargraph/language_server/host/cataloger.rb +0 -56
- data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -50
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
- data/lib/solargraph/parser/legacy/node_processors.rb +0 -55
- data/lib/solargraph/parser/legacy.rb +0 -12
- data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -153
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -317
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -33
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -51
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
- data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -64
- data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
- data/lib/solargraph/parser/rubyvm.rb +0 -40
- data/lib/solargraph/rbs_map/core_signs.rb +0 -33
- data/lib/yard-solargraph.rb +0 -33
@@ -4,12 +4,9 @@ module Solargraph
|
|
4
4
|
module Pin
|
5
5
|
# The base class for method and attribute pins.
|
6
6
|
#
|
7
|
-
class Method <
|
7
|
+
class Method < Callable
|
8
8
|
include Solargraph::Parser::NodeMethods
|
9
9
|
|
10
|
-
# @return [Array<Pin::Parameter>]
|
11
|
-
attr_reader :parameters
|
12
|
-
|
13
10
|
# @return [::Symbol] :public, :private, or :protected
|
14
11
|
attr_reader :visibility
|
15
12
|
|
@@ -18,23 +15,64 @@ module Solargraph
|
|
18
15
|
|
19
16
|
# @param visibility [::Symbol] :public, :protected, or :private
|
20
17
|
# @param explicit [Boolean]
|
21
|
-
# @param
|
22
|
-
# @param node [Parser::AST::Node,
|
18
|
+
# @param block [Pin::Signature, nil, ::Symbol]
|
19
|
+
# @param node [Parser::AST::Node, nil]
|
23
20
|
# @param attribute [Boolean]
|
24
|
-
|
21
|
+
# @param signatures [::Array<Signature>, nil]
|
22
|
+
# @param anon_splat [Boolean]
|
23
|
+
def initialize visibility: :public, explicit: true, block: :undefined, node: nil, attribute: false, signatures: nil, anon_splat: false, **splat
|
25
24
|
super(**splat)
|
26
25
|
@visibility = visibility
|
27
26
|
@explicit = explicit
|
28
|
-
@
|
27
|
+
@block = block
|
29
28
|
@node = node
|
30
29
|
@attribute = attribute
|
31
30
|
@signatures = signatures
|
32
31
|
@anon_splat = anon_splat
|
33
32
|
end
|
34
33
|
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
def transform_types(&transform)
|
35
|
+
# @todo 'super' alone should work here I think, but doesn't typecheck at level typed
|
36
|
+
m = super(&transform)
|
37
|
+
m.signatures = m.signatures.map do |sig|
|
38
|
+
sig.transform_types(&transform)
|
39
|
+
end
|
40
|
+
m.block = block&.transform_types(&transform)
|
41
|
+
m.signature_help = nil
|
42
|
+
m.documentation = nil
|
43
|
+
m
|
44
|
+
end
|
45
|
+
|
46
|
+
def all_rooted?
|
47
|
+
super && parameters.all?(&:all_rooted?) && (!block || block&.all_rooted?) && signatures.all?(&:all_rooted?)
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param signature [Pin::Signature]
|
51
|
+
# @return [Pin::Method]
|
52
|
+
def with_single_signature(signature)
|
53
|
+
m = proxy signature.return_type
|
54
|
+
m.signature_help = nil
|
55
|
+
m.documentation = nil
|
56
|
+
# @todo populating the single parameters/return_type/block
|
57
|
+
# arguments here seems to be needed for some specs to pass,
|
58
|
+
# even though we have a signature with the same information.
|
59
|
+
# Is this a problem for RBS-populated methods, which don't
|
60
|
+
# populate these three?
|
61
|
+
m.parameters = signature.parameters
|
62
|
+
m.return_type = signature.return_type
|
63
|
+
m.block = signature.block
|
64
|
+
m.signatures = [signature]
|
65
|
+
m
|
66
|
+
end
|
67
|
+
|
68
|
+
def block?
|
69
|
+
!block.nil?
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [Pin::Signature, nil]
|
73
|
+
def block
|
74
|
+
return @block unless @block == :undefined
|
75
|
+
@block = signatures.first&.block
|
38
76
|
end
|
39
77
|
|
40
78
|
def completion_item_kind
|
@@ -46,22 +84,56 @@ module Solargraph
|
|
46
84
|
end
|
47
85
|
|
48
86
|
def return_type
|
49
|
-
@return_type ||= ComplexType.
|
87
|
+
@return_type ||= ComplexType.new(signatures.map(&:return_type).flat_map(&:items))
|
88
|
+
end
|
89
|
+
|
90
|
+
# @param parameters [::Array<Parameter>]
|
91
|
+
# @param return_type [ComplexType]
|
92
|
+
# @return [Signature]
|
93
|
+
def generate_signature(parameters, return_type)
|
94
|
+
block = nil
|
95
|
+
yieldparam_tags = docstring.tags(:yieldparam)
|
96
|
+
yieldreturn_tags = docstring.tags(:yieldreturn)
|
97
|
+
generics = docstring.tags(:generic).map(&:name)
|
98
|
+
needs_block_param_signature =
|
99
|
+
parameters.last&.block? || !yieldreturn_tags.empty? || !yieldparam_tags.empty?
|
100
|
+
if needs_block_param_signature
|
101
|
+
yield_parameters = yieldparam_tags.map do |p|
|
102
|
+
name = p.name
|
103
|
+
decl = :arg
|
104
|
+
if name
|
105
|
+
decl = select_decl(name, false)
|
106
|
+
name = clean_param(name)
|
107
|
+
end
|
108
|
+
Pin::Parameter.new(
|
109
|
+
location: location,
|
110
|
+
closure: self,
|
111
|
+
comments: p.text,
|
112
|
+
name: name,
|
113
|
+
decl: decl,
|
114
|
+
presence: location ? location.range : nil,
|
115
|
+
return_type: ComplexType.try_parse(*p.types)
|
116
|
+
)
|
117
|
+
end
|
118
|
+
yield_return_type = ComplexType.try_parse(*yieldreturn_tags.flat_map(&:types))
|
119
|
+
block = Signature.new(generics: generics, parameters: yield_parameters, return_type: yield_return_type)
|
120
|
+
end
|
121
|
+
Signature.new(generics: generics, parameters: parameters, return_type: return_type, block: block)
|
50
122
|
end
|
51
123
|
|
52
|
-
# @return [Array<Signature>]
|
124
|
+
# @return [::Array<Signature>]
|
53
125
|
def signatures
|
54
126
|
@signatures ||= begin
|
55
127
|
top_type = generate_complex_type
|
56
128
|
result = []
|
57
|
-
result.push
|
58
|
-
result.concat(overloads.map { |meth|
|
59
|
-
result.push
|
129
|
+
result.push generate_signature(parameters, top_type) if top_type.defined?
|
130
|
+
result.concat(overloads.map { |meth| generate_signature(meth.parameters, meth.return_type) }) unless overloads.empty?
|
131
|
+
result.push generate_signature(parameters, @return_type || ComplexType::UNDEFINED) if result.empty?
|
60
132
|
result
|
61
133
|
end
|
62
134
|
end
|
63
135
|
|
64
|
-
# @return [String]
|
136
|
+
# @return [String, nil]
|
65
137
|
def detail
|
66
138
|
# This property is not cached in an instance variable because it can
|
67
139
|
# change when pins get proxied.
|
@@ -77,7 +149,7 @@ module Solargraph
|
|
77
149
|
detail
|
78
150
|
end
|
79
151
|
|
80
|
-
# @return [Array<Hash>]
|
152
|
+
# @return [::Array<Hash>]
|
81
153
|
def signature_help
|
82
154
|
@signature_help ||= signatures.map do |sig|
|
83
155
|
{
|
@@ -87,6 +159,27 @@ module Solargraph
|
|
87
159
|
end
|
88
160
|
end
|
89
161
|
|
162
|
+
def desc
|
163
|
+
# ensure the signatures line up when logged
|
164
|
+
if signatures.length > 1
|
165
|
+
"\n#{to_rbs}\n"
|
166
|
+
else
|
167
|
+
to_rbs
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def to_rbs
|
172
|
+
return nil if signatures.empty?
|
173
|
+
|
174
|
+
rbs = "def #{name}: #{signatures.first.to_rbs}"
|
175
|
+
signatures[1..].each do |sig|
|
176
|
+
rbs += "\n"
|
177
|
+
rbs += (' ' * (4 + name.length))
|
178
|
+
rbs += "| #{name}: #{sig.to_rbs}"
|
179
|
+
end
|
180
|
+
rbs
|
181
|
+
end
|
182
|
+
|
90
183
|
def path
|
91
184
|
@path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
|
92
185
|
end
|
@@ -115,6 +208,32 @@ module Solargraph
|
|
115
208
|
end
|
116
209
|
@documentation += lines.join("\n")
|
117
210
|
end
|
211
|
+
yieldparam_tags = docstring.tags(:yieldparam)
|
212
|
+
unless yieldparam_tags.nil? or yieldparam_tags.empty?
|
213
|
+
@documentation += "\n\n" unless @documentation.empty?
|
214
|
+
@documentation += "Block Params:\n"
|
215
|
+
lines = []
|
216
|
+
yieldparam_tags.each do |p|
|
217
|
+
l = "* #{p.name}"
|
218
|
+
l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
|
219
|
+
l += " #{p.text}"
|
220
|
+
lines.push l
|
221
|
+
end
|
222
|
+
@documentation += lines.join("\n")
|
223
|
+
end
|
224
|
+
yieldreturn_tags = docstring.tags(:yieldreturn)
|
225
|
+
unless yieldreturn_tags.empty?
|
226
|
+
@documentation += "\n\n" unless @documentation.empty?
|
227
|
+
@documentation += "Block Returns:\n"
|
228
|
+
lines = []
|
229
|
+
yieldreturn_tags.each do |r|
|
230
|
+
l = "*"
|
231
|
+
l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
|
232
|
+
l += " #{r.text}"
|
233
|
+
lines.push l
|
234
|
+
end
|
235
|
+
@documentation += lines.join("\n")
|
236
|
+
end
|
118
237
|
return_tags = docstring.tags(:return)
|
119
238
|
unless return_tags.empty?
|
120
239
|
@documentation += "\n\n" unless @documentation.empty?
|
@@ -144,9 +263,9 @@ module Solargraph
|
|
144
263
|
end
|
145
264
|
|
146
265
|
def nearly? other
|
147
|
-
|
148
|
-
|
149
|
-
scope == other.scope
|
266
|
+
super &&
|
267
|
+
parameters == other.parameters &&
|
268
|
+
scope == other.scope &&
|
150
269
|
visibility == other.visibility
|
151
270
|
end
|
152
271
|
|
@@ -157,14 +276,18 @@ module Solargraph
|
|
157
276
|
def try_merge! pin
|
158
277
|
return false unless super
|
159
278
|
@node = pin.node
|
279
|
+
@resolved_ref_tag = false
|
160
280
|
true
|
161
281
|
end
|
162
282
|
|
163
|
-
# @return [Array<Pin::Method>]
|
283
|
+
# @return [::Array<Pin::Method>]
|
164
284
|
def overloads
|
165
|
-
|
285
|
+
# Ignore overload tags with nil parameters. If it's not an array, the
|
286
|
+
# tag's source is likely malformed.
|
287
|
+
@overloads ||= docstring.tags(:overload).select(&:parameters).map do |tag|
|
166
288
|
Pin::Signature.new(
|
167
|
-
|
289
|
+
generics: generics,
|
290
|
+
parameters: tag.parameters.map do |src|
|
168
291
|
name, decl = parse_overload_param(src.first)
|
169
292
|
Pin::Parameter.new(
|
170
293
|
location: location,
|
@@ -176,7 +299,7 @@ module Solargraph
|
|
176
299
|
return_type: param_type_from_name(tag, src.first)
|
177
300
|
)
|
178
301
|
end,
|
179
|
-
ComplexType.try_parse(*tag.docstring.tags(:return).flat_map(&:types))
|
302
|
+
return_type: ComplexType.try_parse(*tag.docstring.tags(:return).flat_map(&:types))
|
180
303
|
)
|
181
304
|
end
|
182
305
|
@overloads
|
@@ -186,8 +309,45 @@ module Solargraph
|
|
186
309
|
@anon_splat
|
187
310
|
end
|
188
311
|
|
312
|
+
# @param [ApiMap]
|
313
|
+
# @return [self]
|
314
|
+
def resolve_ref_tag api_map
|
315
|
+
return self if @resolved_ref_tag
|
316
|
+
|
317
|
+
@resolved_ref_tag = true
|
318
|
+
return self unless docstring.ref_tags.any?
|
319
|
+
docstring.ref_tags.each do |tag|
|
320
|
+
ref = if tag.owner.to_s.start_with?(/[#\.]/)
|
321
|
+
api_map.get_methods(namespace)
|
322
|
+
.select { |pin| pin.path.end_with?(tag.owner.to_s) }
|
323
|
+
.first
|
324
|
+
else
|
325
|
+
# @todo Resolve relative namespaces
|
326
|
+
api_map.get_path_pins(tag.owner.to_s).first
|
327
|
+
end
|
328
|
+
next unless ref
|
329
|
+
|
330
|
+
docstring.add_tag(*ref.docstring.tags(:param))
|
331
|
+
end
|
332
|
+
self
|
333
|
+
end
|
334
|
+
|
335
|
+
protected
|
336
|
+
|
337
|
+
attr_writer :block
|
338
|
+
|
339
|
+
attr_writer :signatures
|
340
|
+
|
341
|
+
attr_writer :signature_help
|
342
|
+
|
343
|
+
attr_writer :documentation
|
344
|
+
|
189
345
|
private
|
190
346
|
|
347
|
+
# @param name [String]
|
348
|
+
# @param asgn [Boolean]
|
349
|
+
#
|
350
|
+
# @return [::Symbol]
|
191
351
|
def select_decl name, asgn
|
192
352
|
if name.start_with?('**')
|
193
353
|
:kwrestarg
|
@@ -206,11 +366,16 @@ module Solargraph
|
|
206
366
|
end
|
207
367
|
end
|
208
368
|
|
369
|
+
# @param name [String]
|
370
|
+
# @return [String]
|
209
371
|
def clean_param name
|
210
372
|
name.gsub(/[*&:]/, '')
|
211
373
|
end
|
212
374
|
|
213
375
|
# @param tag [YARD::Tags::OverloadTag]
|
376
|
+
# @param name [String]
|
377
|
+
#
|
378
|
+
# @return [ComplexType]
|
214
379
|
def param_type_from_name(tag, name)
|
215
380
|
param = tag.tags(:param).select { |t| t.name == name }.first
|
216
381
|
return ComplexType::UNDEFINED unless param
|
@@ -219,7 +384,7 @@ module Solargraph
|
|
219
384
|
|
220
385
|
# @return [ComplexType]
|
221
386
|
def generate_complex_type
|
222
|
-
tags = docstring.tags(:return).map(&:types).flatten.
|
387
|
+
tags = docstring.tags(:return).map(&:types).flatten.compact
|
223
388
|
return ComplexType::UNDEFINED if tags.empty?
|
224
389
|
ComplexType.try_parse *tags
|
225
390
|
end
|
@@ -250,7 +415,7 @@ module Solargraph
|
|
250
415
|
|
251
416
|
# @param ref [String]
|
252
417
|
# @param api_map [ApiMap]
|
253
|
-
# @return [ComplexType]
|
418
|
+
# @return [ComplexType, nil]
|
254
419
|
def resolve_reference ref, api_map
|
255
420
|
parts = ref.split(/[\.#]/)
|
256
421
|
if parts.first.empty? || parts.one?
|
@@ -285,7 +450,7 @@ module Solargraph
|
|
285
450
|
result = []
|
286
451
|
has_nil = false
|
287
452
|
return ComplexType::NIL if method_body_node.nil?
|
288
|
-
|
453
|
+
returns_from_method_body(method_body_node).each do |n|
|
289
454
|
if n.nil? || [:NIL, :nil].include?(n.type)
|
290
455
|
has_nil = true
|
291
456
|
next
|
@@ -302,9 +467,11 @@ module Solargraph
|
|
302
467
|
end
|
303
468
|
result.push ComplexType::NIL if has_nil
|
304
469
|
return ComplexType::UNDEFINED if result.empty?
|
305
|
-
ComplexType.
|
470
|
+
ComplexType.new(result.uniq)
|
306
471
|
end
|
307
472
|
|
473
|
+
# @param [ApiMap] api_map
|
474
|
+
# @return [ComplexType]
|
308
475
|
def infer_from_iv api_map
|
309
476
|
types = []
|
310
477
|
varname = "@#{name.gsub(/=$/, '')}"
|
@@ -315,14 +482,15 @@ module Solargraph
|
|
315
482
|
types.push type if type.defined?
|
316
483
|
end
|
317
484
|
return ComplexType::UNDEFINED if types.empty?
|
318
|
-
ComplexType.
|
485
|
+
ComplexType.new(types.uniq)
|
319
486
|
end
|
320
487
|
|
321
488
|
# When YARD parses an overload tag, it includes rest modifiers in the parameters names.
|
322
489
|
#
|
323
|
-
# @param
|
324
|
-
# @return [Array(String, Symbol)]
|
490
|
+
# @param name [String]
|
491
|
+
# @return [::Array(String, ::Symbol)]
|
325
492
|
def parse_overload_param(name)
|
493
|
+
# @todo this needs to handle mandatory vs not args, kwargs, blocks, etc
|
326
494
|
if name.start_with?('**')
|
327
495
|
[name[2..-1], :kwrestarg]
|
328
496
|
elsif name.start_with?('*')
|
@@ -332,6 +500,7 @@ module Solargraph
|
|
332
500
|
end
|
333
501
|
end
|
334
502
|
|
503
|
+
# @return [void]
|
335
504
|
def concat_example_tags
|
336
505
|
example_tags = docstring.tags(:example)
|
337
506
|
return if example_tags.empty?
|
@@ -343,6 +512,10 @@ module Solargraph
|
|
343
512
|
.join("\n")
|
344
513
|
.concat("```\n")
|
345
514
|
end
|
515
|
+
|
516
|
+
protected
|
517
|
+
|
518
|
+
attr_writer :signatures
|
346
519
|
end
|
347
520
|
end
|
348
521
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'solargraph/yard_tags'
|
4
|
+
|
3
5
|
module Solargraph
|
4
6
|
module Pin
|
5
7
|
class Namespace < Closure
|
@@ -9,12 +11,10 @@ module Solargraph
|
|
9
11
|
# @return [::Symbol] :class or :module
|
10
12
|
attr_reader :type
|
11
13
|
|
12
|
-
attr_reader :parameters
|
13
|
-
|
14
14
|
# @param type [::Symbol] :class or :module
|
15
15
|
# @param visibility [::Symbol] :public or :private
|
16
|
-
# @param gates [Array<String>]
|
17
|
-
def initialize type: :class, visibility: :public, gates: [''],
|
16
|
+
# @param gates [::Array<String>]
|
17
|
+
def initialize type: :class, visibility: :public, gates: [''], **splat
|
18
18
|
# super(location, namespace, name, comments)
|
19
19
|
super(**splat)
|
20
20
|
@type = type
|
@@ -38,7 +38,18 @@ module Solargraph
|
|
38
38
|
@closure = Pin::Namespace.new(name: closure_name, gates: [parts.join('::')])
|
39
39
|
@context = nil
|
40
40
|
end
|
41
|
-
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_rbs
|
44
|
+
"#{@type.to_s} #{return_type.all_params.first.to_rbs}#{rbs_generics}".strip
|
45
|
+
end
|
46
|
+
|
47
|
+
def desc
|
48
|
+
if name.nil? || name.empty?
|
49
|
+
'(top-level)'
|
50
|
+
else
|
51
|
+
to_rbs
|
52
|
+
end
|
42
53
|
end
|
43
54
|
|
44
55
|
def namespace
|
@@ -46,7 +57,7 @@ module Solargraph
|
|
46
57
|
end
|
47
58
|
|
48
59
|
def full_context
|
49
|
-
@full_context ||= ComplexType.try_parse("
|
60
|
+
@full_context ||= ComplexType.try_parse("::#{type.to_s.capitalize}<#{path}>")
|
50
61
|
end
|
51
62
|
|
52
63
|
def binder
|
@@ -66,14 +77,16 @@ module Solargraph
|
|
66
77
|
(type == :class ? LanguageServer::SymbolKinds::CLASS : LanguageServer::SymbolKinds::MODULE)
|
67
78
|
end
|
68
79
|
|
80
|
+
# @return [String]
|
69
81
|
def path
|
70
82
|
@path ||= (namespace.empty? ? '' : "#{namespace}::") + name
|
71
83
|
end
|
72
84
|
|
73
85
|
def return_type
|
74
|
-
@return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "
|
86
|
+
@return_type ||= ComplexType.try_parse( (type == :class ? '::Class' : '::Module') + "<::#{path}>")
|
75
87
|
end
|
76
88
|
|
89
|
+
# @return [Array<String>]
|
77
90
|
def domains
|
78
91
|
@domains ||= []
|
79
92
|
end
|
@@ -9,6 +9,9 @@ module Solargraph
|
|
9
9
|
# @return [String]
|
10
10
|
attr_reader :asgn_code
|
11
11
|
|
12
|
+
# @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
|
13
|
+
# @param asgn_code [String, nil]
|
14
|
+
# @param return_type [ComplexType, nil]
|
12
15
|
def initialize decl: :arg, asgn_code: nil, return_type: nil, **splat
|
13
16
|
super(**splat)
|
14
17
|
@asgn_code = asgn_code
|
@@ -24,6 +27,10 @@ module Solargraph
|
|
24
27
|
decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
|
25
28
|
end
|
26
29
|
|
30
|
+
def arg?
|
31
|
+
decl == :arg
|
32
|
+
end
|
33
|
+
|
27
34
|
def restarg?
|
28
35
|
decl == :restarg
|
29
36
|
end
|
@@ -36,6 +43,24 @@ module Solargraph
|
|
36
43
|
[:block, :blockarg].include?(decl)
|
37
44
|
end
|
38
45
|
|
46
|
+
def to_rbs
|
47
|
+
case decl
|
48
|
+
when :optarg
|
49
|
+
"?#{super}"
|
50
|
+
when :kwarg
|
51
|
+
"#{name}: #{return_type.to_rbs}"
|
52
|
+
when :kwoptarg
|
53
|
+
"?#{name}: #{return_type.to_rbs}"
|
54
|
+
when :restarg
|
55
|
+
"*#{super}"
|
56
|
+
when :kwrestarg
|
57
|
+
"**#{super}"
|
58
|
+
else
|
59
|
+
super
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [String]
|
39
64
|
def full
|
40
65
|
case decl
|
41
66
|
when :optarg
|
@@ -55,6 +80,7 @@ module Solargraph
|
|
55
80
|
end
|
56
81
|
end
|
57
82
|
|
83
|
+
# @return [ComplexType]
|
58
84
|
def return_type
|
59
85
|
if @return_type.nil?
|
60
86
|
@return_type = ComplexType::UNDEFINED
|
@@ -62,11 +88,11 @@ module Solargraph
|
|
62
88
|
@return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
|
63
89
|
if @return_type.undefined?
|
64
90
|
if decl == :restarg
|
65
|
-
@return_type = ComplexType.try_parse('Array')
|
91
|
+
@return_type = ComplexType.try_parse('::Array')
|
66
92
|
elsif decl == :kwrestarg
|
67
|
-
@return_type = ComplexType.try_parse('Hash')
|
93
|
+
@return_type = ComplexType.try_parse('::Hash')
|
68
94
|
elsif decl == :blockarg
|
69
|
-
@return_type = ComplexType.try_parse('Proc')
|
95
|
+
@return_type = ComplexType.try_parse('::Proc')
|
70
96
|
end
|
71
97
|
end
|
72
98
|
end
|
@@ -78,7 +104,9 @@ module Solargraph
|
|
78
104
|
#
|
79
105
|
# @return [Integer]
|
80
106
|
def index
|
81
|
-
|
107
|
+
# @type [Method, Block]
|
108
|
+
method_pin = closure
|
109
|
+
method_pin.parameter_names.index(name)
|
82
110
|
end
|
83
111
|
|
84
112
|
# @param api_map [ApiMap]
|
@@ -100,43 +128,20 @@ module Solargraph
|
|
100
128
|
|
101
129
|
private
|
102
130
|
|
103
|
-
# @return [YARD::Tags::Tag]
|
131
|
+
# @return [YARD::Tags::Tag, nil]
|
104
132
|
def param_tag
|
105
|
-
found = nil
|
106
133
|
params = closure.docstring.tags(:param)
|
107
134
|
params.each do |p|
|
108
|
-
|
109
|
-
found = p
|
110
|
-
break
|
111
|
-
end
|
112
|
-
if found.nil? and !index.nil?
|
113
|
-
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
135
|
+
return p if p.name == name
|
114
136
|
end
|
115
|
-
|
137
|
+
params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
|
116
138
|
end
|
117
139
|
|
118
140
|
# @param api_map [ApiMap]
|
119
141
|
# @return [ComplexType]
|
120
142
|
def typify_block_param api_map
|
121
143
|
if closure.is_a?(Pin::Block) && closure.receiver
|
122
|
-
|
123
|
-
clip = api_map.clip_at(location.filename, location.range.start)
|
124
|
-
locals = clip.locals - [self]
|
125
|
-
meths = chain.define(api_map, closure, locals)
|
126
|
-
meths.each do |meth|
|
127
|
-
if meth.docstring.has_tag?(:yieldparam_single_parameter)
|
128
|
-
type = chain.base.infer(api_map, closure, locals)
|
129
|
-
if type.defined? && !type.subtypes.empty?
|
130
|
-
bmeth = chain.base.define(api_map, closure, locals).first
|
131
|
-
return type.subtypes.first.qualify(api_map, bmeth.context.namespace)
|
132
|
-
end
|
133
|
-
else
|
134
|
-
yps = meth.docstring.tags(:yieldparam)
|
135
|
-
unless yps[index].nil? or yps[index].types.nil? or yps[index].types.empty?
|
136
|
-
return ComplexType.try_parse(yps[index].types.first).self_to(chain.base.infer(api_map, closure, locals).namespace).qualify(api_map, meth.context.namespace)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
144
|
+
return closure.typify_parameters(api_map)[index]
|
140
145
|
end
|
141
146
|
ComplexType::UNDEFINED
|
142
147
|
end
|
@@ -144,7 +149,7 @@ module Solargraph
|
|
144
149
|
# @param api_map [ApiMap]
|
145
150
|
# @return [ComplexType]
|
146
151
|
def typify_method_param api_map
|
147
|
-
meths = api_map.get_method_stack(closure.full_context.
|
152
|
+
meths = api_map.get_method_stack(closure.full_context.tag, closure.name, scope: closure.scope)
|
148
153
|
# meths.shift # Ignore the first one
|
149
154
|
meths.each do |meth|
|
150
155
|
found = nil
|
@@ -164,8 +169,8 @@ module Solargraph
|
|
164
169
|
|
165
170
|
# @param heredoc [YARD::Docstring]
|
166
171
|
# @param api_map [ApiMap]
|
167
|
-
# @param skip [Array]
|
168
|
-
# @return [Array<YARD::Tags::Tag>]
|
172
|
+
# @param skip [::Array]
|
173
|
+
# @return [::Array<YARD::Tags::Tag>]
|
169
174
|
def see_reference heredoc, api_map, skip = []
|
170
175
|
heredoc.ref_tags.each do |ref|
|
171
176
|
next unless ref.tag_name == 'param' && ref.owner
|
@@ -177,8 +182,8 @@ module Solargraph
|
|
177
182
|
|
178
183
|
# @param ref [String]
|
179
184
|
# @param api_map [ApiMap]
|
180
|
-
# @param skip [Array]
|
181
|
-
# @return [Array<YARD::Tags::Tag>, nil]
|
185
|
+
# @param skip [::Array]
|
186
|
+
# @return [::Array<YARD::Tags::Tag>, nil]
|
182
187
|
def resolve_reference ref, api_map, skip
|
183
188
|
return nil if skip.include?(ref)
|
184
189
|
skip.push ref
|
@@ -18,7 +18,7 @@ module Solargraph
|
|
18
18
|
def self.anonymous return_type
|
19
19
|
parts = return_type.namespace.split('::')
|
20
20
|
namespace = parts[0..-2].join('::').to_s
|
21
|
-
name = parts.last.to_s
|
21
|
+
# name = parts.last.to_s
|
22
22
|
# ProxyType.new(nil, namespace, name, return_type)
|
23
23
|
ProxyType.new(
|
24
24
|
closure: Solargraph::Pin::Namespace.new(name: namespace), return_type: return_type
|
@@ -4,10 +4,10 @@ module Solargraph
|
|
4
4
|
module Pin
|
5
5
|
class Reference
|
6
6
|
class Override < Reference
|
7
|
-
# @return [Array<YARD::Tags::Tag>]
|
7
|
+
# @return [::Array<YARD::Tags::Tag>]
|
8
8
|
attr_reader :tags
|
9
9
|
|
10
|
-
# @return [Array<Symbol>]
|
10
|
+
# @return [::Array<Symbol>]
|
11
11
|
attr_reader :delete
|
12
12
|
|
13
13
|
def initialize location, name, tags, delete = []
|
@@ -9,6 +9,14 @@ module Solargraph
|
|
9
9
|
autoload :Prepend, 'solargraph/pin/reference/prepend'
|
10
10
|
autoload :Extend, 'solargraph/pin/reference/extend'
|
11
11
|
autoload :Override, 'solargraph/pin/reference/override'
|
12
|
+
|
13
|
+
attr_reader :generic_values
|
14
|
+
|
15
|
+
# @param generic_values [Array<String>]
|
16
|
+
def initialize generic_values: [], **splat
|
17
|
+
super(**splat)
|
18
|
+
@generic_values = generic_values
|
19
|
+
end
|
12
20
|
end
|
13
21
|
end
|
14
22
|
end
|
@@ -18,21 +18,21 @@ module Solargraph
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
# @param pins [Array<Pin::Base>]
|
21
|
+
# @param pins [::Array<Pin::Base>]
|
22
22
|
# @param query [String]
|
23
23
|
def initialize pins, query
|
24
24
|
@pins = pins
|
25
25
|
@query = query
|
26
26
|
end
|
27
27
|
|
28
|
-
# @return [Array<Pin::Base>]
|
28
|
+
# @return [::Array<Pin::Base>]
|
29
29
|
def results
|
30
30
|
@results ||= do_query
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
# @return [Array<Pin::Base>]
|
35
|
+
# @return [::Array<Pin::Base>]
|
36
36
|
def do_query
|
37
37
|
return @pins if @query.nil? || @query.empty?
|
38
38
|
@pins.map do |pin|
|