Elements. Store MetadataImpl in ElementDirectiveImpl.

Change-Id: Id2fcb0a343f69a92762bba350f715730e3e1e499
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432321
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 044807ec..918f1ff 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2004,18 +2004,14 @@
   @override
   final DirectiveUri uri;
 
-  List<ElementAnnotationImpl> annotations = [];
+  @override
+  MetadataImpl metadata = MetadataImpl(const []);
 
   ElementDirectiveImpl({required this.uri});
 
   @override
   Null get documentationComment => null;
 
-  @override
-  MetadataImpl get metadata {
-    return MetadataImpl(annotations);
-  }
-
   @Deprecated('Use metadata instead')
   @override
   MetadataImpl get metadata2 => metadata;
@@ -7480,6 +7476,10 @@
     return false;
   }
 
+  void resetCache() {
+    _metadataFlags2 = 0;
+  }
+
   /// Return flags that denote presence of a few specific annotations.
   int _getMetadataFlags() {
     var result = _metadataFlags2;
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 91c723b..2af7602 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -174,7 +174,7 @@
   @override
   void _read(element, reader) {
     for (var import in element.libraryImports) {
-      import.annotations = reader._readAnnotationList(unitElement: unitElement);
+      import.metadata = reader._readMetadata(unitElement: unitElement);
       var uri = import.uri;
       if (uri is DirectiveUriWithLibraryImpl) {
         uri.library2 = reader.libraryOfUri(uri.source.uri);
@@ -182,7 +182,7 @@
     }
 
     for (var export in element.libraryExports) {
-      export.annotations = reader._readAnnotationList(unitElement: unitElement);
+      export.metadata = reader._readMetadata(unitElement: unitElement);
       var uri = export.uri;
       if (uri is DirectiveUriWithLibraryImpl) {
         uri.library2 = reader.libraryOfUri(uri.source.uri);
@@ -190,7 +190,7 @@
     }
 
     for (var part in element.parts) {
-      part.annotations = reader._readAnnotationList(unitElement: unitElement);
+      part.metadata = reader._readMetadata(unitElement: unitElement);
     }
 
     applyConstantOffsets?.perform();
@@ -2261,17 +2261,6 @@
     return type;
   }
 
-  List<ElementAnnotationImpl> _readAnnotationList({
-    required LibraryFragmentImpl unitElement,
-  }) {
-    return readTypedList(() {
-      var ast = _readRequiredNode() as AnnotationImpl;
-      return ElementAnnotationImpl(unitElement)
-        ..annotationAst = ast
-        ..element2 = ast.element2;
-    });
-  }
-
   List<FormalParameterFragmentImpl> _readFormalParameters(
     LibraryFragmentImpl? unitElement,
   ) {
@@ -2378,7 +2367,13 @@
   }
 
   MetadataImpl _readMetadata({required LibraryFragmentImpl unitElement}) {
-    var annotations = _readAnnotationList(unitElement: unitElement);
+    var annotations = readTypedList(() {
+      var ast = _readRequiredNode() as AnnotationImpl;
+      return ElementAnnotationImpl(unitElement)
+        ..annotationAst = ast
+        ..element2 = ast.element2;
+    });
+
     return MetadataImpl(annotations);
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index de7a542..f56fc5a 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -110,7 +110,7 @@
 
     // Write resolution data for the library.
     _sink.writeUInt30(_resolutionSink.offset);
-    _resolutionSink._writeAnnotationList(libraryElement.metadata.annotations);
+    _resolutionSink._writeMetadata(libraryElement.metadata);
     _resolutionSink.writeElement(libraryElement.entryPoint2);
     _writeFieldNameNonPromotabilityInfo(
       libraryElement.fieldNameNonPromotabilityInfo,
@@ -387,13 +387,13 @@
   }
 
   void _writeLibraryExport(LibraryExportImpl element) {
-    _resolutionSink._writeAnnotationList(element.annotations);
+    _resolutionSink._writeMetadata(element.metadata);
     _sink.writeList(element.combinators, _writeNamespaceCombinator);
     _writeDirectiveUri(element.uri);
   }
 
   void _writeLibraryImport(LibraryImportImpl element) {
-    _resolutionSink._writeAnnotationList(element.annotations);
+    _resolutionSink._writeMetadata(element.metadata);
     _sink.writeBool(element.isSynthetic);
     _sink.writeList(element.combinators, _writeNamespaceCombinator);
     _writeLibraryImportPrefixFragment(element.prefix2);
@@ -521,7 +521,7 @@
   /// sequentially.
   void _writePartElementsMetadata(LibraryFragmentImpl unitElement) {
     for (var element in unitElement.parts) {
-      _resolutionSink._writeAnnotationList(element.annotations);
+      _resolutionSink._writeMetadata(element.metadata);
     }
   }
 
@@ -859,14 +859,6 @@
     }
   }
 
-  void _writeAnnotationList(List<ElementAnnotation> annotations) {
-    writeUInt30(annotations.length);
-    for (var annotation in annotations) {
-      annotation as ElementAnnotationImpl;
-      _writeNode(annotation.annotationAst);
-    }
-  }
-
   void _writeElement(Element? element) {
     switch (element) {
       case null:
@@ -951,7 +943,9 @@
   }
 
   void _writeMetadata(MetadataImpl metadata) {
-    _writeAnnotationList(metadata.annotations);
+    writeList(metadata.annotations, (annotation) {
+      _writeNode(annotation.annotationAst);
+    });
   }
 
   void _writeNode(AstNode node) {
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 6b52dc5..b296cba 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -512,7 +512,7 @@
   void visitExportDirective(covariant ExportDirectiveImpl node) {
     var index = _exportDirectiveIndex++;
     var exportElement = _unitElement.libraryExports[index];
-    exportElement.annotations = _buildAnnotations(node.metadata);
+    exportElement.metadata = _buildMetadata(node.metadata);
     node.libraryExport = exportElement;
   }
 
@@ -1177,7 +1177,7 @@
   void visitImportDirective(covariant ImportDirectiveImpl node) {
     var index = _importDirectiveIndex++;
     var importElement = _unitElement.libraryImports[index];
-    importElement.annotations = _buildAnnotations(node.metadata);
+    importElement.metadata = _buildMetadata(node.metadata);
     node.libraryImport = importElement;
   }
 
@@ -1370,7 +1370,7 @@
   void visitPartDirective(covariant PartDirectiveImpl node) {
     var index = _partDirectiveIndex++;
     var partElement = _unitElement.parts[index];
-    partElement.annotations = _buildAnnotations(node.metadata);
+    partElement.metadata = _buildMetadata(node.metadata);
     node.partInclude = partElement;
   }
 
@@ -1652,10 +1652,6 @@
     node.mixinTypes.accept(this);
   }
 
-  List<ElementAnnotationImpl> _buildAnnotations(List<Annotation> nodeList) {
-    return _buildAnnotationsWithUnit(_unitElement, nodeList);
-  }
-
   void _buildExecutableElementChildren({
     required Reference reference,
     required ExecutableFragmentImpl fragment,
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index f8c3d11..4341d08 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -97,6 +97,11 @@
   @override
   void visitExportDirective(covariant ExportDirectiveImpl node) {
     node.metadata.accept(this);
+
+    // We access export directive metadata while building scopes.
+    // But for the current library cycle the metadata was not resolved yet.
+    // Now that we resolved it, reset the cache.
+    node.libraryExport!.metadata.resetCache();
   }
 
   @override