Index: pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart |
diff --git a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart |
index 8b87629949fc819391227faa702bb83315cd2440..f1b9100628e1ab0a4d52f49639a718c8f8bf63c4 100644 |
--- a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart |
+++ b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart |
@@ -74,6 +74,9 @@ class _DartNavigationCollector { |
} |
void _addRegionForNode(AstNode node, Element element) { |
+ if (node == null) { |
+ return; |
+ } |
int offset = node.offset; |
int length = node.length; |
_addRegion(offset, length, element); |
@@ -92,6 +95,30 @@ class _DartNavigationComputerVisitor extends RecursiveAstVisitor { |
_DartNavigationComputerVisitor(this.computer); |
@override |
+ visitAnnotation(Annotation node) { |
+ Element element = node.element; |
+ if (element is ConstructorElement && element.isSynthetic) { |
+ element = element.enclosingElement; |
+ } |
+ Identifier name = node.name; |
+ if (name is PrefixedIdentifier) { |
+ // use constructor in: @PrefixClass.constructorName |
+ Element prefixElement = name.prefix.staticElement; |
+ if (prefixElement is ClassElement) { |
+ prefixElement = element; |
+ } |
+ computer._addRegionForNode(name.prefix, prefixElement); |
+ // always constructor |
+ computer._addRegionForNode(name.identifier, element); |
+ } else { |
+ computer._addRegionForNode(name, element); |
+ } |
+ computer._addRegionForNode(node.constructorName, element); |
+ // arguments |
+ _safelyVisit(node.arguments); |
+ } |
+ |
+ @override |
visitAssignmentExpression(AssignmentExpression node) { |
_safelyVisit(node.leftHandSide); |
computer._addRegionForToken(node.operator, node.bestElement); |