diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart index d67bc4c02fe..4b16bfca969 100644 --- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart +++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart @@ -9,7 +9,9 @@ import 'package:analyzer/dart/ast/token.dart'; import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/exception/exception.dart'; +import 'package:analyzer/src/dart/element/builder.dart'; import 'package:analyzer/src/dart/element/element.dart'; +import 'package:analyzer/src/generated/resolver.dart'; /** * A visitor that resolves declarations in an AST structure to already built @@ -50,6 +52,17 @@ class DeclarationResolver extends RecursiveAstVisitor { } } + @override + Object visitAnnotation(Annotation node) { + // Annotations can only contain elements in certain erroneous situations, + // in which case the elements are disconnected from the rest of the element + // model, thus we can't reconnect to them. To avoid crashes, just create + // fresh elements. + ElementHolder elementHolder = new ElementHolder(); + new ElementBuilder(elementHolder, _enclosingUnit).visitAnnotation(node); + return null; + } + @override Object visitCatchClause(CatchClause node) { SimpleIdentifier exceptionParameter = node.exceptionParameter; diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart index a3d979ea006..4c3ecb872dc 100644 --- a/pkg/analyzer/test/src/context/context_test.dart +++ b/pkg/analyzer/test/src/context/context_test.dart @@ -2438,6 +2438,11 @@ typedef String FunctionTypeAlias(int i); enum EnumeratedType {Invalid, Valid} +class A { + const A(x); +} + +@A(const [(_) => null]) class ClassOne { int instanceField; static int staticField;