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();
   }