Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart

Issue 1378713004: Issue 24487. Annotations with constructor resolution should produce navigation reginos to construct… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analysis_server/test/analysis/notification_navigation_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library domains.analysis.navigation_dart; 5 library domains.analysis.navigation_dart;
6 6
7 import 'package:analysis_server/analysis/navigation_core.dart'; 7 import 'package:analysis_server/analysis/navigation_core.dart';
8 import 'package:analysis_server/src/protocol_server.dart' as protocol; 8 import 'package:analysis_server/src/protocol_server.dart' as protocol;
9 import 'package:analyzer/src/generated/ast.dart'; 9 import 'package:analyzer/src/generated/ast.dart';
10 import 'package:analyzer/src/generated/element.dart'; 10 import 'package:analyzer/src/generated/element.dart';
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 collector.addRegion(offset, length, kind, location); 67 collector.addRegion(offset, length, kind, location);
68 } 68 }
69 69
70 void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) { 70 void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
71 int offset = a.offset; 71 int offset = a.offset;
72 int length = b.end - offset; 72 int length = b.end - offset;
73 _addRegion(offset, length, element); 73 _addRegion(offset, length, element);
74 } 74 }
75 75
76 void _addRegionForNode(AstNode node, Element element) { 76 void _addRegionForNode(AstNode node, Element element) {
77 if (node == null) {
78 return;
79 }
77 int offset = node.offset; 80 int offset = node.offset;
78 int length = node.length; 81 int length = node.length;
79 _addRegion(offset, length, element); 82 _addRegion(offset, length, element);
80 } 83 }
81 84
82 void _addRegionForToken(Token token, Element element) { 85 void _addRegionForToken(Token token, Element element) {
83 int offset = token.offset; 86 int offset = token.offset;
84 int length = token.length; 87 int length = token.length;
85 _addRegion(offset, length, element); 88 _addRegion(offset, length, element);
86 } 89 }
87 } 90 }
88 91
89 class _DartNavigationComputerVisitor extends RecursiveAstVisitor { 92 class _DartNavigationComputerVisitor extends RecursiveAstVisitor {
90 final _DartNavigationCollector computer; 93 final _DartNavigationCollector computer;
91 94
92 _DartNavigationComputerVisitor(this.computer); 95 _DartNavigationComputerVisitor(this.computer);
93 96
94 @override 97 @override
98 visitAnnotation(Annotation node) {
99 Element element = node.element;
100 if (element is ConstructorElement && element.isSynthetic) {
101 element = element.enclosingElement;
102 }
103 Identifier name = node.name;
104 if (name is PrefixedIdentifier) {
105 // use constructor in: @PrefixClass.constructorName
106 Element prefixElement = name.prefix.staticElement;
107 if (prefixElement is ClassElement) {
108 prefixElement = element;
109 }
110 computer._addRegionForNode(name.prefix, prefixElement);
111 // always constructor
112 computer._addRegionForNode(name.identifier, element);
113 } else {
114 computer._addRegionForNode(name, element);
115 }
116 computer._addRegionForNode(node.constructorName, element);
117 // arguments
118 _safelyVisit(node.arguments);
119 }
120
121 @override
95 visitAssignmentExpression(AssignmentExpression node) { 122 visitAssignmentExpression(AssignmentExpression node) {
96 _safelyVisit(node.leftHandSide); 123 _safelyVisit(node.leftHandSide);
97 computer._addRegionForToken(node.operator, node.bestElement); 124 computer._addRegionForToken(node.operator, node.bestElement);
98 _safelyVisit(node.rightHandSide); 125 _safelyVisit(node.rightHandSide);
99 } 126 }
100 127
101 @override 128 @override
102 visitBinaryExpression(BinaryExpression node) { 129 visitBinaryExpression(BinaryExpression node) {
103 _safelyVisit(node.leftOperand); 130 _safelyVisit(node.leftOperand);
104 computer._addRegionForToken(node.operator, node.bestElement); 131 computer._addRegionForToken(node.operator, node.bestElement);
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 } 327 }
301 // The node starts or ends in the range. 328 // The node starts or ends in the range.
302 if (isInRange(node.offset) || isInRange(node.end)) { 329 if (isInRange(node.offset) || isInRange(node.end)) {
303 node.accept(visitor); 330 node.accept(visitor);
304 return; 331 return;
305 } 332 }
306 // Go deeper. 333 // Go deeper.
307 super.visitNode(node); 334 super.visitNode(node);
308 } 335 }
309 } 336 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/test/analysis/notification_navigation_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698