Index: pkg/compiler/lib/src/tree/nodes.dart |
diff --git a/pkg/compiler/lib/src/tree/nodes.dart b/pkg/compiler/lib/src/tree/nodes.dart |
index 04d46f54c28a4c8ac003abe471bc0673d9572a1b..e95497b9c927740a37699a1427bf9265b61bffc6 100644 |
--- a/pkg/compiler/lib/src/tree/nodes.dart |
+++ b/pkg/compiler/lib/src/tree/nodes.dart |
@@ -147,6 +147,12 @@ abstract class Node extends NullTreeElementMixin implements Spannable { |
Token getBeginToken(); |
+ /// Returns the token that ends the 'prefix' of this node. |
+ /// |
+ /// For instance the end of the parameters in a [FunctionExpression] or the |
+ /// last token before the start of a class body for a [ClassNode]. |
+ Token getPrefixEndToken() => getEndToken(); |
+ |
Token getEndToken(); |
Assert asAssert() => null; |
@@ -263,6 +269,25 @@ class ClassNode extends Node { |
Token getBeginToken() => beginToken; |
+ @override |
+ Token getPrefixEndToken() { |
+ Token token; |
+ if (interfaces != null) { |
+ token = interfaces.getEndToken(); |
+ } |
+ if (token == null && superclass != null) { |
+ token = superclass.getEndToken(); |
+ } |
+ if (token == null && typeParameters != null) { |
+ token == typeParameters.getEndToken(); |
+ } |
+ if (token == null) { |
+ token = name.getEndToken(); |
+ } |
+ assert(invariant(beginToken, token != null)); |
+ return token; |
+ } |
+ |
Token getEndToken() => endToken; |
} |
@@ -738,6 +763,10 @@ class FunctionDeclaration extends Statement { |
visitChildren(Visitor visitor) => function.accept(visitor); |
Token getBeginToken() => function.getBeginToken(); |
+ |
+ @override |
+ Token getPrefixEndToken() => function.getPrefixEndToken(); |
+ |
Token getEndToken() => function.getEndToken(); |
} |
@@ -826,6 +855,11 @@ class FunctionExpression extends Expression with StoredTreeElementMixin { |
return firstBeginToken(name, parameters); |
} |
+ @override |
+ Token getPrefixEndToken() { |
+ return parameters != null ? parameters.getEndToken() : name.getEndToken(); |
+ } |
+ |
Token getEndToken() { |
Token token = (body == null) ? null : body.getEndToken(); |
token = (token == null) ? parameters.getEndToken() : token; |
@@ -1300,7 +1334,10 @@ class TypeAnnotation extends Node { |
Token getBeginToken() => typeName.getBeginToken(); |
- Token getEndToken() => typeName.getEndToken(); |
+ Token getEndToken() { |
+ if (typeArguments != null) return typeArguments.getEndToken(); |
+ return typeName.getEndToken(); |
+ } |
} |
class TypeVariable extends Node { |