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