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();