Resolve metadata on directives.
R=brianwilkerson@google.com
Change-Id: If462d705e7dad38fa1242d90235957d9c60edb81
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97688
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index fd5b796..a32a6e6 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -6463,7 +6463,7 @@
if (_metadata != null) return _metadata;
CompilationUnitElementImpl enclosingUnit = _definingCompilationUnit;
var context = enclosingUnit.linkedContext;
- var metadata = context.getMetadataOrEmpty(linkedNode);
+ var metadata = context.getLibraryMetadataOrEmpty(linkedNode);
return _metadata = _buildAnnotations2(enclosingUnit, metadata);
}
if (_metadata == null) {
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 25c0290..adcc8a0 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -69,6 +69,20 @@
return parameterList?.formalParameterList_parameters;
}
+ DartType getFormalParameterType(LinkedNode node) {
+ var kind = node.kind;
+ if (kind == LinkedNodeKind.defaultFormalParameter) {
+ return getFormalParameterType(node.defaultFormalParameter_parameter);
+ }
+ if (kind == LinkedNodeKind.fieldFormalParameter) {
+ return getType(node.fieldFormalParameter_type2);
+ }
+ if (kind == LinkedNodeKind.simpleFormalParameter) {
+ return getType(node.simpleFormalParameter_type2);
+ }
+ throw UnimplementedError('$kind');
+ }
+
LinkedNode getImplementsClause(LinkedNode node) {
var kind = node.kind;
if (kind == LinkedNodeKind.classDeclaration) {
@@ -84,6 +98,15 @@
return bundleContext.getInterfaceType(linkedType);
}
+ List<LinkedNode> getLibraryMetadataOrEmpty(LinkedNode unit) {
+ for (var directive in unit.compilationUnit_directives) {
+ if (directive.kind == LinkedNodeKind.libraryDirective) {
+ return getMetadataOrEmpty(directive);
+ }
+ }
+ return const <LinkedNode>[];
+ }
+
List<LinkedNode> getMetadataOrEmpty(LinkedNode node) {
var kind = node.kind;
if (kind == LinkedNodeKind.classDeclaration ||
@@ -91,10 +114,15 @@
kind == LinkedNodeKind.constructorDeclaration ||
kind == LinkedNodeKind.enumConstantDeclaration ||
kind == LinkedNodeKind.enumDeclaration ||
+ kind == LinkedNodeKind.exportDirective ||
kind == LinkedNodeKind.functionDeclaration ||
kind == LinkedNodeKind.functionTypeAlias ||
+ kind == LinkedNodeKind.libraryDirective ||
+ kind == LinkedNodeKind.importDirective ||
kind == LinkedNodeKind.methodDeclaration ||
kind == LinkedNodeKind.mixinDeclaration ||
+ kind == LinkedNodeKind.partDirective ||
+ kind == LinkedNodeKind.partOfDirective ||
kind == LinkedNodeKind.variableDeclaration) {
return node.annotatedNode_metadata;
}
@@ -221,20 +249,6 @@
}
}
- DartType getFormalParameterType(LinkedNode node) {
- var kind = node.kind;
- if (kind == LinkedNodeKind.defaultFormalParameter) {
- return getFormalParameterType(node.defaultFormalParameter_parameter);
- }
- if (kind == LinkedNodeKind.fieldFormalParameter) {
- return getType(node.fieldFormalParameter_type2);
- }
- if (kind == LinkedNodeKind.simpleFormalParameter) {
- return getType(node.simpleFormalParameter_type2);
- }
- throw UnimplementedError('$kind');
- }
-
bool isFinal(LinkedNode node) {
var kind = node.kind;
if (kind == LinkedNodeKind.defaultFormalParameter) {
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index 2030086..f105cf6 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -21,14 +21,16 @@
}
void resolve(UnitBuilder unit) {
+ var unitDirectives = unit.node.compilationUnit_directives;
+ for (var directive in unitDirectives) {
+ _annotatedNode(unit, directive);
+ }
+
var unitDeclarations = unit.node.compilationUnit_declarations;
for (LinkedNodeBuilder unitDeclaration in unitDeclarations) {
var kind = unitDeclaration.kind;
if (_isAnnotatedNode(kind)) {
- _annotatedNode(
- unit,
- unitDeclaration,
- );
+ _annotatedNode(unit, unitDeclaration);
}
if (kind == LinkedNodeKind.classDeclaration) {
_class(unit, unitDeclaration);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index a54e951..3133caf 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -191,13 +191,6 @@
@override
@failingTest
- test_class_alias_with_forwarding_constructors_type_substitution() async {
- await super
- .test_class_alias_with_forwarding_constructors_type_substitution();
- }
-
- @override
- @failingTest
test_class_constructor_field_formal_functionTyped_noReturnType() async {
await super
.test_class_constructor_field_formal_functionTyped_noReturnType();
@@ -1149,12 +1142,6 @@
@override
@failingTest
- test_metadata_exportDirective() async {
- await super.test_metadata_exportDirective();
- }
-
- @override
- @failingTest
test_metadata_fieldFormalParameter() async {
await super.test_metadata_fieldFormalParameter();
}
@@ -1191,12 +1178,6 @@
@override
@failingTest
- test_metadata_libraryDirective() async {
- await super.test_metadata_libraryDirective();
- }
-
- @override
- @failingTest
test_metadata_partDirective() async {
await super.test_metadata_partDirective();
}