Macro. Return List<ElementAnnotationImpl> from 'ElementImpl.metadata'

So, we can remove casts in a few places.

Change-Id: I3ffa0e081633560f51a72327fd8fdd9e02ac46ac
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/354380
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index ecb2e4d..7370037 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -929,7 +929,7 @@
 
   void _resolveLibraryExportDirective({
     required ExportDirectiveImpl directive,
-    required LibraryExportElement element,
+    required LibraryExportElementImpl element,
     required LibraryExportState state,
     required ErrorReporter errorReporter,
   }) {
@@ -983,7 +983,7 @@
 
   void _resolveLibraryImportDirective({
     required ImportDirectiveImpl directive,
-    required LibraryImportElement element,
+    required LibraryImportElementImpl element,
     required LibraryImportState state,
     required ErrorReporter errorReporter,
   }) {
@@ -1013,7 +1013,7 @@
   void _resolvePartDirective({
     required PartDirectiveImpl directive,
     required PartState partState,
-    required PartElement partElement,
+    required PartElementImpl partElement,
     required ErrorReporter errorReporter,
     required LibraryIdentifier? libraryNameNode,
     required Set<Source> seenPartSources,
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index b575ba9..b4bdb31 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -303,7 +303,7 @@
 
   /// The element annotation representing this annotation in the element model.
   @override
-  ElementAnnotation? elementAnnotation;
+  ElementAnnotationImpl? elementAnnotation;
 
   /// Initialize a newly created annotation. Both the [period] and the
   /// [constructorName] can be `null` if the annotation is not referencing a
@@ -5323,7 +5323,7 @@
 sealed class DirectiveImpl extends AnnotatedNodeImpl implements Directive {
   /// The element associated with this directive, or `null` if the AST structure
   /// has not been resolved or if this directive could not be resolved.
-  Element? _element;
+  ElementImpl? _element;
 
   /// Initialize a newly create directive. Either or both of the [comment] and
   /// [metadata] can be `null` if the directive does not have the corresponding
@@ -5334,10 +5334,10 @@
   });
 
   @override
-  Element? get element => _element;
+  ElementImpl? get element => _element;
 
   /// Set the element associated with this directive to be the given [element].
-  set element(Element? element) {
+  set element(ElementImpl? element) {
     _element = element;
   }
 }
@@ -13805,8 +13805,8 @@
   });
 
   @override
-  PartElement? get element {
-    return super.element as PartElement?;
+  PartElementImpl? get element {
+    return super.element as PartElementImpl?;
   }
 
   @override
@@ -15458,7 +15458,7 @@
   final Token leftParenthesis;
 
   @override
-  final NodeListImpl<Annotation> fieldMetadata = NodeListImpl._();
+  final NodeListImpl<AnnotationImpl> fieldMetadata = NodeListImpl._();
 
   @override
   final TypeAnnotationImpl fieldType;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 216baed..a0cc4a2 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -173,7 +173,7 @@
 
   @override
   // TODO(scheglov): implement metadata
-  List<ElementAnnotation> get metadata => throw UnimplementedError();
+  List<ElementAnnotationImpl> get metadata => throw UnimplementedError();
 }
 
 abstract class AugmentedInterfaceElementImpl
@@ -860,7 +860,7 @@
   ElementKind get kind => ElementKind.COMPILATION_UNIT;
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     linkedData?.read(this);
     return super.metadata;
   }
@@ -1913,7 +1913,7 @@
   int _modifiers = 0;
 
   /// A list containing all of the metadata associated with this element.
-  List<ElementAnnotation> _metadata = const [];
+  List<ElementAnnotationImpl> _metadata = const [];
 
   /// Cached flags denoting presence of specific annotations in [_metadata].
   int _metadataFlags = 0;
@@ -2162,8 +2162,7 @@
     final metadata = this.metadata;
     for (var i = 0; i < metadata.length; i++) {
       var annotation = metadata[i];
-      if (annotation is ElementAnnotationImpl &&
-          annotation.isPragmaVmEntryPoint) {
+      if (annotation.isPragmaVmEntryPoint) {
         return true;
       }
     }
@@ -2340,11 +2339,11 @@
   }
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     return _metadata;
   }
 
-  set metadata(List<ElementAnnotation> metadata) {
+  set metadata(List<ElementAnnotationImpl> metadata) {
     _metadata = metadata;
   }
 
@@ -2804,7 +2803,7 @@
   bool get isSynchronous => !isAsynchronous;
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     linkedData?.read(this);
     return super.metadata;
   }
@@ -2942,7 +2941,7 @@
   ElementKind get kind => ElementKind.EXTENSION;
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     linkedData?.read(this);
     return super.metadata;
   }
@@ -3122,7 +3121,7 @@
   ElementKind get kind => ElementKind.FIELD;
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     linkedData?.read(this);
     return super.metadata;
   }
@@ -3402,7 +3401,7 @@
   }
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     linkedData?.read(this);
     return super.metadata;
   }
@@ -4326,7 +4325,7 @@
   }
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     _readLinkedData();
     return super.metadata;
   }
@@ -5635,7 +5634,9 @@
   ElementLocation? get location => null;
 
   @override
-  List<ElementAnnotation> get metadata => const <ElementAnnotation>[];
+  List<ElementAnnotationImpl> get metadata {
+    return const <ElementAnnotationImpl>[];
+  }
 
   @override
   int get nameLength => 0;
@@ -5843,7 +5844,7 @@
   }
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     return element.metadata;
   }
 
@@ -6319,7 +6320,7 @@
   }
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     linkedData?.read(this);
     return super.metadata;
   }
@@ -6727,7 +6728,7 @@
   ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     linkedData?.read(this);
     return super.metadata;
   }
@@ -6834,7 +6835,7 @@
   }
 
   @override
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotationImpl> get metadata {
     linkedData?.read(this);
     return super.metadata;
   }
diff --git a/pkg/analyzer/lib/src/dart/element/since_sdk_version.dart b/pkg/analyzer/lib/src/dart/element/since_sdk_version.dart
index 2a5f242..576bbaa 100644
--- a/pkg/analyzer/lib/src/dart/element/since_sdk_version.dart
+++ b/pkg/analyzer/lib/src/dart/element/since_sdk_version.dart
@@ -52,7 +52,6 @@
   static Version? _specifiedVersion(ElementImpl element) {
     Version? result;
     for (final annotation in element.metadata) {
-      annotation as ElementAnnotationImpl;
       if (annotation.isDartInternalSince) {
         final arguments = annotation.annotationAst.arguments?.arguments;
         final versionNode = arguments?.singleOrNull;
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 91f306d..5a64bd8 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -201,7 +201,9 @@
   }
 
   @override
-  void visitAugmentationImportDirective(AugmentationImportDirective node) {
+  void visitAugmentationImportDirective(
+    covariant AugmentationImportDirectiveImpl node,
+  ) {
     final element = node.element;
     if (element is AugmentationImportElementImpl) {
       _setOrCreateMetadataElements(element, node.metadata);
@@ -547,7 +549,7 @@
   }
 
   @override
-  void visitExportDirective(ExportDirective node) {
+  void visitExportDirective(covariant ExportDirectiveImpl node) {
     var element = node.element;
     if (element is LibraryExportElementImpl) {
       _setOrCreateMetadataElements(element, node.metadata);
@@ -938,7 +940,7 @@
   }
 
   @override
-  void visitImportDirective(ImportDirective node) {
+  void visitImportDirective(covariant ImportDirectiveImpl node) {
     var element = node.element;
     if (element is LibraryImportElementImpl) {
       _setOrCreateMetadataElements(element, node.metadata);
@@ -1000,7 +1002,9 @@
   }
 
   @override
-  void visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
+  void visitLibraryAugmentationDirective(
+    covariant LibraryAugmentationDirectiveImpl node,
+  ) {
     final element = node.element;
     if (element is LibraryOrAugmentationElementImpl) {
       _setOrCreateMetadataElements(element, node.metadata);
@@ -1012,7 +1016,7 @@
   }
 
   @override
-  void visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(covariant LibraryDirectiveImpl node) {
     ++_libraryDirectiveIndex;
     var element = node.element;
     if (element is LibraryElementImpl && _libraryDirectiveIndex == 1) {
@@ -1117,7 +1121,7 @@
   }
 
   @override
-  void visitPartDirective(PartDirective node) {
+  void visitPartDirective(covariant PartDirectiveImpl node) {
     var element = node.element;
     if (element is PartElementImpl) {
       _setOrCreateMetadataElements(element, node.metadata);
@@ -1374,7 +1378,7 @@
   }
 
   @override
-  void visitTypeParameter(TypeParameter node) {
+  void visitTypeParameter(covariant TypeParameterImpl node) {
     var element = node.declaredElement as TypeParameterElementImpl;
 
     _setOrCreateMetadataElements(element, node.metadata);
@@ -1416,7 +1420,9 @@
   }
 
   @override
-  void visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(
+    covariant VariableDeclarationListImpl node,
+  ) {
     var parent = node.parent;
     if (parent is ForPartsWithDeclarations ||
         parent is VariableDeclarationStatement &&
@@ -1426,10 +1432,10 @@
 
     node.visitChildren(this);
 
-    NodeList<Annotation> annotations;
-    if (parent is FieldDeclaration) {
+    NodeList<AnnotationImpl> annotations;
+    if (parent is FieldDeclarationImpl) {
       annotations = parent.metadata;
-    } else if (parent is TopLevelVariableDeclaration) {
+    } else if (parent is TopLevelVariableDeclarationImpl) {
       annotations = parent.metadata;
     } else {
       // Local variable declaration
@@ -1764,7 +1770,7 @@
 
   void _setOrCreateMetadataElements(
     ElementImpl element,
-    NodeList<Annotation> annotations, {
+    NodeList<AnnotationImpl> annotations, {
     bool visitNodes = true,
   }) {
     if (visitNodes) {
@@ -1888,7 +1894,9 @@
   /// Associate each of the annotation [nodes] with the corresponding
   /// [ElementAnnotation] in [annotations].
   static void _setElementAnnotations(
-      List<Annotation> nodes, List<ElementAnnotation> annotations) {
+    List<AnnotationImpl> nodes,
+    List<ElementAnnotationImpl> annotations,
+  ) {
     int nodeCount = nodes.length;
     if (nodeCount != annotations.length) {
       throw StateError(
@@ -1897,7 +1905,7 @@
       );
     }
     for (int i = 0; i < nodeCount; i++) {
-      (nodes[i] as AnnotationImpl).elementAnnotation = annotations[i];
+      nodes[i].elementAnnotation = annotations[i];
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index c6714aa..4f4a462 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -6373,7 +6373,6 @@
 
   static AnnotationImpl _annotationNode(ElementImpl element, int index) {
     var annotation = element.metadata[index];
-    annotation as ElementAnnotationImpl;
     return annotation.annotationAst;
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 957dd53b..3089f09 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -58,7 +58,7 @@
   }
 
   /// Build exports and imports, metadata into [_container].
-  void buildLibraryElementChildren(CompilationUnit unit) {
+  void buildLibraryElementChildren(CompilationUnitImpl unit) {
     unit.directives.accept(this);
 
     if (_isFirstLibraryDirective) {
@@ -1246,7 +1246,7 @@
     node.mixinTypes.accept(this);
   }
 
-  List<ElementAnnotation> _buildAnnotations(List<Annotation> nodeList) {
+  List<ElementAnnotationImpl> _buildAnnotations(List<Annotation> nodeList) {
     return _buildAnnotationsWithUnit(_unitElement, nodeList);
   }
 
@@ -1465,16 +1465,16 @@
     }
   }
 
-  static List<ElementAnnotation> _buildAnnotationsWithUnit(
+  static List<ElementAnnotationImpl> _buildAnnotationsWithUnit(
     CompilationUnitElementImpl unitElement,
     List<Annotation> nodeList,
   ) {
     var length = nodeList.length;
     if (length == 0) {
-      return const <ElementAnnotation>[];
+      return const <ElementAnnotationImpl>[];
     }
 
-    return List<ElementAnnotation>.generate(length, (index) {
+    return List<ElementAnnotationImpl>.generate(length, (index) {
       var ast = nodeList[index] as AnnotationImpl;
       var element = ElementAnnotationImpl(unitElement);
       element.annotationAst = ast;
diff --git a/pkg/analyzer/lib/src/summary2/macro_merge.dart b/pkg/analyzer/lib/src/summary2/macro_merge.dart
index ef90382..11842f0 100644
--- a/pkg/analyzer/lib/src/summary2/macro_merge.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_merge.dart
@@ -324,7 +324,6 @@
 
     void addElement(ElementImpl element) {
       for (var annotation in element.metadata) {
-        annotation as ElementAnnotationImpl;
         result.add((element, annotation.annotationAst));
       }