Augment. Report absent / different-kind augmentation target for TypeAliasElement.

Change-Id: I3f9b4cfede135d0f0fd395d79ec37eeb63e844f5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365206
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index bfb11cc..07b71ed 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -2516,6 +2516,11 @@
   @override
   CompilationUnitElement get enclosingElement;
 
+  /// Whether the element is an augmentation.
+  ///
+  /// If `true`, declaration has the explicit `augment` modifier.
+  bool get isAugmentation;
+
   @override
   String get name;
 
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index e397860..b6d15c1 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -544,6 +544,8 @@
         if (element.isAugmentation) return;
       case InstanceElement _:
         if (element.isAugmentation) return;
+      case TypeAliasElement _:
+        if (element.isAugmentation) return;
       case TopLevelVariableElement _:
         if (element.isAugmentation) return;
     }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 916d1d7..473de74 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -985,6 +985,12 @@
   @override
   void visitGenericTypeAlias(covariant GenericTypeAliasImpl node) {
     var element = node.declaredElement as TypeAliasElementImpl;
+
+    _checkAugmentations(
+      augmentKeyword: node.augmentKeyword,
+      element: element,
+    );
+
     _checkForBuiltInIdentifierAsName(
         node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
     _checkForMainFunction1(node.name, node.declaredElement!);
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 8082dbe..57323a9 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -900,7 +900,9 @@
     _linker.elementNodes[element] = node;
 
     var reference = _enclosingContext.addTypeAlias(name, element);
-    _libraryBuilder.declare(name, reference);
+    if (!element.isAugmentation) {
+      _libraryBuilder.declare(name, reference);
+    }
 
     var holder = _EnclosingContext(reference, element);
     _withEnclosing(holder, () {
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_of_different_declaration_kind_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_of_different_declaration_kind_test.dart
index 85b3c37..78355ae2b 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_of_different_declaration_kind_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_of_different_declaration_kind_test.dart
@@ -101,6 +101,23 @@
     ]);
   }
 
+  test_class_augmentedBy_typedef() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+
+class A {}
+''');
+
+    await assertErrorsInCode(r'''
+augment library 'a.dart';
+
+augment typedef A = int;
+''', [
+      error(CompileTimeErrorCode.AUGMENTATION_OF_DIFFERENT_DECLARATION_KIND, 27,
+          7),
+    ]);
+  }
+
   test_class_augmentedBy_variable() async {
     newFile('$testPackageLibPath/a.dart', r'''
 import augment 'test.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_without_declaration_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_without_declaration_test.dart
index 73eb7fe..3dd7a34 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_without_declaration_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_without_declaration_test.dart
@@ -640,4 +640,18 @@
       error(CompileTimeErrorCode.AUGMENTATION_WITHOUT_DECLARATION, 27, 7),
     ]);
   }
+
+  test_typedef() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+import augment 'test.dart';
+''');
+
+    await assertErrorsInCode(r'''
+augment library 'a.dart';
+
+augment typedef A = int;
+''', [
+      error(CompileTimeErrorCode.AUGMENTATION_WITHOUT_DECLARATION, 27, 7),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index f8dcad5..661e942 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -63376,6 +63376,31 @@
 ''');
   }
 
+  test_typeAlias_augments_nothing() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+augment library 'test.dart';
+augment typedef A = int;
+''');
+
+    var library = await buildLibrary(r'''
+import augment 'a.dart';
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  definingUnit
+  augmentationImports
+    package:test/a.dart
+      definingUnit
+        typeAliases
+          augment A @45
+            aliasedType: int
+  exportedReferences
+  exportNamespace
+''');
+  }
+
   test_typeAlias_augments_setter() async {
     newFile('$testPackageLibPath/a.dart', r'''
 augment library 'test.dart';