Skip to content

Commit f444374

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Report COULD_NOT_INFER when inference fails for ExtensionOverride.
[email protected] Change-Id: Ibadc5deac6289216b3d1547b963a206560c64691 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/112760 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 5d2c17d commit f444374

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,7 @@ class ExtensionMemberResolver {
9393
var receiverExpression = arguments[0];
9494
var receiverType = receiverExpression.staticType;
9595

96-
var typeArgumentTypes = _inferTypeArguments(
97-
element,
98-
receiverType,
99-
node.typeArguments,
100-
);
96+
var typeArgumentTypes = _inferTypeArguments(node, receiverType);
10197

10298
nodeImpl.typeArgumentTypes = typeArgumentTypes;
10399
nodeImpl.extendedType = Substitution.fromPairs(
@@ -307,23 +303,24 @@ class ExtensionMemberResolver {
307303
return candidates;
308304
}
309305

310-
/// Given the generic [extension] element, either return types specified
306+
/// Given the generic [element] element, either return types specified
311307
/// explicitly in [typeArguments], or infer type arguments from the given
312308
/// [receiverType].
313309
///
314310
/// If the number of explicit type arguments is different than the number
315311
/// of extension's type parameters, or inference fails, return `dynamic`
316312
/// for all type parameters.
317313
List<DartType> _inferTypeArguments(
318-
ExtensionElement extension,
314+
ExtensionOverride node,
319315
DartType receiverType,
320-
TypeArgumentList typeArguments,
321316
) {
322-
var typeParameters = extension.typeParameters;
317+
var element = node.staticElement;
318+
var typeParameters = element.typeParameters;
323319
if (typeParameters.isEmpty) {
324320
return const <DartType>[];
325321
}
326322

323+
var typeArguments = node.typeArguments;
327324
if (typeArguments != null) {
328325
var arguments = typeArguments.arguments;
329326
if (arguments.length == typeParameters.length) {
@@ -340,10 +337,14 @@ class ExtensionMemberResolver {
340337
);
341338
inferrer.constrainArgument(
342339
receiverType,
343-
extension.extendedType,
340+
element.extendedType,
344341
'extendedType',
345342
);
346-
return inferrer.infer(typeParameters);
343+
return inferrer.infer(
344+
typeParameters,
345+
errorReporter: _errorReporter,
346+
errorNode: node.extensionName,
347+
);
347348
}
348349
}
349350

pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/analysis/features.dart';
6+
import 'package:analyzer/src/error/codes.dart';
67
import 'package:analyzer/src/generated/engine.dart';
78
import 'package:test_reflective_loader/test_reflective_loader.dart';
89

@@ -283,6 +284,23 @@ void f(A<int> a) {
283284
);
284285
}
285286

287+
test_override_inferTypeArguments_error_couldNotInfer() async {
288+
await assertErrorsInCode('''
289+
extension E<T extends num> on T {
290+
void foo() {}
291+
}
292+
293+
f(String s) {
294+
E(s).foo();
295+
}
296+
''', [
297+
error(StrongModeCode.COULD_NOT_INFER, 69, 1),
298+
]);
299+
var override = findNode.extensionOverride('E(s)');
300+
assertElementTypeStrings(override.typeArgumentTypes, ['String']);
301+
assertElementTypeString(override.extendedType, 'String');
302+
}
303+
286304
test_override_inferTypeArguments_getter() async {
287305
await assertNoErrorsInCode('''
288306
class A<T> {}

0 commit comments

Comments
 (0)