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