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

Unified Diff: pkg/analyzer/lib/src/generated/ast.dart

Issue 1490933002: New NodeLocator which uses positions of characters, not between them. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years 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 | « no previous file | pkg/analyzer/lib/src/task/dart.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/ast.dart
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 03cb8f167b6db4b03fff9567fed946525d78dc9d..36e1ccd0e5c62671d25b65b759862458b4d357c4 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -12946,6 +12946,95 @@ class NodeLocator extends UnifyingAstVisitor<Object> {
}
/**
+ * An object used to locate the [AstNode] associated with a source range.
+ * More specifically, they will return the deepest [AstNode] which completely
+ * encompasses the specified range.
+ */
+class NodeLocator2 extends UnifyingAstVisitor<Object> {
+ /**
+ * The inclusive start offset of the range used to identify the node.
+ */
+ int _startOffset = 0;
+
+ /**
+ * The inclusive end offset of the range used to identify the node.
+ */
+ int _endOffset = 0;
+
+ /**
+ * The found node or `null` if there is no such node.
+ */
+ AstNode _foundNode;
+
+ /**
+ * Initialize a newly created locator to locate the deepest [AstNode] for
+ * which `node.offset <= [startOffset]` and `[endOffset] < node.end`.
+ *
+ * If [endOffset] is not provided, then it is considered the same as the
+ * given [startOffset].
+ */
+ NodeLocator2(int startOffset, [int endOffset])
+ : this._startOffset = startOffset,
+ this._endOffset = endOffset == null ? startOffset : endOffset;
+
+ /**
+ * Search within the given AST [node] and return the node that was found,
+ * or `null` if no node was found.
+ */
+ AstNode searchWithin(AstNode node) {
+ if (node == null) {
+ return null;
+ }
+ try {
+ node.accept(this);
+ } on NodeLocator_NodeFoundException {} catch (exception, stackTrace) {
+ AnalysisEngine.instance.logger.logInformation(
+ "Unable to locate element at offset ($_startOffset - $_endOffset)",
+ new CaughtException(exception, stackTrace));
+ return null;
+ }
+ return _foundNode;
+ }
+
+ @override
+ Object visitNode(AstNode node) {
+ Token beginToken = node.beginToken;
+ Token endToken = node.endToken;
+ // Don't include synthetic tokens.
+ while (endToken != beginToken) {
+ if (endToken.type == TokenType.EOF || !endToken.isSynthetic) {
+ break;
+ }
+ endToken = endToken.previous;
+ }
+ int end = endToken.end;
+ int start = node.offset;
+ if (end <= _startOffset) {
+ return null;
+ }
+ if (start > _endOffset) {
+ return null;
+ }
+ try {
+ node.visitChildren(this);
+ } on NodeLocator_NodeFoundException {
+ rethrow;
+ } catch (exception, stackTrace) {
+ // Ignore the exception and proceed in order to visit the rest of the
+ // structure.
+ AnalysisEngine.instance.logger.logInformation(
+ "Exception caught while traversing an AST structure.",
+ new CaughtException(exception, stackTrace));
+ }
+ if (start <= _startOffset && _endOffset < end) {
+ _foundNode = node;
+ throw new NodeLocator_NodeFoundException();
+ }
+ return null;
+ }
+}
+
+/**
* An exception used by [NodeLocator] to cancel visiting after a node has been
* found.
*/
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/task/dart.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698