Skip to content

Commit 5fbf795

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Don't apply extensions to Never.
dart-lang/language#1003 Change-Id: Ie9526e8e362865754e84b5d9cda307dc7b07aaee Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150162 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
1 parent ecc7a21 commit 5fbf795

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:analyzer/error/listener.dart';
1010
import 'package:analyzer/src/dart/ast/ast.dart';
1111
import 'package:analyzer/src/dart/element/generic_inferrer.dart';
1212
import 'package:analyzer/src/dart/element/member.dart';
13+
import 'package:analyzer/src/dart/element/type.dart';
1314
import 'package:analyzer/src/dart/element/type_algebra.dart';
1415
import 'package:analyzer/src/dart/element/type_schema.dart';
1516
import 'package:analyzer/src/dart/resolver/resolution_result.dart';
@@ -252,6 +253,10 @@ class ExtensionMemberResolver {
252253
/// Return extensions for the [type] that match the given [name] in the
253254
/// current scope.
254255
List<_InstantiatedExtension> _getApplicable(DartType type, String name) {
256+
if (identical(type, NeverTypeImpl.instance)) {
257+
return const <_InstantiatedExtension>[];
258+
}
259+
255260
var candidates = _getExtensionsWithMember(name);
256261

257262
var instantiatedExtensions = <_InstantiatedExtension>[];

pkg/analyzer/test/src/dart/resolution/extension_method_test.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,6 +1446,21 @@ class ExtensionMethodsExternalReferenceWithNnbdTest
14461446
@override
14471447
bool get typeToStringWithNullability => true;
14481448

1449+
test_instance_getter_fromInstance_Never() async {
1450+
await assertNoErrorsInCode('''
1451+
extension E on Never {
1452+
int get foo => 0;
1453+
}
1454+
1455+
f(Never a) {
1456+
a.foo;
1457+
}
1458+
''');
1459+
var access = findNode.prefixed('a.foo');
1460+
assertElementNull(access);
1461+
assertType(access, 'Never');
1462+
}
1463+
14491464
test_instance_getter_fromInstance_nullable() async {
14501465
await assertNoErrorsInCode('''
14511466
extension E on int? {
@@ -1476,6 +1491,28 @@ f(int? a) {
14761491
assertType(identifier, 'int');
14771492
}
14781493

1494+
test_instance_method_fromInstance_Never() async {
1495+
await assertErrorsInCode('''
1496+
extension E on Never {
1497+
void foo() {}
1498+
}
1499+
1500+
f(Never a) {
1501+
a.foo();
1502+
}
1503+
''', [
1504+
error(HintCode.RECEIVER_OF_TYPE_NEVER, 57, 1),
1505+
error(HintCode.DEAD_CODE, 62, 3),
1506+
]);
1507+
assertMethodInvocation2(
1508+
findNode.methodInvocation('a.foo()'),
1509+
element: null,
1510+
typeArgumentTypes: [],
1511+
invokeType: 'dynamic',
1512+
type: 'Never',
1513+
);
1514+
}
1515+
14791516
test_instance_method_fromInstance_nullable() async {
14801517
await assertNoErrorsInCode('''
14811518
extension E on int? {

0 commit comments

Comments
 (0)