Chromium Code Reviews| Index: dart/sdk/lib/_internal/compiler/implementation/scanner/listener.dart |
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/dart/sdk/lib/_internal/compiler/implementation/scanner/listener.dart |
| index ae3453b7986bf1095902d3ae0a50fcf8c2f1d4ca..f4d8be4ca8f8eea05b7cb8e2e4ed9adf1c6247fe 100644 |
| --- a/dart/sdk/lib/_internal/compiler/implementation/scanner/listener.dart |
| +++ b/dart/sdk/lib/_internal/compiler/implementation/scanner/listener.dart |
| @@ -254,7 +254,7 @@ class Listener { |
| void beginMetadata(Token token) { |
| } |
| - void endMetadata(Token beginToken, Token endToken) { |
| + void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { |
| } |
| void beginOptionalFormalParameters(Token token) { |
| @@ -735,7 +735,10 @@ class ElementListener extends Listener { |
| } |
| } |
| - void endMetadata(Token beginToken, Token endToken) { |
| + void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { |
| + if (periodBeforeName != null) { |
| + popNode(); // Discard name. |
| + } |
| popNode(); // Discard node (Send or Identifier). |
| pushMetadata(new PartialMetadataAnnotation(beginToken)); |
| } |
| @@ -1722,6 +1725,42 @@ class NodeListener extends ElementListener { |
| beginToken, inKeyword)); |
| } |
| + void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) { |
| + NodeList arguments = popNode(); |
| + if (arguments == null) { |
| + // This is a constant expression. |
| + Identifier name; |
| + if (periodBeforeName != null) { |
| + name = popNode(); |
| + } |
| + NodeList typeArguments = popNode(); |
| + Node receiver = popNode(); |
| + if (typeArguments != null) { |
| + receiver = new TypeAnnotation(receiver, typeArguments); |
| + recoverableError('typeArguments not allowed here', node: typeArguments); |
|
sra1
2012/11/13 18:56:40
If this is a user-facing message, replace typeArgu
ahe
2012/11/14 17:56:21
Done in r14889.
|
| + } else { |
| + Identifier identifier = receiver.asIdentifier(); |
| + Send send = receiver.asSend(); |
| + if (identifier != null) { |
| + receiver = new Send(null, identifier); |
| + } else if (send == null) { |
| + internalError(node: receiver); |
| + } |
| + } |
| + Send send = receiver; |
| + if (name != null) { |
| + send = new Send(receiver, name); |
| + } |
| + pushNode(send); |
| + } else { |
| + // This is a const constructor call. |
| + endConstructorReference(beginToken, periodBeforeName, endToken); |
| + Node constructor = popNode(); |
| + pushNode(new NewExpression(beginToken, |
| + new Send(null, constructor, arguments))); |
| + } |
| + } |
| + |
| void handleAssertStatement(Token assertKeyword, Token semicolonToken) { |
| NodeList arguments = popNode(); |
| Node selector = new Identifier(assertKeyword); |
| @@ -1892,7 +1931,7 @@ class PartialMetadataAnnotation extends MetadataAnnotation { |
| if (cachedNode != null) return cachedNode; |
| cachedNode = parse(listener, |
| annotatedElement.getCompilationUnit(), |
| - (p) => p.parseSend(beginToken.next)); |
| + (p) => p.parseMetadata(beginToken)); |
| return cachedNode; |
| } |
| } |