diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 0cef5e5..cb2de85 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -140,7 +140,10 @@
   DartType get _dynamicType => _typeProvider.dynamicType;
 
   @override
-  void visitAnnotation(Annotation node) {
+  void visitAnnotation(covariant AnnotationImpl node) {
+    if (_elementWalker == null) {
+      _createElementAnnotation(node);
+    }
     _withElementWalker(null, () {
       super.visitAnnotation(node);
     });
@@ -220,8 +223,7 @@
     node.name.staticElement = element;
     _namedTypeResolver.enclosingClass = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementWalker(ElementWalker.forClass(element), () {
       _withNameScope(() {
@@ -256,8 +258,7 @@
     node.name.staticElement = element;
     _namedTypeResolver.enclosingClass = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementWalker(ElementWalker.forClass(element), () {
       _withNameScope(() {
@@ -284,8 +285,7 @@
     (node as ConstructorDeclarationImpl).declaredElement = element;
     node.name?.staticElement = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementHolder(ElementHolder(element), () {
       _withElementWalker(null, () {
@@ -392,8 +392,7 @@
     var element = _elementWalker!.getVariable();
     node.name.staticElement = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     var arguments = node.arguments;
     if (arguments != null) {
@@ -411,8 +410,7 @@
     node.name.staticElement = element;
     _namedTypeResolver.enclosingClass = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementWalker(ElementWalker.forClass(element), () {
       _withNameScope(() {
@@ -434,11 +432,13 @@
 
   @override
   void visitExportDirective(ExportDirective node) {
+    var element = node.element;
+    if (element is ExportElementImpl) {
+      _setOrCreateMetadataElements(element, node.metadata);
+    }
+
     _withElementWalker(null, () {
       super.visitExportDirective(node);
-      if (node.element != null) {
-        _setElementAnnotations(node.metadata, node.element!.metadata);
-      }
     });
   }
 
@@ -448,8 +448,7 @@
     (node as ExtensionDeclarationImpl).declaredElement = element;
     node.name?.staticElement = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementWalker(ElementWalker.forExtension(element), () {
       _withNameScope(() {
@@ -465,14 +464,6 @@
   }
 
   @override
-  void visitFieldDeclaration(FieldDeclaration node) {
-    super.visitFieldDeclaration(node);
-    var firstFieldElement =
-        node.fields.variables[0].declaredElement as FieldElement;
-    _setElementAnnotations(node.metadata, firstFieldElement.metadata);
-  }
-
-  @override
   void visitFieldFormalParameter(covariant FieldFormalParameterImpl node) {
     FieldFormalParameterElementImpl element;
     if (node.parent is DefaultFormalParameter) {
@@ -639,8 +630,7 @@
     var element = _elementWalker!.getTypedef();
     node.name.staticElement = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementWalker(ElementWalker.forTypedef(element), () {
       _withNameScope(() {
@@ -754,8 +744,7 @@
     var element = _elementWalker!.getTypedef();
     node.name.staticElement = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementWalker(ElementWalker.forGenericTypeAlias(element), () {
       _withNameScope(() {
@@ -768,11 +757,13 @@
 
   @override
   void visitImportDirective(ImportDirective node) {
+    var element = node.element;
+    if (element is ImportElementImpl) {
+      _setOrCreateMetadataElements(element, node.metadata);
+    }
+
     _withElementWalker(null, () {
       super.visitImportDirective(node);
-      if (node.element != null) {
-        _setElementAnnotations(node.metadata, node.element!.metadata);
-      }
     });
   }
 
@@ -825,18 +816,15 @@
 
   @override
   void visitLibraryDirective(LibraryDirective node) {
-    super.visitLibraryDirective(node);
     ++_libraryDirectiveIndex;
-    if (node.element != null && _libraryDirectiveIndex == 1) {
-      _setElementAnnotations(node.metadata, node.element!.metadata);
-    } else {
-      for (var annotation in node.metadata) {
-        annotation as AnnotationImpl;
-        var elementAnnotation = ElementAnnotationImpl(_unitElement);
-        elementAnnotation.annotationAst = annotation;
-        annotation.elementAnnotation = elementAnnotation;
-      }
+    var element = node.element;
+    if (element is LibraryElementImpl && _libraryDirectiveIndex == 1) {
+      _setOrCreateMetadataElements(element, node.metadata);
     }
+
+    _withElementWalker(null, () {
+      super.visitLibraryDirective(node);
+    });
   }
 
   @override
@@ -846,8 +834,7 @@
         : _elementWalker!.getFunction();
     node.name.staticElement = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementWalker(ElementWalker.forExecutable(element), () {
       node.metadata.accept(this);
@@ -882,8 +869,7 @@
     var element = _elementWalker!.getMixin();
     node.name.staticElement = element;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     _withElementWalker(ElementWalker.forClass(element), () {
       _withNameScope(() {
@@ -914,18 +900,21 @@
 
   @override
   void visitPartDirective(PartDirective node) {
+    var element = node.element;
+    if (element is CompilationUnitElementImpl) {
+      _setOrCreateMetadataElements(element, node.metadata);
+    }
+
     _withElementWalker(null, () {
       super.visitPartDirective(node);
-      if (node.element != null) {
-        _setElementAnnotations(node.metadata, node.element!.metadata);
-      }
     });
   }
 
   @override
   void visitPartOfDirective(PartOfDirective node) {
-    _createElementAnnotations(node.metadata);
-    super.visitPartOfDirective(node);
+    _withElementWalker(null, () {
+      super.visitPartOfDirective(node);
+    });
   }
 
   @override
@@ -1073,8 +1062,7 @@
   void visitTypeParameter(TypeParameter node) {
     var element = node.declaredElement as TypeParameterElementImpl;
 
-    node.metadata.accept(this);
-    _setElementAnnotations(node.metadata, element.metadata);
+    _setOrCreateMetadataElements(element, node.metadata);
 
     var boundNode = node.bound;
     if (boundNode != null) {
@@ -1137,7 +1125,7 @@
     for (var i = 0; i < variables.length; i++) {
       var variable = variables[i];
       var element = variable.declaredElement as ElementImpl;
-      _setOrCreateMetadataElements(element, annotations);
+      _setOrCreateMetadataElements(element, annotations, visitNodes: false);
 
       var offset = (i == 0 ? node.parent! : variable).offset;
       var length = variable.end - offset;
@@ -1238,20 +1226,11 @@
     }
   }
 
-  /// For each [Annotation] found in [annotations], create a new
-  /// [ElementAnnotation] object and set the [Annotation] to point to it.
-  List<ElementAnnotation> _createElementAnnotations(
-      List<Annotation> annotations) {
-    if (annotations.isEmpty) {
-      return const <ElementAnnotation>[];
-    }
-    return annotations.map((annotation) {
-      annotation as AnnotationImpl;
-      var elementAnnotation = ElementAnnotationImpl(_unitElement);
-      elementAnnotation.annotationAst = annotation;
-      annotation.elementAnnotation = elementAnnotation;
-      return elementAnnotation;
-    }).toList();
+  /// Create a new [ElementAnnotation] for the [node].
+  void _createElementAnnotation(AnnotationImpl node) {
+    var element = ElementAnnotationImpl(_unitElement);
+    element.annotationAst = node;
+    node.elementAnnotation = element;
   }
 
   void _define(Element element) {
@@ -1388,13 +1367,18 @@
 
   void _setOrCreateMetadataElements(
     ElementImpl element,
-    NodeList<Annotation> annotations,
-  ) {
-    annotations.accept(this);
+    NodeList<Annotation> annotations, {
+    bool visitNodes = true,
+  }) {
+    if (visitNodes) {
+      annotations.accept(this);
+    }
     if (_elementWalker != null) {
       _setElementAnnotations(annotations, element.metadata);
-    } else {
-      element.metadata = _createElementAnnotations(annotations);
+    } else if (annotations.isNotEmpty) {
+      element.metadata = annotations.map((annotation) {
+        return annotation.elementAnnotation!;
+      }).toList();
     }
   }
 
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 650fde4..c20f28d 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -162,7 +162,8 @@
   /// an [IndexError] if there are no more.
   EnumElementImpl getEnum() => _enums![_enumIndex++] as EnumElementImpl;
 
-  ExtensionElement getExtension() => _extensions![_extensionIndex++];
+  ExtensionElementImpl getExtension() =>
+      _extensions![_extensionIndex++] as ExtensionElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is a top level
   /// function, method, or local function; throws an [IndexError] if there are
@@ -172,7 +173,7 @@
 
   /// Returns the next non-synthetic child of [element] which is a mixin; throws
   /// an [IndexError] if there are no more.
-  ClassElement getMixin() => _mixins![_mixinIndex++];
+  ClassElementImpl getMixin() => _mixins![_mixinIndex++] as ClassElementImpl;
 
   /// Returns the next non-synthetic child of [element] which is a parameter;
   /// throws an [IndexError] if there are no more.
diff --git a/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart b/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
index f28cd14..f83f9e7 100644
--- a/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
@@ -16,6 +16,29 @@
 
 @reflectiveTest
 class LocalVariableResolutionTest extends PubPackageResolutionTest {
+  test_annotation_twoVariables() async {
+    await assertNoErrorsInCode(r'''
+const a = 0;
+
+void f() {
+  // ignore:unused_local_variable
+  @a var x = 0, y = 0;
+}
+''');
+
+    var x = findElement.localVar('x');
+    assertElement2(
+      x.metadata.single.element,
+      declaration: findElement.topGet('a'),
+    );
+
+    var y = findElement.localVar('y');
+    assertElement2(
+      y.metadata.single.element,
+      declaration: findElement.topGet('a'),
+    );
+  }
+
   test_demoteTypeParameterType() async {
     await assertNoErrorsInCode('''
 void f<T>(T a, T b) {
diff --git a/tools/VERSION b/tools/VERSION
index 6056e75..5843869 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 233
+PRERELEASE 234
 PRERELEASE_PATCH 0
\ No newline at end of file
