mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 00:13:50 +00:00
Extension types. Report super constructor invocations.
Change-Id: Ib3da4c7f19864bbbb6d9f53769375fe9f1cf7daa Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/319300 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Phil Quitslund <pquitslund@google.com>
This commit is contained in:
parent
3564f5c163
commit
ffcb38d702
|
@ -636,6 +636,10 @@ CompileTimeErrorCode.EXTENSION_OVERRIDE_WITH_CASCADE:
|
|||
Replace the `..` with `.`.
|
||||
CompileTimeErrorCode.EXTENSION_OVERRIDE_WITHOUT_ACCESS:
|
||||
status: noFix
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION:
|
||||
status: needsFix
|
||||
notes: |-
|
||||
Remove it.
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_INSTANCE_FIELD:
|
||||
status: noFix
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_MEMBER_OF_OBJECT:
|
||||
|
|
|
@ -1598,6 +1598,14 @@ class CompileTimeErrorCode extends AnalyzerErrorCode {
|
|||
hasPublishedDocs: true,
|
||||
);
|
||||
|
||||
/// No parameters.
|
||||
static const CompileTimeErrorCode
|
||||
EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION = CompileTimeErrorCode(
|
||||
'EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION',
|
||||
"Extension type constructors can't include superinitializers.",
|
||||
correctionMessage: "Try removing the superconstructor invocation.",
|
||||
);
|
||||
|
||||
/// No parameters.
|
||||
static const CompileTimeErrorCode EXTENSION_TYPE_DECLARES_INSTANCE_FIELD =
|
||||
CompileTimeErrorCode(
|
||||
|
|
|
@ -191,6 +191,7 @@ const List<ErrorCode> errorCodeValues = [
|
|||
CompileTimeErrorCode.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE,
|
||||
CompileTimeErrorCode.EXTENSION_OVERRIDE_WITHOUT_ACCESS,
|
||||
CompileTimeErrorCode.EXTENSION_OVERRIDE_WITH_CASCADE,
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION,
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_INSTANCE_FIELD,
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_DECLARES_MEMBER_OF_OBJECT,
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_IMPLEMENTS_DISALLOWED_TYPE,
|
||||
|
|
|
@ -1286,6 +1286,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
|
|||
);
|
||||
_isInConstructorInitializer = true;
|
||||
try {
|
||||
_checkForExtensionTypeConstructorWithSuperInvocation(node);
|
||||
super.visitSuperConstructorInvocation(node);
|
||||
} finally {
|
||||
_isInConstructorInitializer = false;
|
||||
|
@ -2877,6 +2878,17 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
|
|||
}
|
||||
}
|
||||
|
||||
void _checkForExtensionTypeConstructorWithSuperInvocation(
|
||||
SuperConstructorInvocation node,
|
||||
) {
|
||||
if (_enclosingClass is ExtensionTypeElement) {
|
||||
errorReporter.reportErrorForToken(
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION,
|
||||
node.superKeyword,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void _checkForExtensionTypeDeclaresInstanceField(FieldDeclaration node) {
|
||||
if (_enclosingClass is! ExtensionTypeElement) {
|
||||
return;
|
||||
|
|
|
@ -5056,6 +5056,10 @@ CompileTimeErrorCode:
|
|||
|
||||
If there are multiple cascaded accesses, you'll need to duplicate the
|
||||
extension override for each one.
|
||||
EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION:
|
||||
problemMessage: "Extension type constructors can't include superinitializers."
|
||||
correctionMessage: Try removing the superconstructor invocation.
|
||||
comment: No parameters.
|
||||
EXTENSION_TYPE_DECLARES_INSTANCE_FIELD:
|
||||
problemMessage: "Extension types can't declare instance fields."
|
||||
correctionMessage: Try replacing the field with a getter.
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'package:analyzer/src/error/codes.dart';
|
||||
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
||||
|
||||
import '../dart/resolution/context_collection_resolution.dart';
|
||||
|
||||
main() {
|
||||
defineReflectiveSuite(() {
|
||||
defineReflectiveTests(ExtensionTypeConstructorWithSuperInvocationTest);
|
||||
});
|
||||
}
|
||||
|
||||
@reflectiveTest
|
||||
class ExtensionTypeConstructorWithSuperInvocationTest
|
||||
extends PubPackageResolutionTest {
|
||||
test_named() async {
|
||||
await assertErrorsInCode('''
|
||||
extension type E(int it) {
|
||||
E.named() : it = 0, super.named();
|
||||
}
|
||||
''', [
|
||||
error(
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION,
|
||||
49,
|
||||
5),
|
||||
]);
|
||||
|
||||
final node = findNode.singleSuperConstructorInvocation;
|
||||
assertResolvedNodeText(node, r'''
|
||||
SuperConstructorInvocation
|
||||
superKeyword: super
|
||||
period: .
|
||||
constructorName: SimpleIdentifier
|
||||
token: named
|
||||
staticElement: <null>
|
||||
staticType: null
|
||||
argumentList: ArgumentList
|
||||
leftParenthesis: (
|
||||
rightParenthesis: )
|
||||
staticElement: <null>
|
||||
''');
|
||||
}
|
||||
|
||||
test_unnamed() async {
|
||||
await assertErrorsInCode('''
|
||||
extension type E(int it) {
|
||||
E.named() : it = 0, super();
|
||||
}
|
||||
''', [
|
||||
error(
|
||||
CompileTimeErrorCode.EXTENSION_TYPE_CONSTRUCTOR_WITH_SUPER_INVOCATION,
|
||||
49,
|
||||
5),
|
||||
]);
|
||||
|
||||
final node = findNode.singleSuperConstructorInvocation;
|
||||
assertResolvedNodeText(node, r'''
|
||||
SuperConstructorInvocation
|
||||
superKeyword: super
|
||||
argumentList: ArgumentList
|
||||
leftParenthesis: (
|
||||
rightParenthesis: )
|
||||
staticElement: <null>
|
||||
''');
|
||||
}
|
||||
}
|
|
@ -238,6 +238,8 @@ import 'extension_override_with_cascade_test.dart'
|
|||
as extension_override_with_cascade;
|
||||
import 'extension_override_without_access_test.dart'
|
||||
as extension_override_without_access;
|
||||
import 'extension_type_constructor_with_super_invocation_test.dart'
|
||||
as extension_type_constructor_with_super_invocation;
|
||||
import 'extension_type_declares_instance_field_test.dart'
|
||||
as extension_type_declares_instance_field;
|
||||
import 'extension_type_declares_member_of_object_test.dart'
|
||||
|
@ -1046,6 +1048,7 @@ main() {
|
|||
extension_override_argument_not_assignable.main();
|
||||
extension_override_with_cascade.main();
|
||||
extension_override_without_access.main();
|
||||
extension_type_constructor_with_super_invocation.main();
|
||||
extension_type_declares_instance_field.main();
|
||||
extension_type_declares_member_of_object.main();
|
||||
extension_type_implements_disallowed_type.main();
|
||||
|
|
Loading…
Reference in a new issue