Augment. Top-level variable augmentation is not a duplicate declaration.

Change-Id: Ie2cc9b776f891131f6e1778f2ed8c2a66e4a708e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/358321
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index c40c3c2..5ee331f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -204,6 +204,7 @@
   }
 
   void _topLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _addToken(node.augmentKeyword);
     _addToken(node.externalKeyword);
     _addNodeList(node.metadata);
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 01ededc..b7d768d 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -17935,7 +17935,7 @@
 /// directives).
 abstract final class TopLevelVariableDeclaration
     implements CompilationUnitMember {
-  /// The 'augment' keyword.
+  /// The 'augment' keyword, or `null` if the keyword was absent.
   @experimental
   Token? get augmentKeyword;
 
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index cfc9186..c62a269 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -546,6 +546,8 @@
         if (element.isAugmentation) return;
       case InstanceElement _:
         if (element.isAugmentation) return;
+      case TopLevelVariableElement _:
+        if (element.isAugmentation) return;
     }
 
     // Fields define getters and setters, so check them separately.
diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
index 15fc55f..d1378c3 100644
--- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
@@ -1461,6 +1461,22 @@
 ''');
   }
 
+  test_topLevelVariable_augment_add() {
+    _assertNotSameSignature(r'''
+int a = 0;
+''', r'''
+augment int a = 0;
+''');
+  }
+
+  test_topLevelVariable_augment_remove() {
+    _assertNotSameSignature(r'''
+augment int a = 0;
+''', r'''
+int a = 0;
+''');
+  }
+
   test_topLevelVariable_final_add() {
     _assertNotSameSignature(r'''
 int a = 0;
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
index 366c68a..b39cc2e 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
@@ -2292,4 +2292,47 @@
           contextMessages: [message(testFile, 8, 1)]),
     ]);
   }
+
+  test_variable_variable_augment() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+library augment 'test.dart';
+
+augment int foo = 42;
+''');
+
+    newFile(testFile.path, r'''
+import augment 'a.dart';
+
+int foo = 0;
+''');
+
+    await resolveTestFile();
+    assertNoErrorsInResult();
+
+    await resolveFile2(a);
+    assertNoErrorsInResult();
+  }
+
+  test_variable_variable_inAugmentation() async {
+    final a = newFile('$testPackageLibPath/a.dart', r'''
+library augment 'test.dart';
+
+int foo = 42;
+''');
+
+    newFile(testFile.path, r'''
+import augment 'a.dart';
+
+int foo = 0;
+''');
+
+    await resolveTestFile();
+    assertNoErrorsInResult();
+
+    await resolveFile2(a);
+    assertErrorsInResult([
+      error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 34, 3,
+          contextMessages: [message(testFile, 30, 3)]),
+    ]);
+  }
 }