Augment. Report augmentationWithoutGetterDeclaration or augmentationWithoutSetterDeclaration.
Add diagnostics for augmenting fields and top-level variables when the augmentation induces an accessor that has no corresponding declaration to augment. Report these errors on each variable name rather than on the augment keyword, so multi-variable declarations can report missing augmentation targets independently. Include context pointing to the matching declared or induced accessor when only one side of the getter/setter pair exists. Register the getter- and setter-specific diagnostics in the generated diagnostic tables and correction status metadata. Change-Id: I78393a6e8bffe8748eb0fbc5182a0d01770771d8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/504180 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
committed by
dart-scoped@luci-project-accounts.iam.gserviceaccount.com
parent
86aa98d815
commit
76011f9fe0
@@ -255,6 +255,10 @@ augmentation_type_parameter_name:
|
||||
We could rename the type parameter, this is purely local operation.
|
||||
augmentation_without_declaration:
|
||||
status: noFix
|
||||
augmentation_without_getter_declaration:
|
||||
status: needsEvaluation
|
||||
augmentation_without_setter_declaration:
|
||||
status: needsEvaluation
|
||||
augmented_expression_is_not_setter:
|
||||
status: noFix
|
||||
augmented_expression_is_setter:
|
||||
|
||||
@@ -1035,6 +1035,44 @@ const DiagnosticWithoutArguments augmentationWithoutDeclaration =
|
||||
expectedTypes: [],
|
||||
);
|
||||
|
||||
/// Parameters:
|
||||
/// String name: the name of the getter
|
||||
const DiagnosticWithArguments<
|
||||
LocatableDiagnostic Function({required String name})
|
||||
>
|
||||
augmentationWithoutGetterDeclaration = DiagnosticWithArguments(
|
||||
name: 'augmentation_without_declaration',
|
||||
problemMessage:
|
||||
"This augmentation induces a getter, but no getter declaration named '{0}' "
|
||||
"exists to augment.",
|
||||
correctionMessage:
|
||||
"Try changing the augmentation to match an existing getter "
|
||||
"declaration.",
|
||||
type: DiagnosticType.COMPILE_TIME_ERROR,
|
||||
uniqueName: 'augmentation_without_getter_declaration',
|
||||
withArguments: _withArgumentsAugmentationWithoutGetterDeclaration,
|
||||
expectedTypes: [ExpectedType.string],
|
||||
);
|
||||
|
||||
/// Parameters:
|
||||
/// String name: the name of the setter
|
||||
const DiagnosticWithArguments<
|
||||
LocatableDiagnostic Function({required String name})
|
||||
>
|
||||
augmentationWithoutSetterDeclaration = DiagnosticWithArguments(
|
||||
name: 'augmentation_without_declaration',
|
||||
problemMessage:
|
||||
"This augmentation induces a setter, but no setter declaration named '{0}' "
|
||||
"exists to augment.",
|
||||
correctionMessage:
|
||||
"Try changing the augmentation to match an existing setter "
|
||||
"declaration.",
|
||||
type: DiagnosticType.COMPILE_TIME_ERROR,
|
||||
uniqueName: 'augmentation_without_setter_declaration',
|
||||
withArguments: _withArgumentsAugmentationWithoutSetterDeclaration,
|
||||
expectedTypes: [ExpectedType.string],
|
||||
);
|
||||
|
||||
/// No parameters.
|
||||
const DiagnosticWithoutArguments
|
||||
augmentedExpressionIsNotSetter = DiagnosticWithoutArgumentsImpl(
|
||||
@@ -18411,6 +18449,22 @@ LocatableDiagnostic _withArgumentsAugmentationReturnTypeMismatch({
|
||||
]);
|
||||
}
|
||||
|
||||
LocatableDiagnostic _withArgumentsAugmentationWithoutGetterDeclaration({
|
||||
required String name,
|
||||
}) {
|
||||
return LocatableDiagnosticImpl(diag.augmentationWithoutGetterDeclaration, [
|
||||
name,
|
||||
]);
|
||||
}
|
||||
|
||||
LocatableDiagnostic _withArgumentsAugmentationWithoutSetterDeclaration({
|
||||
required String name,
|
||||
}) {
|
||||
return LocatableDiagnosticImpl(diag.augmentationWithoutSetterDeclaration, [
|
||||
name,
|
||||
]);
|
||||
}
|
||||
|
||||
LocatableDiagnostic _withArgumentsAugmentedExpressionNotOperator({
|
||||
required String operator,
|
||||
}) {
|
||||
|
||||
@@ -79,6 +79,8 @@ const List<DiagnosticCode> diagnosticCodeValues = [
|
||||
diag.augmentationTypeParameterCount,
|
||||
diag.augmentationTypeParameterName,
|
||||
diag.augmentationWithoutDeclaration,
|
||||
diag.augmentationWithoutGetterDeclaration,
|
||||
diag.augmentationWithoutSetterDeclaration,
|
||||
diag.augmentedExpressionIsNotSetter,
|
||||
diag.augmentedExpressionIsSetter,
|
||||
diag.augmentedExpressionNotOperator,
|
||||
|
||||
@@ -1034,10 +1034,14 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
|
||||
|
||||
@override
|
||||
void visitFieldDeclaration(covariant FieldDeclarationImpl node) {
|
||||
if (node.augmentKeyword case var augmentKeyword?) {
|
||||
if (node.augmentKeyword != null) {
|
||||
for (var variable in node.fields.variables) {
|
||||
var declaredFragment = variable.declaredFragment!;
|
||||
_checkAugmentationWithoutDeclaration(augmentKeyword, declaredFragment);
|
||||
var declaredFragment = variable.declaredFragment! as FieldFragmentImpl;
|
||||
_checkAugmentationWithoutDeclaration(variable.name, declaredFragment);
|
||||
_checkAugmentationWithoutDeclarationForInducedAccessors(
|
||||
variable.name,
|
||||
declaredFragment,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1993,10 +1997,15 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
|
||||
) {
|
||||
var variableList = node.variables;
|
||||
|
||||
if (node.augmentKeyword case var augmentKeyword?) {
|
||||
if (node.augmentKeyword != null) {
|
||||
for (var variable in variableList.variables) {
|
||||
var declaredFragment = variable.declaredFragment!;
|
||||
_checkAugmentationWithoutDeclaration(augmentKeyword, declaredFragment);
|
||||
var declaredFragment =
|
||||
variable.declaredFragment! as TopLevelVariableFragmentImpl;
|
||||
_checkAugmentationWithoutDeclaration(variable.name, declaredFragment);
|
||||
_checkAugmentationWithoutDeclarationForInducedAccessors(
|
||||
variable.name,
|
||||
declaredFragment,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2125,10 +2134,10 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
|
||||
}
|
||||
|
||||
void _checkAugmentationWithoutDeclaration(
|
||||
Token? augmentKeyword,
|
||||
Token? errorToken,
|
||||
FragmentImpl fragment,
|
||||
) {
|
||||
if (augmentKeyword != null) {
|
||||
if (errorToken != null) {
|
||||
if (fragment.previousFragment == null) {
|
||||
var element = fragment.element;
|
||||
var previousFragmentOfDifferentKind =
|
||||
@@ -2142,7 +2151,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
|
||||
"The declaration being augmented.",
|
||||
),
|
||||
])
|
||||
.at(augmentKeyword),
|
||||
.at(errorToken),
|
||||
);
|
||||
case FragmentImpl previousFragment:
|
||||
var previousElement = previousFragment.element;
|
||||
@@ -2157,17 +2166,71 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
|
||||
"The declaration being augmented.",
|
||||
),
|
||||
])
|
||||
.at(augmentKeyword),
|
||||
.at(errorToken),
|
||||
);
|
||||
case null:
|
||||
diagnosticReporter.report(
|
||||
diag.augmentationWithoutDeclaration.at(augmentKeyword),
|
||||
diag.augmentationWithoutDeclaration.at(errorToken),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _checkAugmentationWithoutDeclarationForInducedAccessors(
|
||||
Token variableName,
|
||||
PropertyInducingFragmentImpl fragment,
|
||||
) {
|
||||
var previousFragment = fragment.previousFragment;
|
||||
|
||||
// Already reported by `_checkAugmentationWithoutDeclaration`.
|
||||
if (previousFragment == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (fragment.inducedGetter case var inducedGetter?) {
|
||||
if (inducedGetter.previousFragment == null) {
|
||||
var setterFragment =
|
||||
fragment.inducedSetter?.previousFragment ??
|
||||
fragment.element.setter?.lastFragment;
|
||||
var contextMessage =
|
||||
setterFragment?.contextMessageAt(
|
||||
"The corresponding setter is declared here.",
|
||||
) ??
|
||||
previousFragment.contextMessageAt(
|
||||
"The corresponding setter is induced by this declaration.",
|
||||
);
|
||||
diagnosticReporter.report(
|
||||
diag.augmentationWithoutGetterDeclaration
|
||||
.withArguments(name: variableName.lexeme)
|
||||
.withContextMessages([?contextMessage])
|
||||
.at(variableName),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (fragment.inducedSetter case var inducedSetter?) {
|
||||
if (inducedSetter.previousFragment == null) {
|
||||
var getterFragment =
|
||||
fragment.inducedGetter?.previousFragment ??
|
||||
fragment.element.getter?.lastFragment;
|
||||
var contextMessage =
|
||||
getterFragment?.contextMessageAt(
|
||||
"The corresponding getter is declared here.",
|
||||
) ??
|
||||
previousFragment.contextMessageAt(
|
||||
"The corresponding getter is induced by this declaration.",
|
||||
);
|
||||
diagnosticReporter.report(
|
||||
diag.augmentationWithoutSetterDeclaration
|
||||
.withArguments(name: variableName.lexeme)
|
||||
.withContextMessages([?contextMessage])
|
||||
.at(variableName),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Checks the class for problems with the superclass, mixins, or implemented
|
||||
/// interfaces.
|
||||
///
|
||||
|
||||
@@ -1869,6 +1869,24 @@ CompileTimeErrorCode:
|
||||
problemMessage: The declaration being augmented doesn't exist.
|
||||
correctionMessage: Try changing the augmentation to match an existing declaration.
|
||||
hasPublishedDocs: false
|
||||
augmentationWithoutGetterDeclaration:
|
||||
type: compileTimeError
|
||||
parameters:
|
||||
String name: the name of the getter
|
||||
sharedName: augmentationWithoutDeclaration
|
||||
experiment: augmentations
|
||||
problemMessage: "This augmentation induces a getter, but no getter declaration named '#name' exists to augment."
|
||||
correctionMessage: Try changing the augmentation to match an existing getter declaration.
|
||||
hasPublishedDocs: false
|
||||
augmentationWithoutSetterDeclaration:
|
||||
type: compileTimeError
|
||||
parameters:
|
||||
String name: the name of the setter
|
||||
sharedName: augmentationWithoutDeclaration
|
||||
experiment: augmentations
|
||||
problemMessage: "This augmentation induces a setter, but no setter declaration named '#name' exists to augment."
|
||||
correctionMessage: Try changing the augmentation to match an existing setter declaration.
|
||||
hasPublishedDocs: false
|
||||
augmentationOfMixinApplicationClass:
|
||||
type: compileTimeError
|
||||
parameters: none
|
||||
|
||||
+7
-5
@@ -158,7 +158,7 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a field.
|
||||
}
|
||||
''');
|
||||
@@ -281,7 +281,7 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a constructor with a field.
|
||||
}
|
||||
''');
|
||||
@@ -296,7 +296,7 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a field.
|
||||
}
|
||||
''');
|
||||
@@ -528,7 +528,8 @@ class A {}
|
||||
// ^
|
||||
// [context 1] The declaration being augmented.
|
||||
augment int A = 0;
|
||||
// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a class with a top level variable.
|
||||
// ^
|
||||
// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a class with a top level variable.
|
||||
''');
|
||||
}
|
||||
|
||||
@@ -538,7 +539,8 @@ void foo() {}
|
||||
// ^^^
|
||||
// [context 1] The declaration being augmented.
|
||||
augment int foo = 0;
|
||||
// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a function with a top level variable.
|
||||
// ^^^
|
||||
// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a function with a top level variable.
|
||||
''');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ class A {}
|
||||
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
@@ -91,7 +91,7 @@ class A {
|
||||
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
@@ -109,6 +109,54 @@ augment class A {
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_instanceField_augments_instanceField_final() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
final int foo = 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is induced by this declaration.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_instanceField_augments_instanceGetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_instanceField_augments_instanceSetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_instanceField_augments_staticField() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
@@ -116,7 +164,7 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
@@ -129,7 +177,7 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
@@ -142,7 +190,7 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
@@ -155,12 +203,52 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_instanceField_final_augments_instanceField_final() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
final int foo = 0;
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment final int foo = 1;
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_instanceField_final_augments_instanceGetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
int get foo => 0;
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment final int foo = 1;
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_instanceField_final_augments_instanceSetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment final int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_instanceGetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {}
|
||||
@@ -413,7 +501,7 @@ class A {}
|
||||
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
@@ -426,9 +514,8 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
//^^^^^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
|
||||
}
|
||||
''');
|
||||
@@ -441,9 +528,8 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
//^^^^^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
|
||||
}
|
||||
''');
|
||||
@@ -456,9 +542,8 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
//^^^^^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
|
||||
}
|
||||
''');
|
||||
@@ -471,14 +556,113 @@ class A {
|
||||
}
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
//^^^^^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_staticField_augments_staticField() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static int foo = 0;
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static int foo = 1;
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_staticField_augments_staticField_final() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static final int foo = 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is induced by this declaration.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_staticField_augments_staticGetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_staticField_augments_staticSetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_staticField_final_augments_staticField_final() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static final int foo = 0;
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static final int foo = 1;
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_staticField_final_augments_staticGetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static int get foo => 0;
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static final int foo = 1;
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_staticField_final_augments_staticSetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static final int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
test_class_staticGetter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {}
|
||||
@@ -728,7 +912,7 @@ enum A {
|
||||
|
||||
augment enum A {;
|
||||
augment final int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
@@ -890,7 +1074,7 @@ mixin A {}
|
||||
|
||||
augment mixin A {
|
||||
augment int foo = 0;
|
||||
//^^^^^^^
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
}
|
||||
''');
|
||||
@@ -973,10 +1157,93 @@ augment set foo(int _) {}
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_augments_getter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
|
||||
augment int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_augments_setter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
|
||||
augment int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_augments_variable() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
int foo = 0;
|
||||
|
||||
augment int foo = 1;
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_augments_variable_final() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
final int foo = 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is induced by this declaration.
|
||||
|
||||
augment int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_final_augments_getter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
int get foo => 0;
|
||||
|
||||
augment final int foo = 1;
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_final_augments_setter() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
|
||||
augment final int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_final_augments_variable_final() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
final int foo = 0;
|
||||
|
||||
augment final int foo = 1;
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_multiple() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
augment int foo = 0, bar = 0;
|
||||
// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
''');
|
||||
}
|
||||
|
||||
@@ -985,22 +1252,8 @@ augment int foo = 0, bar = 0;
|
||||
int bar = 0;
|
||||
|
||||
augment int foo = 1, bar = 2;
|
||||
// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_single() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
augment int foo = 0;
|
||||
// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
|
||||
''');
|
||||
}
|
||||
|
||||
test_topLevel_variable_single_augments_variable() async {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
int foo = 0;
|
||||
|
||||
augment int foo = 1;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
|
||||
''');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,10 +156,14 @@ class C {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
abstract class C {
|
||||
int get foo;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment abstract class C {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -457,10 +461,14 @@ class A(var int _, var int _);
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
abstract class C {
|
||||
void set foo(int _);
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment abstract class C {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -673,10 +681,14 @@ class C {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -815,10 +827,14 @@ class C {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
class A {
|
||||
static void set foo(_) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment class A {
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -1208,10 +1224,14 @@ enum E(final int _, final int _) {
|
||||
enum E {
|
||||
v;
|
||||
void set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment enum E {;
|
||||
augment final int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -1403,10 +1423,14 @@ enum E {
|
||||
enum E {
|
||||
v;
|
||||
static int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment enum E {;
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -1556,10 +1580,14 @@ enum E {
|
||||
enum E {
|
||||
v;
|
||||
static void set foo(_) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment enum E {;
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -1671,11 +1699,14 @@ extension E on A {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
extension E on int {
|
||||
int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment extension E {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
// [diag.extensionDeclaresInstanceField] Extensions can't declare instance fields.
|
||||
}
|
||||
''');
|
||||
@@ -1821,11 +1852,14 @@ extension E on A {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
extension E on int {
|
||||
void set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment extension E {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
// [diag.extensionDeclaresInstanceField] Extensions can't declare instance fields.
|
||||
}
|
||||
''');
|
||||
@@ -1967,10 +2001,14 @@ extension E on A {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
extension E on int {
|
||||
static int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment extension E {
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -2115,10 +2153,14 @@ extension E on A {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
extension E on int {
|
||||
static void set foo(_) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment extension E {
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -2207,11 +2249,14 @@ class DuplicateDefinitionExtensionTypeTest extends PubPackageResolutionTest {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
extension type E(int it) {
|
||||
int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment extension type E(int it) {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
// [diag.extensionTypeDeclaresInstanceField] Extension types can't declare instance fields.
|
||||
}
|
||||
''');
|
||||
@@ -2327,11 +2372,14 @@ extension type E(int it) {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
extension type E(int it) {
|
||||
void set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment extension type E(int it) {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
// [diag.extensionTypeDeclaresInstanceField] Extension types can't declare instance fields.
|
||||
}
|
||||
''');
|
||||
@@ -2437,10 +2485,14 @@ extension type E(int it) {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
extension type E(int it) {
|
||||
static int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment extension type E(int it) {
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -2523,10 +2575,14 @@ extension type E(int it) {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
extension type E(int it) {
|
||||
static void set foo(_) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment extension type E(int it) {
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -2645,10 +2701,14 @@ mixin M {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
mixin M {
|
||||
int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment mixin M {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -2759,10 +2819,14 @@ mixin M {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
mixin M {
|
||||
void set foo(int _) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment mixin M {
|
||||
augment int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -2867,10 +2931,14 @@ mixin M {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
mixin M {
|
||||
static int get foo => 0;
|
||||
// ^^^
|
||||
// [context 1] The corresponding getter is declared here.
|
||||
}
|
||||
|
||||
augment mixin M {
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutSetterDeclaration][context 1] This augmentation induces a setter, but no setter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
@@ -2953,10 +3021,14 @@ mixin M {
|
||||
await resolveTestCodeWithDiagnostics(r'''
|
||||
mixin M {
|
||||
static void set foo(_) {}
|
||||
// ^^^
|
||||
// [context 1] The corresponding setter is declared here.
|
||||
}
|
||||
|
||||
augment mixin M {
|
||||
augment static int foo = 0;
|
||||
// ^^^
|
||||
// [diag.augmentationWithoutGetterDeclaration][context 1] This augmentation induces a getter, but no getter declaration named 'foo' exists to augment.
|
||||
}
|
||||
''');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user