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

Unified Diff: pkg/analysis_server/lib/src/computer/computer_navigation.dart

Issue 649853004: Issue 21377. Specify that navigation regions are sorted and implement it. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analysis_server/doc/api.html ('k') | pkg/analysis_server/lib/src/generated_protocol.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analysis_server/lib/src/computer/computer_navigation.dart
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index 17f9af55b46ffb33dd1ce2556ea7578f2b575fe3..f761658d34d8b86d0bbc861fcd2315cf02f11b8d 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -40,27 +40,19 @@ class DartUnitNavigationComputer {
_regions.add(new protocol.NavigationRegion(offset, length, [target]));
}
- void _addRegionForNode(AstNode node, Element element) {
- int offset = node.offset;
- int length = node.length;
- _addRegion(offset, length, element);
- }
-
- void _addRegionForToken(Token token, Element element) {
- int offset = token.offset;
- int length = token.length;
- _addRegion(offset, length, element);
- }
-
void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
int offset = a.offset;
int length = b.end - offset;
_addRegion(offset, length, element);
}
- void _addRegion_nodeStart_nodeStart(AstNode a, AstNode b, Element element) {
+ void _addRegion_nodeStart_nodeStart(AstNode a, AstNode b, Element element,
+ {bool excludeLastChar: false}) {
int offset = a.offset;
int length = b.offset - offset;
+ if (excludeLastChar) {
+ length--;
+ }
_addRegion(offset, length, element);
}
@@ -69,6 +61,18 @@ class DartUnitNavigationComputer {
int length = b.end - offset;
_addRegion(offset, length, element);
}
+
+ void _addRegionForNode(AstNode node, Element element) {
+ int offset = node.offset;
+ int length = node.length;
+ _addRegion(offset, length, element);
+ }
+
+ void _addRegionForToken(Token token, Element element) {
+ int offset = token.offset;
+ int length = token.length;
+ _addRegion(offset, length, element);
+ }
}
@@ -79,14 +83,31 @@ class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
@override
visitAssignmentExpression(AssignmentExpression node) {
+ _safelyVisit(node.leftHandSide);
computer._addRegionForToken(node.operator, node.bestElement);
- return super.visitAssignmentExpression(node);
+ _safelyVisit(node.rightHandSide);
}
@override
visitBinaryExpression(BinaryExpression node) {
+ _safelyVisit(node.leftOperand);
computer._addRegionForToken(node.operator, node.bestElement);
- return super.visitBinaryExpression(node);
+ _safelyVisit(node.rightOperand);
+ }
+
+ @override
+ visitCompilationUnit(CompilationUnit unit) {
+ // prepare top-level nodes sorted by their offsets
+ List<AstNode> nodes = <AstNode>[];
+ nodes.addAll(unit.directives);
+ nodes.addAll(unit.declarations);
+ nodes.sort((a, b) {
+ return a.offset - b.offset;
+ });
+ // visit sorted nodes
+ for (AstNode node in nodes) {
+ node.accept(this);
+ }
}
@override
@@ -105,7 +126,7 @@ class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
node.element);
}
}
- return super.visitConstructorDeclaration(node);
+ super.visitConstructorDeclaration(node);
}
@override
@@ -115,7 +136,7 @@ class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
Element element = exportElement.exportedLibrary;
computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
}
- return super.visitExportDirective(node);
+ super.visitExportDirective(node);
}
@override
@@ -125,13 +146,13 @@ class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
Element element = importElement.importedLibrary;
computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
}
- return super.visitImportDirective(node);
+ super.visitImportDirective(node);
}
@override
visitIndexExpression(IndexExpression node) {
+ super.visitIndexExpression(node);
computer._addRegionForToken(node.rightBracket, node.bestElement);
- return super.visitIndexExpression(node);
}
@override
@@ -147,13 +168,14 @@ class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
node.argumentList,
element);
} else {
- // add region for "type" first, so that it is found before "new "
- computer._addRegionForNode(constructorName.type, classElement);
- // "new "
+ // "new ", excluding last character
computer._addRegion_nodeStart_nodeStart(
node,
constructorName.type,
- element);
+ element,
+ excludeLastChar: true);
+ // "ClassName"
+ computer._addRegionForNode(constructorName.type, classElement);
// optional ".name"
if (constructorName.period != null) {
computer._addRegion_tokenStart_nodeEnd(
@@ -163,7 +185,7 @@ class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
}
}
}
- return super.visitInstanceCreationExpression(node);
+ _safelyVisit(node.argumentList);
}
@override
@@ -172,7 +194,7 @@ class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
node.keyword,
node.uri,
node.element);
- return super.visitPartDirective(node);
+ super.visitPartDirective(node);
}
@override
@@ -181,27 +203,33 @@ class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
node.keyword,
node.libraryName,
node.element);
- return super.visitPartOfDirective(node);
+ super.visitPartOfDirective(node);
}
@override
visitPostfixExpression(PostfixExpression node) {
+ super.visitPostfixExpression(node);
computer._addRegionForToken(node.operator, node.bestElement);
- return super.visitPostfixExpression(node);
}
@override
visitPrefixExpression(PrefixExpression node) {
computer._addRegionForToken(node.operator, node.bestElement);
- return super.visitPrefixExpression(node);
+ super.visitPrefixExpression(node);
}
@override
visitSimpleIdentifier(SimpleIdentifier node) {
if (node.parent is ConstructorDeclaration) {
- } else {
- computer._addRegionForNode(node, node.bestElement);
+ return;
+ }
+ Element element = node.bestElement;
+ computer._addRegionForNode(node, element);
+ }
+
+ void _safelyVisit(AstNode node) {
+ if (node != null) {
+ node.accept(this);
}
- return super.visitSimpleIdentifier(node);
}
}
« no previous file with comments | « pkg/analysis_server/doc/api.html ('k') | pkg/analysis_server/lib/src/generated_protocol.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698