solargraph 0.59.0.dev.1 → 0.59.0.dev.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 +4 -1
- data/.github/workflows/rspec.yml +3 -14
- data/.gitignore +1 -0
- data/.rubocop.yml +32 -5
- data/.rubocop_todo.yml +37 -931
- data/CHANGELOG.md +7 -1
- data/Gemfile +3 -1
- data/Rakefile +25 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/index.rb +5 -11
- data/lib/solargraph/api_map/source_to_yard.rb +9 -8
- data/lib/solargraph/api_map/store.rb +22 -20
- data/lib/solargraph/api_map.rb +50 -37
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/type_methods.rb +12 -15
- data/lib/solargraph/complex_type/unique_type.rb +54 -43
- data/lib/solargraph/complex_type.rb +69 -61
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
- data/lib/solargraph/convention/data_definition.rb +1 -1
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
- data/lib/solargraph/convention/struct_definition.rb +3 -3
- data/lib/solargraph/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +19 -17
- data/lib/solargraph/converters/dl.rb +17 -15
- data/lib/solargraph/converters/dt.rb +17 -15
- data/lib/solargraph/converters/misc.rb +3 -1
- data/lib/solargraph/diagnostics/rubocop.rb +10 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
- data/lib/solargraph/diagnostics/type_check.rb +10 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +9 -10
- data/lib/solargraph/equality.rb +3 -3
- data/lib/solargraph/gem_pins.rb +7 -5
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +2 -3
- data/lib/solargraph/language_server/host/message_worker.rb +2 -2
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/host.rb +24 -21
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +197 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
- data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +29 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +28 -33
- data/lib/solargraph/location.rb +10 -12
- data/lib/solargraph/logging.rb +4 -4
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +12 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
- data/lib/solargraph/parser/node_processor/base.rb +4 -4
- data/lib/solargraph/parser/node_processor.rb +1 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +78 -64
- data/lib/solargraph/pin/base_variable.rb +28 -71
- data/lib/solargraph/pin/block.rb +3 -2
- data/lib/solargraph/pin/breakable.rb +2 -0
- data/lib/solargraph/pin/callable.rb +23 -26
- data/lib/solargraph/pin/closure.rb +5 -4
- data/lib/solargraph/pin/common.rb +5 -2
- data/lib/solargraph/pin/compound_statement.rb +3 -3
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +9 -4
- data/lib/solargraph/pin/delegated_method.rb +4 -4
- data/lib/solargraph/pin/documenting.rb +3 -2
- data/lib/solargraph/pin/local_variable.rb +4 -4
- data/lib/solargraph/pin/method.rb +71 -70
- data/lib/solargraph/pin/namespace.rb +13 -12
- data/lib/solargraph/pin/parameter.rb +28 -27
- data/lib/solargraph/pin/proxy_type.rb +2 -0
- data/lib/solargraph/pin/reference.rb +17 -0
- data/lib/solargraph/pin/search.rb +2 -2
- data/lib/solargraph/pin/signature.rb +9 -14
- data/lib/solargraph/pin/symbol.rb +1 -0
- data/lib/solargraph/pin/until.rb +1 -3
- data/lib/solargraph/pin/while.rb +1 -3
- data/lib/solargraph/pin_cache.rb +16 -19
- data/lib/solargraph/position.rb +35 -17
- data/lib/solargraph/range.rb +10 -9
- data/lib/solargraph/rbs_map/conversions.rb +312 -206
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
- data/lib/solargraph/rbs_map.rb +3 -12
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +63 -53
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +49 -44
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +3 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -6
- data/lib/solargraph/source/chain/if.rb +11 -10
- data/lib/solargraph/source/chain/instance_variable.rb +3 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +4 -6
- data/lib/solargraph/source/chain/or.rb +2 -4
- data/lib/solargraph/source/chain/q_call.rb +13 -11
- data/lib/solargraph/source/chain/variable.rb +15 -13
- data/lib/solargraph/source/chain/z_super.rb +28 -30
- data/lib/solargraph/source/chain.rb +24 -16
- data/lib/solargraph/source/change.rb +3 -3
- data/lib/solargraph/source/cursor.rb +18 -18
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +46 -32
- data/lib/solargraph/source/updater.rb +1 -1
- data/lib/solargraph/source.rb +27 -29
- data/lib/solargraph/source_map/clip.rb +38 -30
- data/lib/solargraph/source_map/mapper.rb +52 -46
- data/lib/solargraph/source_map.rb +8 -4
- data/lib/solargraph/type_checker/rules.rb +8 -8
- data/lib/solargraph/type_checker.rb +95 -101
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +10 -9
- data/lib/solargraph/workspace/gemspecs.rb +1 -1
- data/lib/solargraph/workspace.rb +21 -44
- data/lib/solargraph/yard_map/helpers.rb +6 -2
- data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
- data/lib/solargraph/yard_map/mapper.rb +12 -12
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph.rb +5 -5
- data/solargraph.gemspec +35 -34
- metadata +28 -28
|
@@ -52,26 +52,26 @@ module Solargraph
|
|
|
52
52
|
|
|
53
53
|
# @param inferred [ComplexType, ComplexType::UniqueType]
|
|
54
54
|
# @param expected [ComplexType, ComplexType::UniqueType]
|
|
55
|
-
def return_type_conforms_to?
|
|
55
|
+
def return_type_conforms_to? inferred, expected
|
|
56
56
|
conforms_to?(inferred, expected, :return_type)
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
# @param inferred [ComplexType, ComplexType::UniqueType]
|
|
60
60
|
# @param expected [ComplexType, ComplexType::UniqueType]
|
|
61
|
-
def arg_conforms_to?
|
|
61
|
+
def arg_conforms_to? inferred, expected
|
|
62
62
|
conforms_to?(inferred, expected, :method_call)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
# @param inferred [ComplexType, ComplexType::UniqueType]
|
|
66
66
|
# @param expected [ComplexType, ComplexType::UniqueType]
|
|
67
|
-
def assignment_conforms_to?
|
|
67
|
+
def assignment_conforms_to? inferred, expected
|
|
68
68
|
conforms_to?(inferred, expected, :assignment)
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
# @param inferred [ComplexType, ComplexType::UniqueType]
|
|
72
72
|
# @param expected [ComplexType, ComplexType::UniqueType]
|
|
73
73
|
# @param scenario [Symbol]
|
|
74
|
-
def conforms_to?
|
|
74
|
+
def conforms_to? inferred, expected, scenario
|
|
75
75
|
rules_arr = []
|
|
76
76
|
rules_arr << :allow_empty_params unless rules.require_inferred_type_params?
|
|
77
77
|
rules_arr << :allow_any_match unless rules.require_all_unique_types_match_expected?
|
|
@@ -86,12 +86,12 @@ module Solargraph
|
|
|
86
86
|
# @return [Array<Problem>]
|
|
87
87
|
def problems
|
|
88
88
|
@problems ||= begin
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
89
|
+
all = method_tag_problems
|
|
90
|
+
.concat(variable_type_tag_problems)
|
|
91
|
+
.concat(const_problems)
|
|
92
|
+
.concat(call_problems)
|
|
93
|
+
unignored = without_ignored(all)
|
|
94
|
+
unignored.concat(unneeded_sgignore_problems)
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
|
|
@@ -148,7 +148,10 @@ module Solargraph
|
|
|
148
148
|
if pin.return_type.undefined? && rules.require_type_tags?
|
|
149
149
|
if pin.attribute?
|
|
150
150
|
inferred = pin.probe(api_map).self_to_type(pin.full_context)
|
|
151
|
-
|
|
151
|
+
unless inferred.defined?
|
|
152
|
+
result.push Problem.new(pin.location, "Missing @return tag for #{pin.path}",
|
|
153
|
+
pin: pin)
|
|
154
|
+
end
|
|
152
155
|
else
|
|
153
156
|
result.push Problem.new(pin.location, "Missing @return tag for #{pin.path}", pin: pin)
|
|
154
157
|
end
|
|
@@ -167,7 +170,8 @@ module Solargraph
|
|
|
167
170
|
end
|
|
168
171
|
else
|
|
169
172
|
unless return_type_conforms_to?(inferred, declared)
|
|
170
|
-
result.push Problem.new(pin.location,
|
|
173
|
+
result.push Problem.new(pin.location,
|
|
174
|
+
"Declared return type #{declared.rooted_tags} does not match inferred type #{inferred.rooted_tags} for #{pin.path}", pin: pin)
|
|
171
175
|
end
|
|
172
176
|
end
|
|
173
177
|
end
|
|
@@ -183,7 +187,7 @@ module Solargraph
|
|
|
183
187
|
def resolved_constant? pin
|
|
184
188
|
return true if pin.typify(api_map).defined?
|
|
185
189
|
constant_pins = api_map.get_constants('', *pin.closure.gates)
|
|
186
|
-
|
|
190
|
+
.select { |p| p.name == pin.return_type.namespace }
|
|
187
191
|
return true if constant_pins.find { |p| p.typify(api_map).defined? }
|
|
188
192
|
# will need to probe when a constant name is assigned to a
|
|
189
193
|
# class/module (alias)
|
|
@@ -205,19 +209,19 @@ module Solargraph
|
|
|
205
209
|
pin.signatures.each do |sig|
|
|
206
210
|
params = param_details_from_stack(sig, stack)
|
|
207
211
|
if rules.require_type_tags?
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
result.push Problem.new(pin.location, "Missing @param tag for #{par.name} on #{pin.path}", pin: pin)
|
|
215
|
-
end
|
|
216
|
-
else
|
|
212
|
+
sig.parameters.each do |par|
|
|
213
|
+
break if %i[restarg kwrestarg blockarg].include?(par.decl)
|
|
214
|
+
unless params[par.name]
|
|
215
|
+
if pin.attribute?
|
|
216
|
+
inferred = pin.probe(api_map).self_to_type(pin.full_context)
|
|
217
|
+
if inferred.undefined?
|
|
217
218
|
result.push Problem.new(pin.location, "Missing @param tag for #{par.name} on #{pin.path}", pin: pin)
|
|
218
219
|
end
|
|
220
|
+
else
|
|
221
|
+
result.push Problem.new(pin.location, "Missing @param tag for #{par.name} on #{pin.path}", pin: pin)
|
|
219
222
|
end
|
|
220
223
|
end
|
|
224
|
+
end
|
|
221
225
|
end
|
|
222
226
|
# @param name [String]
|
|
223
227
|
# @param data [Hash{Symbol => BasicObject}]
|
|
@@ -225,7 +229,8 @@ module Solargraph
|
|
|
225
229
|
# @type [ComplexType]
|
|
226
230
|
type = data[:qualified]
|
|
227
231
|
if type.undefined?
|
|
228
|
-
result.push Problem.new(pin.location, "Unresolved type #{data[:tagged]} for #{name} param on #{pin.path}",
|
|
232
|
+
result.push Problem.new(pin.location, "Unresolved type #{data[:tagged]} for #{name} param on #{pin.path}",
|
|
233
|
+
pin: pin)
|
|
229
234
|
end
|
|
230
235
|
end
|
|
231
236
|
end
|
|
@@ -257,20 +262,20 @@ module Solargraph
|
|
|
257
262
|
end
|
|
258
263
|
else
|
|
259
264
|
unless assignment_conforms_to?(inferred, declared)
|
|
260
|
-
result.push Problem.new(pin.location,
|
|
265
|
+
result.push Problem.new(pin.location,
|
|
266
|
+
"Declared type #{declared} does not match inferred type #{inferred} for variable #{pin.name}", pin: pin)
|
|
261
267
|
end
|
|
262
268
|
end
|
|
263
269
|
elsif declared_externally?(pin)
|
|
264
270
|
ignored_pins.push pin
|
|
265
271
|
end
|
|
266
272
|
elsif !pin.is_a?(Pin::Parameter) && !resolved_constant?(pin)
|
|
267
|
-
result.push Problem.new(pin.location, "Unresolved type #{pin.return_type} for variable #{pin.name}",
|
|
273
|
+
result.push Problem.new(pin.location, "Unresolved type #{pin.return_type} for variable #{pin.name}",
|
|
274
|
+
pin: pin)
|
|
268
275
|
end
|
|
269
276
|
elsif pin.assignment
|
|
270
277
|
inferred = pin.probe(api_map)
|
|
271
|
-
if inferred.undefined? && declared_externally?(pin)
|
|
272
|
-
ignored_pins.push pin
|
|
273
|
-
end
|
|
278
|
+
ignored_pins.push pin if inferred.undefined? && declared_externally?(pin)
|
|
274
279
|
end
|
|
275
280
|
end
|
|
276
281
|
result
|
|
@@ -313,7 +318,6 @@ module Solargraph
|
|
|
313
318
|
chain = Solargraph::Parser.chain(call, filename)
|
|
314
319
|
# @sg-ignore Need to add nil check here
|
|
315
320
|
closure_pin = source_map.locate_closure_pin(rng.start.line, rng.start.column)
|
|
316
|
-
namespace_pin = closure_pin
|
|
317
321
|
if call.type == :block
|
|
318
322
|
# blocks in the AST include the method call as well, so the
|
|
319
323
|
# node returned by #call_nodes_from needs to be backed out
|
|
@@ -336,7 +340,6 @@ module Solargraph
|
|
|
336
340
|
found = nil
|
|
337
341
|
# @type [Array<Solargraph::Pin::Base>]
|
|
338
342
|
all_found = []
|
|
339
|
-
closest = ComplexType::UNDEFINED
|
|
340
343
|
until base.links.first.undefined?
|
|
341
344
|
# @sg-ignore Need to add nil check here
|
|
342
345
|
all_found = base.define(api_map, closure_pin, locals)
|
|
@@ -348,16 +351,14 @@ module Solargraph
|
|
|
348
351
|
all_closest = all_found.map { |pin| pin.typify(api_map) }
|
|
349
352
|
closest = ComplexType.new(all_closest.flat_map(&:items).uniq)
|
|
350
353
|
# @todo remove the internal_or_core? check at a higher-than-strict level
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
result.push Problem.new(location, "Unresolved call to #{missing.links.last.word}")
|
|
358
|
-
end
|
|
359
|
-
@marked_ranges.push rng
|
|
354
|
+
# @sg-ignore Need to add nil check here
|
|
355
|
+
if (!found || found.is_a?(Pin::BaseVariable) || (closest.defined? && internal_or_core?(found))) && !(closest.generic? || ignored_pins.include?(found))
|
|
356
|
+
if closest.defined?
|
|
357
|
+
result.push Problem.new(location, "Unresolved call to #{missing.links.last.word} on #{closest}")
|
|
358
|
+
else
|
|
359
|
+
result.push Problem.new(location, "Unresolved call to #{missing.links.last.word}")
|
|
360
360
|
end
|
|
361
|
+
@marked_ranges.push rng
|
|
361
362
|
end
|
|
362
363
|
end
|
|
363
364
|
# @sg-ignore Need to add nil check here
|
|
@@ -407,7 +408,7 @@ module Solargraph
|
|
|
407
408
|
return [] if !rules.validate_calls? || base.links.first.is_a?(Solargraph::Source::Chain::ZSuper)
|
|
408
409
|
|
|
409
410
|
all_errors = []
|
|
410
|
-
pin.signatures.
|
|
411
|
+
pin.signatures.sort_by { |sig| sig.parameters.length }.each do |sig|
|
|
411
412
|
params = param_details_from_stack(sig, pins)
|
|
412
413
|
|
|
413
414
|
signature_errors = signature_argument_problems_for location, locals, closure_pin, params, arguments, sig, pin
|
|
@@ -431,7 +432,6 @@ module Solargraph
|
|
|
431
432
|
# @param arguments [Array<Source::Chain>]
|
|
432
433
|
# @param sig [Pin::Signature]
|
|
433
434
|
# @param pin [Pin::Method]
|
|
434
|
-
# @param pins [Array<Pin::Method>]
|
|
435
435
|
#
|
|
436
436
|
# @return [Array<Problem>]
|
|
437
437
|
def signature_argument_problems_for location, locals, closure_pin, params, arguments, sig, pin
|
|
@@ -441,31 +441,25 @@ module Solargraph
|
|
|
441
441
|
# when possible, and when not, ensure provably
|
|
442
442
|
# incorrect situations are detected.
|
|
443
443
|
sig.parameters.each_with_index do |par, idx|
|
|
444
|
-
return errors if par.decl == :restarg
|
|
444
|
+
return errors if par.decl == :restarg # bail out and assume the rest is valid pending better arg processing
|
|
445
445
|
argchain = arguments[idx]
|
|
446
446
|
if argchain.nil?
|
|
447
|
+
final_arg = arguments.last
|
|
447
448
|
if par.decl == :arg
|
|
448
|
-
final_arg = arguments.last
|
|
449
449
|
if final_arg && final_arg.node.type == :splat
|
|
450
450
|
argchain = final_arg
|
|
451
451
|
return errors
|
|
452
452
|
else
|
|
453
453
|
errors.push Problem.new(location, "Not enough arguments to #{pin.path}")
|
|
454
454
|
end
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
argchain = final_arg if final_arg && [:kwsplat, :hash].include?(final_arg.node.type)
|
|
455
|
+
elsif final_arg && %i[kwsplat hash].include?(final_arg.node.type)
|
|
456
|
+
argchain = final_arg
|
|
458
457
|
end
|
|
459
458
|
end
|
|
460
459
|
if argchain
|
|
461
|
-
if par.decl
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
else
|
|
465
|
-
if argchain.node.type == :splat && argchain == arguments.last
|
|
466
|
-
final_arg = argchain
|
|
467
|
-
end
|
|
468
|
-
if (final_arg && final_arg.node.type == :splat)
|
|
460
|
+
if par.decl == :arg
|
|
461
|
+
final_arg = argchain if argchain.node.type == :splat && argchain == arguments.last
|
|
462
|
+
if final_arg && final_arg.node.type == :splat
|
|
469
463
|
# The final argument given has been seen and was a
|
|
470
464
|
# splat, which doesn't give us useful types or
|
|
471
465
|
# arities against positional parameters, so let's
|
|
@@ -490,10 +484,14 @@ module Solargraph
|
|
|
490
484
|
argtype = argchain.infer(api_map, closure_pin, locals)
|
|
491
485
|
argtype = argtype.self_to_type(closure_pin.context)
|
|
492
486
|
if argtype.defined? && ptype.defined? && !arg_conforms_to?(argtype, ptype)
|
|
493
|
-
errors.push Problem.new(location,
|
|
487
|
+
errors.push Problem.new(location,
|
|
488
|
+
"Wrong argument type for #{pin.path}: #{par.name} expected #{ptype}, received #{argtype}")
|
|
494
489
|
return errors
|
|
495
490
|
end
|
|
496
491
|
end
|
|
492
|
+
else
|
|
493
|
+
errors.concat kwarg_problems_for sig, argchain, api_map, closure_pin, locals, location, pin, params, idx
|
|
494
|
+
next
|
|
497
495
|
end
|
|
498
496
|
elsif par.decl == :kwarg
|
|
499
497
|
errors.push Problem.new(location, "Call to #{pin.path} is missing keyword argument #{par.name}")
|
|
@@ -522,27 +520,26 @@ module Solargraph
|
|
|
522
520
|
argchain = kwargs[par.name.to_sym]
|
|
523
521
|
if par.decl == :kwrestarg || (par.decl == :optarg && idx == pin.parameters.length - 1 && par.asgn_code == '{}')
|
|
524
522
|
result.concat kwrestarg_problems_for(api_map, closure_pin, locals, location, pin, params, kwargs)
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
end
|
|
523
|
+
elsif argchain
|
|
524
|
+
data = params[par.name]
|
|
525
|
+
if data.nil?
|
|
526
|
+
# @todo Some level (strong, I guess) should require the param here
|
|
527
|
+
else
|
|
528
|
+
# @type [ComplexType, ComplexType::UniqueType]
|
|
529
|
+
ptype = data[:qualified]
|
|
530
|
+
ptype = ptype.self_to_type(pin.context)
|
|
531
|
+
unless ptype.undefined?
|
|
532
|
+
# @type [ComplexType]
|
|
533
|
+
argtype = argchain.infer(api_map, closure_pin, locals).self_to_type(closure_pin.context)
|
|
534
|
+
# @todo Unresolved call to defined?
|
|
535
|
+
if argtype.defined? && ptype && !arg_conforms_to?(argtype, ptype)
|
|
536
|
+
result.push Problem.new(location,
|
|
537
|
+
"Wrong argument type for #{pin.path}: #{par.name} expected #{ptype}, received #{argtype}")
|
|
541
538
|
end
|
|
542
539
|
end
|
|
543
|
-
elsif par.decl == :kwarg
|
|
544
|
-
result.push Problem.new(location, "Call to #{pin.path} is missing keyword argument #{par.name}")
|
|
545
540
|
end
|
|
541
|
+
elsif par.decl == :kwarg
|
|
542
|
+
result.push Problem.new(location, "Call to #{pin.path} is missing keyword argument #{par.name}")
|
|
546
543
|
end
|
|
547
544
|
result
|
|
548
545
|
end
|
|
@@ -552,20 +549,22 @@ module Solargraph
|
|
|
552
549
|
# @param locals [Array<Pin::LocalVariable>]
|
|
553
550
|
# @param location [Location]
|
|
554
551
|
# @param pin [Pin::Method]
|
|
555
|
-
# @param params [Hash{String =>
|
|
552
|
+
# @param params [Hash{String => nil, Hash}]
|
|
556
553
|
# @param kwargs [Hash{Symbol => Source::Chain}]
|
|
557
554
|
# @return [Array<Problem>]
|
|
558
|
-
def kwrestarg_problems_for
|
|
555
|
+
def kwrestarg_problems_for api_map, closure_pin, locals, location, pin, params, kwargs
|
|
559
556
|
result = []
|
|
560
557
|
kwargs.each_pair do |pname, argchain|
|
|
561
558
|
next unless params.key?(pname.to_s)
|
|
559
|
+
# @sg-ignore
|
|
562
560
|
# @type [ComplexType]
|
|
563
|
-
|
|
564
|
-
ptype =
|
|
561
|
+
raw_ptype = params[pname.to_s][:qualified]
|
|
562
|
+
ptype = raw_ptype.self_to_type(pin.context)
|
|
565
563
|
argtype = argchain.infer(api_map, closure_pin, locals)
|
|
566
564
|
argtype = argtype.self_to_type(closure_pin.context)
|
|
567
565
|
if argtype.defined? && ptype && !arg_conforms_to?(argtype, ptype)
|
|
568
|
-
result.push Problem.new(location,
|
|
566
|
+
result.push Problem.new(location,
|
|
567
|
+
"Wrong argument type for #{pin.path}: #{pname} expected #{ptype}, received #{argtype}")
|
|
569
568
|
end
|
|
570
569
|
end
|
|
571
570
|
result
|
|
@@ -575,7 +574,7 @@ module Solargraph
|
|
|
575
574
|
# @param pin [Pin::Method, Pin::Signature]
|
|
576
575
|
# @param relevant_pin [Pin::Method, Pin::Signature] the pin which is under inspection
|
|
577
576
|
# @return [void]
|
|
578
|
-
def add_restkwarg_param_tag_details
|
|
577
|
+
def add_restkwarg_param_tag_details param_details, pin, relevant_pin
|
|
579
578
|
# see if we have additional tags to pay attention to from YARD -
|
|
580
579
|
# e.g., kwargs in a **restkwargs splat
|
|
581
580
|
tags = pin.docstring.tags(:param)
|
|
@@ -596,7 +595,7 @@ module Solargraph
|
|
|
596
595
|
|
|
597
596
|
# @param pin [Pin::Signature]
|
|
598
597
|
# @return [Hash{String => Hash{Symbol => String, ComplexType}}]
|
|
599
|
-
def signature_param_details
|
|
598
|
+
def signature_param_details pin
|
|
600
599
|
# @type [Hash{String => Hash{Symbol => String, ComplexType}}]
|
|
601
600
|
result = {}
|
|
602
601
|
pin.parameters.each do |param|
|
|
@@ -630,7 +629,7 @@ module Solargraph
|
|
|
630
629
|
# @param new_param_details [Hash{String => Hash{Symbol => String, ComplexType}}]
|
|
631
630
|
#
|
|
632
631
|
# @return [void]
|
|
633
|
-
def add_to_param_details
|
|
632
|
+
def add_to_param_details param_details, param_names, new_param_details
|
|
634
633
|
new_param_details.each do |param_name, details|
|
|
635
634
|
next unless param_names.include?(param_name)
|
|
636
635
|
|
|
@@ -643,7 +642,7 @@ module Solargraph
|
|
|
643
642
|
# @param signature [Pin::Signature]
|
|
644
643
|
# @param method_pin_stack [Array<Pin::Method>]
|
|
645
644
|
# @return [Hash{String => Hash{Symbol => String, ComplexType}}]
|
|
646
|
-
def param_details_from_stack
|
|
645
|
+
def param_details_from_stack signature, method_pin_stack
|
|
647
646
|
signature_type = signature.typify(api_map)
|
|
648
647
|
signature = signature.proxy signature_type
|
|
649
648
|
param_details = signature_param_details(signature)
|
|
@@ -683,7 +682,7 @@ module Solargraph
|
|
|
683
682
|
|
|
684
683
|
# @param pin [Pin::BaseVariable]
|
|
685
684
|
def declared_externally? pin
|
|
686
|
-
raise
|
|
685
|
+
raise 'No assignment found' if pin.assignment.nil?
|
|
687
686
|
|
|
688
687
|
chain = Solargraph::Parser.chain(pin.assignment, filename)
|
|
689
688
|
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
@@ -696,24 +695,19 @@ module Solargraph
|
|
|
696
695
|
type = chain.infer(api_map, closure_pin, locals)
|
|
697
696
|
if type.undefined? && !rules.ignore_all_undefined?
|
|
698
697
|
base = chain
|
|
699
|
-
missing = chain
|
|
700
698
|
# @type [Solargraph::Pin::Base, nil]
|
|
701
699
|
found = nil
|
|
702
700
|
# @type [Array<Solargraph::Pin::Base>]
|
|
703
701
|
all_found = []
|
|
704
|
-
closest = ComplexType::UNDEFINED
|
|
705
702
|
until base.links.first.undefined?
|
|
706
703
|
all_found = base.define(api_map, closure_pin, locals)
|
|
707
704
|
found = all_found.first
|
|
708
705
|
break if found
|
|
709
|
-
missing = base
|
|
710
706
|
base = base.base
|
|
711
707
|
end
|
|
712
708
|
all_closest = all_found.map { |pin| pin.typify(api_map) }
|
|
713
709
|
closest = ComplexType.new(all_closest.flat_map(&:items).uniq)
|
|
714
|
-
if !found || closest.defined? || internal?(found)
|
|
715
|
-
return false
|
|
716
|
-
end
|
|
710
|
+
return false if !found || closest.defined? || internal?(found)
|
|
717
711
|
end
|
|
718
712
|
true
|
|
719
713
|
end
|
|
@@ -736,7 +730,7 @@ module Solargraph
|
|
|
736
730
|
# @param arguments [Array<Source::Chain>]
|
|
737
731
|
# @param location [Location]
|
|
738
732
|
# @return [Array<Problem>]
|
|
739
|
-
def parameterized_arity_problems_for
|
|
733
|
+
def parameterized_arity_problems_for pin, parameters, arguments, location
|
|
740
734
|
return [] unless pin.explicit?
|
|
741
735
|
return [] if parameters.empty? && arguments.empty?
|
|
742
736
|
return [] if pin.anon_splat?
|
|
@@ -751,7 +745,7 @@ module Solargraph
|
|
|
751
745
|
settled_kwargs = parameters.count(&:keyword?)
|
|
752
746
|
else
|
|
753
747
|
kwargs = convert_hash(unchecked.last.node)
|
|
754
|
-
if parameters.any? { |param| [
|
|
748
|
+
if parameters.any? { |param| %i[kwarg kwoptarg].include?(param.decl) || param.kwrestarg? }
|
|
755
749
|
if kwargs.empty?
|
|
756
750
|
add_params += 1
|
|
757
751
|
else
|
|
@@ -780,10 +774,12 @@ module Solargraph
|
|
|
780
774
|
return [] if parameters.any?(&:rest?)
|
|
781
775
|
opt = optional_param_count(parameters)
|
|
782
776
|
return [] if unchecked.length <= req + opt
|
|
783
|
-
if req + add_params + 1 == unchecked.length && any_splatted_call?(unchecked.map(&:node)) && (parameters.map(&:decl) & [
|
|
777
|
+
if req + add_params + 1 == unchecked.length && any_splatted_call?(unchecked.map(&:node)) && (parameters.map(&:decl) & %i[
|
|
778
|
+
kwarg kwoptarg kwrestarg
|
|
779
|
+
]).any?
|
|
784
780
|
return []
|
|
785
781
|
end
|
|
786
|
-
return [] if arguments.length - req == parameters.select { |p| [
|
|
782
|
+
return [] if arguments.length - req == parameters.select { |p| %i[optarg kwoptarg].include?(p.decl) }.length
|
|
787
783
|
return [Problem.new(location, "Too many arguments to #{pin.path}")]
|
|
788
784
|
elsif unchecked.length < req - settled_kwargs && (arguments.empty? || (!arguments.last.splat? && !arguments.last.links.last.is_a?(Solargraph::Source::Chain::Hash)))
|
|
789
785
|
# HACK: Kernel#raise signature is incorrect in Ruby 2.7 core docs.
|
|
@@ -799,35 +795,33 @@ module Solargraph
|
|
|
799
795
|
# @todo need to use generic types in method to choose correct
|
|
800
796
|
# signature and generate Integer as return type
|
|
801
797
|
# @return [Integer]
|
|
802
|
-
def required_param_count
|
|
798
|
+
def required_param_count parameters
|
|
803
799
|
parameters.sum { |param| %i[arg kwarg].include?(param.decl) ? 1 : 0 }
|
|
804
800
|
end
|
|
805
801
|
|
|
806
802
|
# @param parameters [Enumerable<Pin::Parameter>]
|
|
807
|
-
#
|
|
803
|
+
#
|
|
808
804
|
# @return [Integer]
|
|
809
|
-
def optional_param_count
|
|
805
|
+
def optional_param_count parameters
|
|
810
806
|
parameters.select { |p| p.decl == :optarg }.length
|
|
811
807
|
end
|
|
812
808
|
|
|
813
809
|
# @param pin [Pin::Method]
|
|
814
|
-
# @sg-ignore need boolish support for ? methods
|
|
815
810
|
def abstract? pin
|
|
816
811
|
pin.docstring.has_tag?('abstract') ||
|
|
817
|
-
|
|
818
|
-
(pin.closure && pin.closure.docstring.has_tag?('abstract'))
|
|
812
|
+
pin.closure&.docstring&.has_tag?('abstract')
|
|
819
813
|
end
|
|
820
814
|
|
|
821
815
|
# @param pin [Pin::Method]
|
|
822
816
|
# @return [Array<Source::Chain>]
|
|
823
|
-
def fake_args_for
|
|
817
|
+
def fake_args_for pin
|
|
824
818
|
args = []
|
|
825
819
|
with_opts = false
|
|
826
820
|
with_block = false
|
|
827
821
|
# @param pin [Pin::Parameter]
|
|
828
822
|
pin.parameters.each do |pin|
|
|
829
823
|
# @sg-ignore flow sensitive typing should be able to handle redefinition
|
|
830
|
-
if [
|
|
824
|
+
if %i[kwarg kwoptarg kwrestarg].include?(pin.decl)
|
|
831
825
|
with_opts = true
|
|
832
826
|
# @sg-ignore flow sensitive typing should be able to handle redefinition
|
|
833
827
|
elsif pin.decl == :block
|
data/lib/solargraph/version.rb
CHANGED
|
@@ -54,7 +54,9 @@ module Solargraph
|
|
|
54
54
|
#
|
|
55
55
|
# @return [Array<String>]
|
|
56
56
|
def calculated
|
|
57
|
-
|
|
57
|
+
unless @calculated || directory.empty? || directory == '*'
|
|
58
|
+
Solargraph.logger.info "Indexing workspace files in #{directory}"
|
|
59
|
+
end
|
|
58
60
|
@calculated ||= included - excluded
|
|
59
61
|
end
|
|
60
62
|
|
|
@@ -146,7 +148,7 @@ module Solargraph
|
|
|
146
148
|
global_config = read_config(global_config_path)
|
|
147
149
|
|
|
148
150
|
defaults = default_config
|
|
149
|
-
defaults.merge({'exclude' => []}) unless workspace_config.nil?
|
|
151
|
+
defaults.merge({ 'exclude' => [] }) unless workspace_config.nil?
|
|
150
152
|
|
|
151
153
|
defaults
|
|
152
154
|
.merge(global_config || {})
|
|
@@ -160,7 +162,7 @@ module Solargraph
|
|
|
160
162
|
def read_config config_path = ''
|
|
161
163
|
return nil if config_path.empty?
|
|
162
164
|
return nil unless File.file?(config_path)
|
|
163
|
-
YAML.
|
|
165
|
+
YAML.safe_load_file(config_path)
|
|
164
166
|
end
|
|
165
167
|
|
|
166
168
|
# @return [Hash{String => Array, Hash, Integer}]
|
|
@@ -176,11 +178,11 @@ module Solargraph
|
|
|
176
178
|
'cops' => 'safe',
|
|
177
179
|
'except' => [],
|
|
178
180
|
'only' => [],
|
|
179
|
-
'extra_args' =>[]
|
|
181
|
+
'extra_args' => []
|
|
180
182
|
}
|
|
181
183
|
},
|
|
182
184
|
'type_checker' => {
|
|
183
|
-
'rules' => {
|
|
185
|
+
'rules' => {}
|
|
184
186
|
},
|
|
185
187
|
'require_paths' => [],
|
|
186
188
|
'plugins' => [],
|
|
@@ -193,12 +195,11 @@ module Solargraph
|
|
|
193
195
|
# @param globs [Array<String>]
|
|
194
196
|
# @return [Array<String>]
|
|
195
197
|
def process_globs globs
|
|
196
|
-
|
|
198
|
+
globs.flat_map do |glob|
|
|
197
199
|
Dir[File.absolute_path(glob, directory)]
|
|
198
|
-
.map{ |f| f.gsub(
|
|
200
|
+
.map { |f| f.gsub('\\', '/') }
|
|
199
201
|
.select { |f| File.file?(f) }
|
|
200
202
|
end
|
|
201
|
-
result
|
|
202
203
|
end
|
|
203
204
|
|
|
204
205
|
# Modify the included files based on excluded directories and get an
|
|
@@ -241,7 +242,7 @@ module Solargraph
|
|
|
241
242
|
# @param glob [String]
|
|
242
243
|
# @return [String]
|
|
243
244
|
def glob_to_directory glob
|
|
244
|
-
glob.gsub(
|
|
245
|
+
glob.gsub(%r{(/\*|/\*\*/\*\*?)$}, '')
|
|
245
246
|
end
|
|
246
247
|
|
|
247
248
|
# @return [Array<String>]
|
|
@@ -117,7 +117,7 @@ module Solargraph
|
|
|
117
117
|
#
|
|
118
118
|
# @return [Array<Gem::Specification>]
|
|
119
119
|
def fetch_dependencies gemspec, out: $stderr
|
|
120
|
-
|
|
120
|
+
all_gemspecs_from_bundle
|
|
121
121
|
|
|
122
122
|
# @type [Hash{String => Gem::Specification}]
|
|
123
123
|
deps_so_far = {}
|