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';