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