validate @visibleForOverriding extension type targets

See: https://github.com/dart-lang/sdk/issues/53434

Change-Id: I931a7cdff990ca19f6ec3267340031ca5fa7b814
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/325322
Commit-Queue: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
pq 2023-09-11 23:16:10 +00:00 committed by Commit Queue
parent d5555377ed
commit 2f90ee8cf1
2 changed files with 21 additions and 1 deletions

View file

@ -414,7 +414,8 @@ class AnnotationVerifier {
} else if (parent.declaredElement != null) {
final declaredElement = parent.declaredElement!;
if (element.isVisibleForOverriding &&
!declaredElement.isInstanceMember) {
!declaredElement.isInstanceMember ||
declaredElement.enclosingElement is ExtensionTypeElement) {
reportInvalidVisibleForOverriding();
}

View file

@ -62,6 +62,25 @@ extension E on String {
]);
}
test_invalid_extensionType() async {
await assertErrorsInCode('''
import 'package:meta/meta.dart';
@visibleForOverriding
extension type E(int i) {}
''', [error(WarningCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, 33, 21)]);
}
test_invalid_extensionType_member() async {
await assertErrorsInCode('''
import 'package:meta/meta.dart';
extension type E(int i) {
@visibleForOverriding
void f() { }
}
''', [error(WarningCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION, 63, 21)]);
}
test_invalid_staticMember() async {
await assertErrorsInCode(r'''
import 'package:meta/meta.dart';