solargraph 0.58.1 → 0.58.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/.gitignore +1 -0
- data/CHANGELOG.md +7 -1
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +279 -279
- data/lib/solargraph/api_map/index.rb +193 -193
- data/lib/solargraph/api_map/source_to_yard.rb +97 -97
- data/lib/solargraph/api_map/store.rb +384 -384
- data/lib/solargraph/api_map.rb +945 -945
- data/lib/solargraph/complex_type/type_methods.rb +228 -228
- data/lib/solargraph/complex_type/unique_type.rb +482 -482
- data/lib/solargraph/complex_type.rb +444 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
- data/lib/solargraph/convention/data_definition.rb +105 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
- data/lib/solargraph/convention/struct_definition.rb +164 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +118 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
- data/lib/solargraph/diagnostics/type_check.rb +55 -55
- data/lib/solargraph/doc_map.rb +439 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +98 -98
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -130
- data/lib/solargraph/language_server/host/message_worker.rb +112 -112
- data/lib/solargraph/language_server/host/sources.rb +99 -99
- data/lib/solargraph/language_server/host.rb +878 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
- data/lib/solargraph/language_server/message/extended/document.rb +23 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/library.rb +683 -683
- data/lib/solargraph/location.rb +82 -82
- data/lib/solargraph/logging.rb +37 -37
- data/lib/solargraph/parser/comment_ripper.rb +69 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
- data/lib/solargraph/parser/node_processor/base.rb +92 -92
- data/lib/solargraph/parser/node_processor.rb +62 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
- data/lib/solargraph/parser/region.rb +69 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +729 -729
- data/lib/solargraph/pin/base_variable.rb +126 -126
- data/lib/solargraph/pin/block.rb +104 -104
- data/lib/solargraph/pin/breakable.rb +9 -9
- data/lib/solargraph/pin/callable.rb +231 -231
- data/lib/solargraph/pin/closure.rb +72 -72
- data/lib/solargraph/pin/common.rb +79 -79
- data/lib/solargraph/pin/conversions.rb +123 -123
- data/lib/solargraph/pin/delegated_method.rb +120 -120
- data/lib/solargraph/pin/documenting.rb +114 -114
- data/lib/solargraph/pin/instance_variable.rb +34 -34
- data/lib/solargraph/pin/keyword.rb +20 -20
- data/lib/solargraph/pin/local_variable.rb +75 -75
- data/lib/solargraph/pin/method.rb +672 -672
- data/lib/solargraph/pin/method_alias.rb +34 -34
- data/lib/solargraph/pin/namespace.rb +115 -115
- data/lib/solargraph/pin/parameter.rb +275 -275
- data/lib/solargraph/pin/proxy_type.rb +39 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +15 -15
- data/lib/solargraph/pin/reference.rb +39 -39
- data/lib/solargraph/pin/search.rb +61 -61
- data/lib/solargraph/pin/signature.rb +61 -61
- data/lib/solargraph/pin/symbol.rb +53 -53
- data/lib/solargraph/pin/until.rb +18 -18
- data/lib/solargraph/pin/while.rb +18 -18
- data/lib/solargraph/pin.rb +44 -44
- data/lib/solargraph/pin_cache.rb +245 -245
- data/lib/solargraph/position.rb +132 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +823 -823
- data/lib/solargraph/rbs_map/core_map.rb +58 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
- data/lib/solargraph/rbs_map.rb +163 -163
- data/lib/solargraph/shell.rb +352 -352
- data/lib/solargraph/source/chain/call.rb +337 -337
- data/lib/solargraph/source/chain/constant.rb +26 -26
- data/lib/solargraph/source/chain/hash.rb +34 -34
- data/lib/solargraph/source/chain/if.rb +28 -28
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/literal.rb +48 -48
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain.rb +291 -291
- data/lib/solargraph/source/change.rb +82 -82
- data/lib/solargraph/source/cursor.rb +166 -166
- data/lib/solargraph/source/source_chainer.rb +194 -194
- data/lib/solargraph/source/updater.rb +55 -55
- data/lib/solargraph/source.rb +498 -498
- data/lib/solargraph/source_map/clip.rb +226 -226
- data/lib/solargraph/source_map/data.rb +34 -34
- data/lib/solargraph/source_map/mapper.rb +259 -259
- data/lib/solargraph/source_map.rb +212 -212
- data/lib/solargraph/type_checker/checks.rb +124 -124
- data/lib/solargraph/type_checker/param_def.rb +37 -37
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +84 -84
- data/lib/solargraph/type_checker.rb +814 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +255 -255
- data/lib/solargraph/workspace/require_paths.rb +97 -97
- data/lib/solargraph/workspace.rb +220 -220
- data/lib/solargraph/yard_map/helpers.rb +44 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
- data/lib/solargraph/yard_map/mapper.rb +79 -79
- data/lib/solargraph/yard_map/to_method.rb +89 -89
- data/lib/solargraph/yardoc.rb +87 -87
- data/lib/solargraph.rb +105 -105
- data/rbs_collection.yaml +1 -1
- metadata +12 -12
- /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
|
@@ -1,275 +1,275 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class Parameter < LocalVariable
|
|
6
|
-
# @return [::Symbol]
|
|
7
|
-
attr_reader :decl
|
|
8
|
-
|
|
9
|
-
# @return [String]
|
|
10
|
-
attr_reader :asgn_code
|
|
11
|
-
|
|
12
|
-
# allow this to be set to the method after the method itself has
|
|
13
|
-
# been created
|
|
14
|
-
attr_writer :closure
|
|
15
|
-
|
|
16
|
-
# @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
|
|
17
|
-
# @param asgn_code [String, nil]
|
|
18
|
-
def initialize decl: :arg, asgn_code: nil, **splat
|
|
19
|
-
super(**splat)
|
|
20
|
-
@asgn_code = asgn_code
|
|
21
|
-
@decl = decl
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def type_location
|
|
25
|
-
super || closure&.type_location
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def location
|
|
29
|
-
super || closure&.type_location
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def combine_with(other, attrs={})
|
|
33
|
-
new_attrs = {
|
|
34
|
-
decl: assert_same(other, :decl),
|
|
35
|
-
presence: choose(other, :presence),
|
|
36
|
-
asgn_code: choose(other, :asgn_code),
|
|
37
|
-
}.merge(attrs)
|
|
38
|
-
super(other, new_attrs)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def keyword?
|
|
42
|
-
[:kwarg, :kwoptarg].include?(decl)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def kwrestarg?
|
|
46
|
-
decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def needs_consistent_name?
|
|
50
|
-
keyword?
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# @return [String]
|
|
54
|
-
def arity_decl
|
|
55
|
-
name = (self.name || '(anon)')
|
|
56
|
-
type = (return_type&.to_rbs || 'untyped')
|
|
57
|
-
case decl
|
|
58
|
-
when :arg
|
|
59
|
-
""
|
|
60
|
-
when :optarg
|
|
61
|
-
"?"
|
|
62
|
-
when :kwarg
|
|
63
|
-
"#{name}:"
|
|
64
|
-
when :kwoptarg
|
|
65
|
-
"?#{name}:"
|
|
66
|
-
when :restarg
|
|
67
|
-
"*"
|
|
68
|
-
when :kwrestarg
|
|
69
|
-
"**"
|
|
70
|
-
else
|
|
71
|
-
"(unknown decl: #{decl})"
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def arg?
|
|
76
|
-
decl == :arg
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def restarg?
|
|
80
|
-
decl == :restarg
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def rest?
|
|
84
|
-
decl == :restarg || decl == :kwrestarg
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def block?
|
|
88
|
-
[:block, :blockarg].include?(decl)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def to_rbs
|
|
92
|
-
case decl
|
|
93
|
-
when :optarg
|
|
94
|
-
"?#{super}"
|
|
95
|
-
when :kwarg
|
|
96
|
-
"#{name}: #{return_type.to_rbs}"
|
|
97
|
-
when :kwoptarg
|
|
98
|
-
"?#{name}: #{return_type.to_rbs}"
|
|
99
|
-
when :restarg
|
|
100
|
-
"*#{super}"
|
|
101
|
-
when :kwrestarg
|
|
102
|
-
"**#{super}"
|
|
103
|
-
else
|
|
104
|
-
super
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# @return [String] the full name of the parameter, including any
|
|
109
|
-
# declarative symbols such as `*` or `:` indicating type of
|
|
110
|
-
# parameter. This is used in method signatures.
|
|
111
|
-
def full_name
|
|
112
|
-
case decl
|
|
113
|
-
when :kwarg, :kwoptarg
|
|
114
|
-
"#{name}:"
|
|
115
|
-
when :restarg
|
|
116
|
-
"*#{name}"
|
|
117
|
-
when :kwrestarg
|
|
118
|
-
"**#{name}"
|
|
119
|
-
when :block, :blockarg
|
|
120
|
-
"&#{name}"
|
|
121
|
-
else
|
|
122
|
-
name
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# @return [String]
|
|
127
|
-
def full
|
|
128
|
-
full_name + case decl
|
|
129
|
-
when :optarg
|
|
130
|
-
" = #{asgn_code || '?'}"
|
|
131
|
-
when :kwoptarg
|
|
132
|
-
" #{asgn_code || '?'}"
|
|
133
|
-
else
|
|
134
|
-
''
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# @return [ComplexType]
|
|
139
|
-
def return_type
|
|
140
|
-
if @return_type.nil?
|
|
141
|
-
@return_type = ComplexType::UNDEFINED
|
|
142
|
-
found = param_tag
|
|
143
|
-
@return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
|
|
144
|
-
if @return_type.undefined?
|
|
145
|
-
if decl == :restarg
|
|
146
|
-
@return_type = ComplexType.try_parse('::Array')
|
|
147
|
-
elsif decl == :kwrestarg
|
|
148
|
-
@return_type = ComplexType.try_parse('::Hash')
|
|
149
|
-
elsif decl == :blockarg
|
|
150
|
-
@return_type = ComplexType.try_parse('::Proc')
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
super
|
|
155
|
-
@return_type
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
# The parameter's zero-based location in the block's signature.
|
|
159
|
-
#
|
|
160
|
-
# @return [Integer]
|
|
161
|
-
def index
|
|
162
|
-
# @type [Method, Block]
|
|
163
|
-
method_pin = closure
|
|
164
|
-
method_pin.parameter_names.index(name)
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# @param api_map [ApiMap]
|
|
168
|
-
def typify api_map
|
|
169
|
-
return return_type.qualify(api_map, *closure.gates) unless return_type.undefined?
|
|
170
|
-
closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
# @param atype [ComplexType]
|
|
174
|
-
# @param api_map [ApiMap]
|
|
175
|
-
def compatible_arg?(atype, api_map)
|
|
176
|
-
# make sure we get types from up the method
|
|
177
|
-
# inheritance chain if we don't have them on this pin
|
|
178
|
-
ptype = typify api_map
|
|
179
|
-
ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def documentation
|
|
183
|
-
tag = param_tag
|
|
184
|
-
return '' if tag.nil? || tag.text.nil?
|
|
185
|
-
tag.text
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
private
|
|
189
|
-
|
|
190
|
-
# @return [YARD::Tags::Tag, nil]
|
|
191
|
-
def param_tag
|
|
192
|
-
params = closure.docstring.tags(:param)
|
|
193
|
-
params.each do |p|
|
|
194
|
-
return p if p.name == name
|
|
195
|
-
end
|
|
196
|
-
params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
# @param api_map [ApiMap]
|
|
200
|
-
# @return [ComplexType]
|
|
201
|
-
def typify_block_param api_map
|
|
202
|
-
block_pin = closure
|
|
203
|
-
if block_pin.is_a?(Pin::Block) && block_pin.receiver
|
|
204
|
-
return block_pin.typify_parameters(api_map)[index]
|
|
205
|
-
end
|
|
206
|
-
ComplexType::UNDEFINED
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# @param api_map [ApiMap]
|
|
210
|
-
# @return [ComplexType]
|
|
211
|
-
def typify_method_param api_map
|
|
212
|
-
meths = api_map.get_method_stack(closure.full_context.tag, closure.name, scope: closure.scope)
|
|
213
|
-
# meths.shift # Ignore the first one
|
|
214
|
-
meths.each do |meth|
|
|
215
|
-
found = nil
|
|
216
|
-
params = meth.docstring.tags(:param) + see_reference(docstring, api_map)
|
|
217
|
-
params.each do |p|
|
|
218
|
-
next unless p.name == name
|
|
219
|
-
found = p
|
|
220
|
-
break
|
|
221
|
-
end
|
|
222
|
-
if found.nil? and !index.nil?
|
|
223
|
-
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
224
|
-
end
|
|
225
|
-
return ComplexType.try_parse(*found.types).qualify(api_map, *meth.closure.gates) unless found.nil? || found.types.nil?
|
|
226
|
-
end
|
|
227
|
-
ComplexType::UNDEFINED
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
# @param heredoc [YARD::Docstring]
|
|
231
|
-
# @param api_map [ApiMap]
|
|
232
|
-
# @param skip [::Array]
|
|
233
|
-
# @return [::Array<YARD::Tags::Tag>]
|
|
234
|
-
def see_reference heredoc, api_map, skip = []
|
|
235
|
-
# This should actually be an intersection type
|
|
236
|
-
# @param ref [YARD::Tags::Tag, Solargraph::Yard::Tags::RefTag]
|
|
237
|
-
heredoc.ref_tags.each do |ref|
|
|
238
|
-
# @sg-ignore ref should actually be an intersection type
|
|
239
|
-
next unless ref.tag_name == 'param' && ref.owner
|
|
240
|
-
# @sg-ignore ref should actually be an intersection type
|
|
241
|
-
result = resolve_reference(ref.owner.to_s, api_map, skip)
|
|
242
|
-
return result unless result.nil?
|
|
243
|
-
end
|
|
244
|
-
[]
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
# @param ref [String]
|
|
248
|
-
# @param api_map [ApiMap]
|
|
249
|
-
# @param skip [::Array]
|
|
250
|
-
# @return [::Array<YARD::Tags::Tag>, nil]
|
|
251
|
-
def resolve_reference ref, api_map, skip
|
|
252
|
-
return nil if skip.include?(ref)
|
|
253
|
-
skip.push ref
|
|
254
|
-
parts = ref.split(/[.#]/)
|
|
255
|
-
if parts.first.empty?
|
|
256
|
-
path = "#{namespace}#{ref}"
|
|
257
|
-
else
|
|
258
|
-
fqns = api_map.qualify(parts.first, namespace)
|
|
259
|
-
return nil if fqns.nil?
|
|
260
|
-
path = fqns + ref[parts.first.length] + parts.last
|
|
261
|
-
end
|
|
262
|
-
pins = api_map.get_path_pins(path)
|
|
263
|
-
pins.each do |pin|
|
|
264
|
-
params = pin.docstring.tags(:param)
|
|
265
|
-
return params unless params.empty?
|
|
266
|
-
end
|
|
267
|
-
pins.each do |pin|
|
|
268
|
-
params = see_reference(pin.docstring, api_map, skip)
|
|
269
|
-
return params unless params.empty?
|
|
270
|
-
end
|
|
271
|
-
nil
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Parameter < LocalVariable
|
|
6
|
+
# @return [::Symbol]
|
|
7
|
+
attr_reader :decl
|
|
8
|
+
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_reader :asgn_code
|
|
11
|
+
|
|
12
|
+
# allow this to be set to the method after the method itself has
|
|
13
|
+
# been created
|
|
14
|
+
attr_writer :closure
|
|
15
|
+
|
|
16
|
+
# @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
|
|
17
|
+
# @param asgn_code [String, nil]
|
|
18
|
+
def initialize decl: :arg, asgn_code: nil, **splat
|
|
19
|
+
super(**splat)
|
|
20
|
+
@asgn_code = asgn_code
|
|
21
|
+
@decl = decl
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def type_location
|
|
25
|
+
super || closure&.type_location
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def location
|
|
29
|
+
super || closure&.type_location
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def combine_with(other, attrs={})
|
|
33
|
+
new_attrs = {
|
|
34
|
+
decl: assert_same(other, :decl),
|
|
35
|
+
presence: choose(other, :presence),
|
|
36
|
+
asgn_code: choose(other, :asgn_code),
|
|
37
|
+
}.merge(attrs)
|
|
38
|
+
super(other, new_attrs)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def keyword?
|
|
42
|
+
[:kwarg, :kwoptarg].include?(decl)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def kwrestarg?
|
|
46
|
+
decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def needs_consistent_name?
|
|
50
|
+
keyword?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @return [String]
|
|
54
|
+
def arity_decl
|
|
55
|
+
name = (self.name || '(anon)')
|
|
56
|
+
type = (return_type&.to_rbs || 'untyped')
|
|
57
|
+
case decl
|
|
58
|
+
when :arg
|
|
59
|
+
""
|
|
60
|
+
when :optarg
|
|
61
|
+
"?"
|
|
62
|
+
when :kwarg
|
|
63
|
+
"#{name}:"
|
|
64
|
+
when :kwoptarg
|
|
65
|
+
"?#{name}:"
|
|
66
|
+
when :restarg
|
|
67
|
+
"*"
|
|
68
|
+
when :kwrestarg
|
|
69
|
+
"**"
|
|
70
|
+
else
|
|
71
|
+
"(unknown decl: #{decl})"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def arg?
|
|
76
|
+
decl == :arg
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def restarg?
|
|
80
|
+
decl == :restarg
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def rest?
|
|
84
|
+
decl == :restarg || decl == :kwrestarg
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def block?
|
|
88
|
+
[:block, :blockarg].include?(decl)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def to_rbs
|
|
92
|
+
case decl
|
|
93
|
+
when :optarg
|
|
94
|
+
"?#{super}"
|
|
95
|
+
when :kwarg
|
|
96
|
+
"#{name}: #{return_type.to_rbs}"
|
|
97
|
+
when :kwoptarg
|
|
98
|
+
"?#{name}: #{return_type.to_rbs}"
|
|
99
|
+
when :restarg
|
|
100
|
+
"*#{super}"
|
|
101
|
+
when :kwrestarg
|
|
102
|
+
"**#{super}"
|
|
103
|
+
else
|
|
104
|
+
super
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# @return [String] the full name of the parameter, including any
|
|
109
|
+
# declarative symbols such as `*` or `:` indicating type of
|
|
110
|
+
# parameter. This is used in method signatures.
|
|
111
|
+
def full_name
|
|
112
|
+
case decl
|
|
113
|
+
when :kwarg, :kwoptarg
|
|
114
|
+
"#{name}:"
|
|
115
|
+
when :restarg
|
|
116
|
+
"*#{name}"
|
|
117
|
+
when :kwrestarg
|
|
118
|
+
"**#{name}"
|
|
119
|
+
when :block, :blockarg
|
|
120
|
+
"&#{name}"
|
|
121
|
+
else
|
|
122
|
+
name
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# @return [String]
|
|
127
|
+
def full
|
|
128
|
+
full_name + case decl
|
|
129
|
+
when :optarg
|
|
130
|
+
" = #{asgn_code || '?'}"
|
|
131
|
+
when :kwoptarg
|
|
132
|
+
" #{asgn_code || '?'}"
|
|
133
|
+
else
|
|
134
|
+
''
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# @return [ComplexType]
|
|
139
|
+
def return_type
|
|
140
|
+
if @return_type.nil?
|
|
141
|
+
@return_type = ComplexType::UNDEFINED
|
|
142
|
+
found = param_tag
|
|
143
|
+
@return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
|
|
144
|
+
if @return_type.undefined?
|
|
145
|
+
if decl == :restarg
|
|
146
|
+
@return_type = ComplexType.try_parse('::Array')
|
|
147
|
+
elsif decl == :kwrestarg
|
|
148
|
+
@return_type = ComplexType.try_parse('::Hash')
|
|
149
|
+
elsif decl == :blockarg
|
|
150
|
+
@return_type = ComplexType.try_parse('::Proc')
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
super
|
|
155
|
+
@return_type
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# The parameter's zero-based location in the block's signature.
|
|
159
|
+
#
|
|
160
|
+
# @return [Integer]
|
|
161
|
+
def index
|
|
162
|
+
# @type [Method, Block]
|
|
163
|
+
method_pin = closure
|
|
164
|
+
method_pin.parameter_names.index(name)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# @param api_map [ApiMap]
|
|
168
|
+
def typify api_map
|
|
169
|
+
return return_type.qualify(api_map, *closure.gates) unless return_type.undefined?
|
|
170
|
+
closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# @param atype [ComplexType]
|
|
174
|
+
# @param api_map [ApiMap]
|
|
175
|
+
def compatible_arg?(atype, api_map)
|
|
176
|
+
# make sure we get types from up the method
|
|
177
|
+
# inheritance chain if we don't have them on this pin
|
|
178
|
+
ptype = typify api_map
|
|
179
|
+
ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def documentation
|
|
183
|
+
tag = param_tag
|
|
184
|
+
return '' if tag.nil? || tag.text.nil?
|
|
185
|
+
tag.text
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
private
|
|
189
|
+
|
|
190
|
+
# @return [YARD::Tags::Tag, nil]
|
|
191
|
+
def param_tag
|
|
192
|
+
params = closure.docstring.tags(:param)
|
|
193
|
+
params.each do |p|
|
|
194
|
+
return p if p.name == name
|
|
195
|
+
end
|
|
196
|
+
params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# @param api_map [ApiMap]
|
|
200
|
+
# @return [ComplexType]
|
|
201
|
+
def typify_block_param api_map
|
|
202
|
+
block_pin = closure
|
|
203
|
+
if block_pin.is_a?(Pin::Block) && block_pin.receiver
|
|
204
|
+
return block_pin.typify_parameters(api_map)[index]
|
|
205
|
+
end
|
|
206
|
+
ComplexType::UNDEFINED
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# @param api_map [ApiMap]
|
|
210
|
+
# @return [ComplexType]
|
|
211
|
+
def typify_method_param api_map
|
|
212
|
+
meths = api_map.get_method_stack(closure.full_context.tag, closure.name, scope: closure.scope)
|
|
213
|
+
# meths.shift # Ignore the first one
|
|
214
|
+
meths.each do |meth|
|
|
215
|
+
found = nil
|
|
216
|
+
params = meth.docstring.tags(:param) + see_reference(docstring, api_map)
|
|
217
|
+
params.each do |p|
|
|
218
|
+
next unless p.name == name
|
|
219
|
+
found = p
|
|
220
|
+
break
|
|
221
|
+
end
|
|
222
|
+
if found.nil? and !index.nil?
|
|
223
|
+
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
224
|
+
end
|
|
225
|
+
return ComplexType.try_parse(*found.types).qualify(api_map, *meth.closure.gates) unless found.nil? || found.types.nil?
|
|
226
|
+
end
|
|
227
|
+
ComplexType::UNDEFINED
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# @param heredoc [YARD::Docstring]
|
|
231
|
+
# @param api_map [ApiMap]
|
|
232
|
+
# @param skip [::Array]
|
|
233
|
+
# @return [::Array<YARD::Tags::Tag>]
|
|
234
|
+
def see_reference heredoc, api_map, skip = []
|
|
235
|
+
# This should actually be an intersection type
|
|
236
|
+
# @param ref [YARD::Tags::Tag, Solargraph::Yard::Tags::RefTag]
|
|
237
|
+
heredoc.ref_tags.each do |ref|
|
|
238
|
+
# @sg-ignore ref should actually be an intersection type
|
|
239
|
+
next unless ref.tag_name == 'param' && ref.owner
|
|
240
|
+
# @sg-ignore ref should actually be an intersection type
|
|
241
|
+
result = resolve_reference(ref.owner.to_s, api_map, skip)
|
|
242
|
+
return result unless result.nil?
|
|
243
|
+
end
|
|
244
|
+
[]
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# @param ref [String]
|
|
248
|
+
# @param api_map [ApiMap]
|
|
249
|
+
# @param skip [::Array]
|
|
250
|
+
# @return [::Array<YARD::Tags::Tag>, nil]
|
|
251
|
+
def resolve_reference ref, api_map, skip
|
|
252
|
+
return nil if skip.include?(ref)
|
|
253
|
+
skip.push ref
|
|
254
|
+
parts = ref.split(/[.#]/)
|
|
255
|
+
if parts.first.empty?
|
|
256
|
+
path = "#{namespace}#{ref}"
|
|
257
|
+
else
|
|
258
|
+
fqns = api_map.qualify(parts.first, namespace)
|
|
259
|
+
return nil if fqns.nil?
|
|
260
|
+
path = fqns + ref[parts.first.length] + parts.last
|
|
261
|
+
end
|
|
262
|
+
pins = api_map.get_path_pins(path)
|
|
263
|
+
pins.each do |pin|
|
|
264
|
+
params = pin.docstring.tags(:param)
|
|
265
|
+
return params unless params.empty?
|
|
266
|
+
end
|
|
267
|
+
pins.each do |pin|
|
|
268
|
+
params = see_reference(pin.docstring, api_map, skip)
|
|
269
|
+
return params unless params.empty?
|
|
270
|
+
end
|
|
271
|
+
nil
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class ProxyType < Base
|
|
6
|
-
# @param return_type [ComplexType]
|
|
7
|
-
# @param gates [Array<String>, nil] Namespaces to try while resolving non-rooted types
|
|
8
|
-
# @param binder [ComplexType, ComplexType::UniqueType, nil]
|
|
9
|
-
# @param gates [Array<String>, nil]
|
|
10
|
-
def initialize return_type: ComplexType::UNDEFINED, binder: nil, gates: nil, **splat
|
|
11
|
-
super(**splat)
|
|
12
|
-
@gates = gates
|
|
13
|
-
@return_type = return_type
|
|
14
|
-
@binder = binder if binder
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def context
|
|
18
|
-
@return_type
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
|
|
22
|
-
# @param closure [Pin::Namespace, nil] Used as the closure for this pin
|
|
23
|
-
# @param binder [ComplexType, ComplexType::UniqueType, nil]
|
|
24
|
-
# @return [ProxyType]
|
|
25
|
-
def self.anonymous context, closure: nil, binder: nil, **kwargs
|
|
26
|
-
unless closure
|
|
27
|
-
parts = context.namespace.split('::')
|
|
28
|
-
namespace = parts[0..-2].join('::').to_s
|
|
29
|
-
closure = Solargraph::Pin::Namespace.new(name: namespace, source: :proxy_type)
|
|
30
|
-
end
|
|
31
|
-
# name = parts.last.to_s
|
|
32
|
-
# ProxyType.new(nil, namespace, name, return_type)
|
|
33
|
-
ProxyType.new(
|
|
34
|
-
closure: closure, return_type: context, binder: binder || context, **kwargs
|
|
35
|
-
)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class ProxyType < Base
|
|
6
|
+
# @param return_type [ComplexType]
|
|
7
|
+
# @param gates [Array<String>, nil] Namespaces to try while resolving non-rooted types
|
|
8
|
+
# @param binder [ComplexType, ComplexType::UniqueType, nil]
|
|
9
|
+
# @param gates [Array<String>, nil]
|
|
10
|
+
def initialize return_type: ComplexType::UNDEFINED, binder: nil, gates: nil, **splat
|
|
11
|
+
super(**splat)
|
|
12
|
+
@gates = gates
|
|
13
|
+
@return_type = return_type
|
|
14
|
+
@binder = binder if binder
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def context
|
|
18
|
+
@return_type
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
|
|
22
|
+
# @param closure [Pin::Namespace, nil] Used as the closure for this pin
|
|
23
|
+
# @param binder [ComplexType, ComplexType::UniqueType, nil]
|
|
24
|
+
# @return [ProxyType]
|
|
25
|
+
def self.anonymous context, closure: nil, binder: nil, **kwargs
|
|
26
|
+
unless closure
|
|
27
|
+
parts = context.namespace.split('::')
|
|
28
|
+
namespace = parts[0..-2].join('::').to_s
|
|
29
|
+
closure = Solargraph::Pin::Namespace.new(name: namespace, source: :proxy_type)
|
|
30
|
+
end
|
|
31
|
+
# name = parts.last.to_s
|
|
32
|
+
# ProxyType.new(nil, namespace, name, return_type)
|
|
33
|
+
ProxyType.new(
|
|
34
|
+
closure: closure, return_type: context, binder: binder || context, **kwargs
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|