Version 2.17.0-234.0.dev

Merge commit 'e773e6e713d472b18adbdbfd1d601eb87540fadd' into 'dev'
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