Augment. Report DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION.
Change-Id: Id80d6c2e6c874327c26421349cc4776087e2296f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365661
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
index b3b0f65..cc91a6c 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
@@ -2676,6 +2676,8 @@
status: needsFix
notes: |-
Remove `covariant`.
+ParserErrorCode.DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION:
+ status: noFix
ParserErrorCode.DEFAULT_IN_SWITCH_EXPRESSION:
status: hasFix
ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE:
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index 2c4dd38..6000393 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -469,6 +469,14 @@
correctionMessage: "Try removing the keyword 'covariant'.",
);
+ static const ParserErrorCode DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION =
+ ParserErrorCode(
+ 'DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION',
+ "The identifier 'augmented' has a special meaning inside augmenting "
+ "declarations.",
+ correctionMessage: "Try using a different name.",
+ );
+
/// No parameters.
static const ParserErrorCode DEFAULT_IN_SWITCH_EXPRESSION = ParserErrorCode(
'DEFAULT_IN_SWITCH_EXPRESSION',
diff --git a/pkg/analyzer/lib/src/error/error_code_values.g.dart b/pkg/analyzer/lib/src/error/error_code_values.g.dart
index d0cafc7..86f63e6 100644
--- a/pkg/analyzer/lib/src/error/error_code_values.g.dart
+++ b/pkg/analyzer/lib/src/error/error_code_values.g.dart
@@ -699,6 +699,7 @@
ParserErrorCode.COVARIANT_CONSTRUCTOR,
ParserErrorCode.COVARIANT_MEMBER,
ParserErrorCode.COVARIANT_TOP_LEVEL_DECLARATION,
+ ParserErrorCode.DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION,
ParserErrorCode.DEFAULT_IN_SWITCH_EXPRESSION,
ParserErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE,
ParserErrorCode.DEFERRED_AFTER_PREFIX,
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 67cb08e..67d7b72 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -4430,12 +4430,19 @@
if (_enclosingDeclarationAugmentToken != null) {
if (token.lexeme == 'augmented') {
- push(
- AugmentedExpressionImpl(
- augmentedKeyword: token,
- ),
- );
- return;
+ if (context.inDeclaration) {
+ errorReporter.errorReporter?.atToken(
+ token,
+ ParserErrorCode.DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION,
+ );
+ } else {
+ push(
+ AugmentedExpressionImpl(
+ augmentedKeyword: token,
+ ),
+ );
+ return;
+ }
}
}
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 66f55d8..d92552d 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -21159,6 +21159,9 @@
COVARIANT_TOP_LEVEL_DECLARATION:
problemMessage: "Top-level declarations can't be declared to be covariant."
correctionMessage: "Try removing the keyword 'covariant'."
+ DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION:
+ problemMessage: "The identifier 'augmented' has a special meaning inside augmenting declarations."
+ correctionMessage: "Try using a different name."
DEFAULT_VALUE_IN_FUNCTION_TYPE:
problemMessage: "Parameters in a function type can't have default values."
correctionMessage: Try removing the default value.
diff --git a/pkg/analyzer/test/src/diagnostics/declaration_named_augmented_inside_augmentation_test.dart b/pkg/analyzer/test/src/diagnostics/declaration_named_augmented_inside_augmentation_test.dart
new file mode 100644
index 0000000..2bc6b7e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/declaration_named_augmented_inside_augmentation_test.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2024, 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:analyzer/src/generated/parser.dart' show ParserErrorCode;
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(DeclarationNamedAugmentedInsideAugmentationTest);
+ });
+}
+
+@reflectiveTest
+class DeclarationNamedAugmentedInsideAugmentationTest
+ extends PubPackageResolutionTest {
+ test_insideClassMethodAugmentation_localVariable_noInitializer() async {
+ newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+
+class A {
+ void f() {}
+}
+''');
+
+ await assertErrorsInCode('''
+augment library 'a.dart';
+
+augment class A {
+ augment void f() {
+ int augmented;
+ }
+}
+''', [
+ error(ParserErrorCode.DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION, 74,
+ 9),
+ error(WarningCode.UNUSED_LOCAL_VARIABLE, 74, 9),
+ ]);
+ }
+
+ test_insideFunctionAugmentation_formalParameter() async {
+ newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+
+void f(int a) {}
+''');
+
+ await assertErrorsInCode('''
+augment library 'a.dart';
+
+augment void f(int augmented) {}
+''', [
+ error(ParserErrorCode.DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION, 46,
+ 9),
+ ]);
+ }
+
+ test_insideFunctionAugmentation_localFunction() async {
+ newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+
+void f() {}
+''');
+
+ await assertErrorsInCode('''
+augment library 'a.dart';
+
+augment void f() {
+ void augmented() {}
+}
+''', [
+ error(ParserErrorCode.DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION, 53,
+ 9),
+ error(WarningCode.UNUSED_ELEMENT, 53, 9),
+ ]);
+ }
+
+ test_insideFunctionAugmentation_localVariable_noInitializer() async {
+ newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+
+void f() {}
+''');
+
+ await assertErrorsInCode('''
+augment library 'a.dart';
+
+augment void f() {
+ int augmented;
+}
+''', [
+ error(ParserErrorCode.DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION, 52,
+ 9),
+ error(WarningCode.UNUSED_LOCAL_VARIABLE, 52, 9),
+ ]);
+ }
+
+ test_insideFunctionAugmentation_localVariable_withInitializer() async {
+ newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+
+void f() {}
+''');
+
+ await assertErrorsInCode('''
+augment library 'a.dart';
+
+augment void f() {
+ var augmented = 0;
+}
+''', [
+ error(ParserErrorCode.DECLARATION_NAMED_AUGMENTED_INSIDE_AUGMENTATION, 52,
+ 9),
+ error(WarningCode.UNUSED_LOCAL_VARIABLE, 52, 9),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 71b224c..223b6b7 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -158,6 +158,8 @@
import 'creation_of_struct_or_union_test.dart' as creation_of_struct_or_union;
import 'dead_code_test.dart' as dead_code;
import 'dead_null_aware_expression_test.dart' as dead_null_aware_expression;
+import 'declaration_named_augmented_inside_augmentation_test.dart'
+ as declaration_named_augmented_inside_augmentation;
import 'default_value_in_function_type_test.dart'
as default_value_in_function_type;
import 'default_value_in_redirecting_factory_constructor_test.dart'
@@ -1021,6 +1023,7 @@
creation_of_struct_or_union.main();
dead_code.main();
dead_null_aware_expression.main();
+ declaration_named_augmented_inside_augmentation.main();
default_value_in_function_type.main();
default_value_in_redirecting_factory_constructor.main();
default_value_on_required_parameter.main();