solargraph 0.58.1 → 0.59.0.dev.1
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/.envrc +3 -0
- data/.github/workflows/linting.yml +4 -5
- data/.github/workflows/plugins.yml +40 -36
- data/.github/workflows/rspec.yml +45 -13
- data/.github/workflows/typecheck.yml +2 -2
- data/.rubocop_todo.yml +27 -49
- data/README.md +3 -3
- data/Rakefile +1 -0
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +289 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +109 -97
- data/lib/solargraph/api_map/store.rb +387 -384
- data/lib/solargraph/api_map.rb +1000 -945
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +242 -228
- data/lib/solargraph/complex_type/unique_type.rb +632 -482
- data/lib/solargraph/complex_type.rb +549 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
- data/lib/solargraph/convention/data_definition.rb +108 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
- data/lib/solargraph/convention/struct_definition.rb +168 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
- data/lib/solargraph/diagnostics/rubocop.rb +119 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
- data/lib/solargraph/diagnostics/type_check.rb +56 -55
- data/lib/solargraph/doc_map.rb +200 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +97 -98
- data/lib/solargraph/language_server/host/dispatch.rb +131 -130
- data/lib/solargraph/language_server/host/message_worker.rb +113 -112
- data/lib/solargraph/language_server/host/sources.rb +100 -99
- data/lib/solargraph/language_server/host.rb +883 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
- data/lib/solargraph/library.rb +729 -683
- data/lib/solargraph/location.rb +87 -82
- data/lib/solargraph/logging.rb +57 -37
- data/lib/solargraph/parser/comment_ripper.rb +76 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
- data/lib/solargraph/parser/node_processor/base.rb +122 -92
- data/lib/solargraph/parser/node_processor.rb +63 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -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 +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -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 +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +761 -729
- data/lib/solargraph/pin/base_variable.rb +418 -126
- data/lib/solargraph/pin/block.rb +126 -104
- data/lib/solargraph/pin/breakable.rb +13 -9
- data/lib/solargraph/pin/callable.rb +278 -231
- data/lib/solargraph/pin/closure.rb +68 -72
- data/lib/solargraph/pin/common.rb +94 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/conversions.rb +124 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +115 -114
- data/lib/solargraph/pin/instance_variable.rb +38 -34
- data/lib/solargraph/pin/keyword.rb +16 -20
- data/lib/solargraph/pin/local_variable.rb +31 -75
- data/lib/solargraph/pin/method.rb +720 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +121 -115
- data/lib/solargraph/pin/parameter.rb +338 -275
- data/lib/solargraph/pin/proxy_type.rb +40 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference.rb +41 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +69 -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 +46 -44
- data/lib/solargraph/pin_cache.rb +665 -245
- data/lib/solargraph/position.rb +118 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +846 -823
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
- data/lib/solargraph/rbs_map.rb +217 -163
- data/lib/solargraph/shell.rb +397 -352
- data/lib/solargraph/source/chain/call.rb +372 -337
- data/lib/solargraph/source/chain/constant.rb +28 -26
- data/lib/solargraph/source/chain/hash.rb +35 -34
- data/lib/solargraph/source/chain/if.rb +29 -28
- data/lib/solargraph/source/chain/instance_variable.rb +34 -13
- data/lib/solargraph/source/chain/literal.rb +53 -48
- data/lib/solargraph/source/chain/or.rb +31 -23
- data/lib/solargraph/source/chain.rb +294 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/source_chainer.rb +204 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +524 -498
- data/lib/solargraph/source_map/clip.rb +237 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +282 -259
- data/lib/solargraph/source_map.rb +220 -212
- data/lib/solargraph/type_checker/problem.rb +34 -32
- data/lib/solargraph/type_checker/rules.rb +157 -84
- data/lib/solargraph/type_checker.rb +895 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +257 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +362 -220
- data/lib/solargraph/yard_map/helpers.rb +45 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yardoc.rb +97 -87
- data/lib/solargraph.rb +126 -105
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/rbs_collection.yaml +1 -1
- data/solargraph.gemspec +2 -1
- metadata +22 -17
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- data/lib/solargraph/yard_map/to_method.rb +0 -89
- data/sig/shims/ast/0/node.rbs +0 -5
- /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,338 @@
|
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
# @
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
# @
|
|
234
|
-
def
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
if
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
nil
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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
|
+
# Parameters can be combined with local variables
|
|
34
|
+
new_attrs = if other.is_a?(Parameter)
|
|
35
|
+
{
|
|
36
|
+
decl: assert_same(other, :decl),
|
|
37
|
+
asgn_code: choose(other, :asgn_code)
|
|
38
|
+
}
|
|
39
|
+
else
|
|
40
|
+
{
|
|
41
|
+
decl: decl,
|
|
42
|
+
asgn_code: asgn_code
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
super(other, new_attrs.merge(attrs))
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def combine_return_type(other)
|
|
49
|
+
out = super
|
|
50
|
+
if out&.undefined?
|
|
51
|
+
# allow our return_type method to provide a better type
|
|
52
|
+
# using :param tag
|
|
53
|
+
out = nil
|
|
54
|
+
end
|
|
55
|
+
out
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def keyword?
|
|
59
|
+
[:kwarg, :kwoptarg].include?(decl)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def kwrestarg?
|
|
63
|
+
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
64
|
+
decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def needs_consistent_name?
|
|
68
|
+
keyword?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# @return [String]
|
|
72
|
+
def arity_decl
|
|
73
|
+
name = (self.name || '(anon)')
|
|
74
|
+
type = (return_type&.to_rbs || 'untyped')
|
|
75
|
+
case decl
|
|
76
|
+
when :arg
|
|
77
|
+
""
|
|
78
|
+
when :optarg
|
|
79
|
+
"?"
|
|
80
|
+
when :kwarg
|
|
81
|
+
"#{name}:"
|
|
82
|
+
when :kwoptarg
|
|
83
|
+
"?#{name}:"
|
|
84
|
+
when :restarg
|
|
85
|
+
"*"
|
|
86
|
+
when :kwrestarg
|
|
87
|
+
"**"
|
|
88
|
+
else
|
|
89
|
+
"(unknown decl: #{decl})"
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# @return [String]
|
|
94
|
+
def type_arity_decl
|
|
95
|
+
arity_decl + return_type.items.count.to_s
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def arg?
|
|
99
|
+
decl == :arg
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def restarg?
|
|
103
|
+
decl == :restarg
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def mandatory_positional?
|
|
107
|
+
decl == :arg
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def positional?
|
|
111
|
+
!keyword?
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def rest?
|
|
115
|
+
decl == :restarg || decl == :kwrestarg
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def block?
|
|
119
|
+
[:block, :blockarg].include?(decl)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def to_rbs
|
|
123
|
+
case decl
|
|
124
|
+
when :optarg
|
|
125
|
+
"?#{super}"
|
|
126
|
+
when :kwarg
|
|
127
|
+
"#{name}: #{return_type.to_rbs}"
|
|
128
|
+
when :kwoptarg
|
|
129
|
+
"?#{name}: #{return_type.to_rbs}"
|
|
130
|
+
when :restarg
|
|
131
|
+
"*#{super}"
|
|
132
|
+
when :kwrestarg
|
|
133
|
+
"**#{super}"
|
|
134
|
+
else
|
|
135
|
+
super
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# @return [String] the full name of the parameter, including any
|
|
140
|
+
# declarative symbols such as `*` or `:` indicating type of
|
|
141
|
+
# parameter. This is used in method signatures.
|
|
142
|
+
def full_name
|
|
143
|
+
case decl
|
|
144
|
+
when :kwarg, :kwoptarg
|
|
145
|
+
"#{name}:"
|
|
146
|
+
when :restarg
|
|
147
|
+
"*#{name}"
|
|
148
|
+
when :kwrestarg
|
|
149
|
+
"**#{name}"
|
|
150
|
+
when :block, :blockarg
|
|
151
|
+
"&#{name}"
|
|
152
|
+
else
|
|
153
|
+
name
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def reset_generated!
|
|
158
|
+
@return_type = nil if param_tag
|
|
159
|
+
super
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# @return [String]
|
|
163
|
+
def full
|
|
164
|
+
full_name + case decl
|
|
165
|
+
when :optarg
|
|
166
|
+
" = #{asgn_code || '?'}"
|
|
167
|
+
when :kwoptarg
|
|
168
|
+
" #{asgn_code || '?'}"
|
|
169
|
+
else
|
|
170
|
+
''
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# @sg-ignore super always sets @return_type to something
|
|
175
|
+
# @return [ComplexType]
|
|
176
|
+
def return_type
|
|
177
|
+
if @return_type.nil?
|
|
178
|
+
@return_type = ComplexType::UNDEFINED
|
|
179
|
+
found = param_tag
|
|
180
|
+
@return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
|
|
181
|
+
# @sg-ignore flow sensitive typing should be able to handle redefinition
|
|
182
|
+
if @return_type.undefined?
|
|
183
|
+
if decl == :restarg
|
|
184
|
+
@return_type = ComplexType.try_parse('::Array')
|
|
185
|
+
elsif decl == :kwrestarg
|
|
186
|
+
@return_type = ComplexType.try_parse('::Hash')
|
|
187
|
+
elsif decl == :blockarg
|
|
188
|
+
@return_type = ComplexType.try_parse('::Proc')
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
super
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# The parameter's zero-based location in the block's signature.
|
|
196
|
+
#
|
|
197
|
+
# @sg-ignore Need to add nil check here
|
|
198
|
+
# @return [Integer]
|
|
199
|
+
def index
|
|
200
|
+
method_pin = closure
|
|
201
|
+
# @sg-ignore Need to add nil check here
|
|
202
|
+
method_pin.parameter_names.index(name)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# @param api_map [ApiMap]
|
|
206
|
+
def typify api_map
|
|
207
|
+
new_type = super
|
|
208
|
+
return new_type if new_type.defined?
|
|
209
|
+
|
|
210
|
+
# sniff based on param tags
|
|
211
|
+
new_type = closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
|
|
212
|
+
|
|
213
|
+
return adjust_type api_map, new_type.self_to_type(full_context) if new_type.defined?
|
|
214
|
+
|
|
215
|
+
adjust_type api_map, super.self_to_type(full_context)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# @param atype [ComplexType]
|
|
219
|
+
# @param api_map [ApiMap]
|
|
220
|
+
def compatible_arg?(atype, api_map)
|
|
221
|
+
# make sure we get types from up the method
|
|
222
|
+
# inheritance chain if we don't have them on this pin
|
|
223
|
+
ptype = typify api_map
|
|
224
|
+
return true if ptype.undefined?
|
|
225
|
+
|
|
226
|
+
return true if atype.conforms_to?(api_map,
|
|
227
|
+
ptype,
|
|
228
|
+
:method_call,
|
|
229
|
+
[:allow_empty_params, :allow_undefined])
|
|
230
|
+
ptype.generic?
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
234
|
+
def documentation
|
|
235
|
+
tag = param_tag
|
|
236
|
+
return '' if tag.nil? || tag.text.nil?
|
|
237
|
+
tag.text
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
private
|
|
241
|
+
|
|
242
|
+
def generate_complex_type
|
|
243
|
+
nil
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# @return [YARD::Tags::Tag, nil]
|
|
247
|
+
def param_tag
|
|
248
|
+
# @sg-ignore Need to add nil check here
|
|
249
|
+
params = closure.docstring.tags(:param)
|
|
250
|
+
# @sg-ignore Need to add nil check here
|
|
251
|
+
params.each do |p|
|
|
252
|
+
return p if p.name == name
|
|
253
|
+
end
|
|
254
|
+
# @sg-ignore Need to add nil check here
|
|
255
|
+
params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# @param api_map [ApiMap]
|
|
259
|
+
# @return [ComplexType]
|
|
260
|
+
def typify_block_param api_map
|
|
261
|
+
block_pin = closure
|
|
262
|
+
if block_pin.is_a?(Pin::Block) && block_pin.receiver && index
|
|
263
|
+
return block_pin.typify_parameters(api_map)[index]
|
|
264
|
+
end
|
|
265
|
+
ComplexType::UNDEFINED
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# @param api_map [ApiMap]
|
|
269
|
+
# @return [ComplexType]
|
|
270
|
+
def typify_method_param api_map
|
|
271
|
+
# @sg-ignore Need to add nil check here
|
|
272
|
+
meths = api_map.get_method_stack(closure.full_context.tag, closure.name, scope: closure.scope)
|
|
273
|
+
# meths.shift # Ignore the first one
|
|
274
|
+
meths.each do |meth|
|
|
275
|
+
found = nil
|
|
276
|
+
params = meth.docstring.tags(:param) + see_reference(docstring, api_map)
|
|
277
|
+
params.each do |p|
|
|
278
|
+
next unless p.name == name
|
|
279
|
+
found = p
|
|
280
|
+
break
|
|
281
|
+
end
|
|
282
|
+
if found.nil? and !index.nil?
|
|
283
|
+
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
284
|
+
end
|
|
285
|
+
# @sg-ignore Need to add nil check here
|
|
286
|
+
return ComplexType.try_parse(*found.types).qualify(api_map, *meth.closure.gates) unless found.nil? || found.types.nil?
|
|
287
|
+
end
|
|
288
|
+
ComplexType::UNDEFINED
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
# @param heredoc [YARD::Docstring]
|
|
292
|
+
# @param api_map [ApiMap]
|
|
293
|
+
# @param skip [::Array]
|
|
294
|
+
#
|
|
295
|
+
# @return [::Array<YARD::Tags::Tag>]
|
|
296
|
+
def see_reference heredoc, api_map, skip = []
|
|
297
|
+
# This should actually be an intersection type
|
|
298
|
+
# @param ref [YARD::Tags::Tag, Solargraph::Yard::Tags::RefTag]
|
|
299
|
+
heredoc.ref_tags.each do |ref|
|
|
300
|
+
# @sg-ignore ref should actually be an intersection type
|
|
301
|
+
next unless ref.tag_name == 'param' && ref.owner
|
|
302
|
+
# @todo ref should actually be an intersection type
|
|
303
|
+
result = resolve_reference(ref.owner.to_s, api_map, skip)
|
|
304
|
+
return result unless result.nil?
|
|
305
|
+
end
|
|
306
|
+
[]
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# @param ref [String]
|
|
310
|
+
# @param api_map [ApiMap]
|
|
311
|
+
# @param skip [::Array]
|
|
312
|
+
# @return [::Array<YARD::Tags::Tag>, nil]
|
|
313
|
+
def resolve_reference ref, api_map, skip
|
|
314
|
+
return nil if skip.include?(ref)
|
|
315
|
+
skip.push ref
|
|
316
|
+
parts = ref.split(/[.#]/)
|
|
317
|
+
if parts.first.empty?
|
|
318
|
+
path = "#{namespace}#{ref}"
|
|
319
|
+
else
|
|
320
|
+
fqns = api_map.qualify(parts.first, namespace)
|
|
321
|
+
return nil if fqns.nil?
|
|
322
|
+
# @sg-ignore Need to add nil check here
|
|
323
|
+
path = fqns + ref[parts.first.length] + parts.last
|
|
324
|
+
end
|
|
325
|
+
pins = api_map.get_path_pins(path)
|
|
326
|
+
pins.each do |pin|
|
|
327
|
+
params = pin.docstring.tags(:param)
|
|
328
|
+
return params unless params.empty?
|
|
329
|
+
end
|
|
330
|
+
pins.each do |pin|
|
|
331
|
+
params = see_reference(pin.docstring, api_map, skip)
|
|
332
|
+
return params unless params.empty?
|
|
333
|
+
end
|
|
334
|
+
nil
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|