Index: compiler/java/com/google/dart/compiler/parser/DartParser.java |
=================================================================== |
--- compiler/java/com/google/dart/compiler/parser/DartParser.java (revision 10903) |
+++ compiler/java/com/google/dart/compiler/parser/DartParser.java (working copy) |
@@ -51,6 +51,7 @@ |
import com.google.dart.compiler.ast.DartLibraryDirective; |
import com.google.dart.compiler.ast.DartMapLiteral; |
import com.google.dart.compiler.ast.DartMapLiteralEntry; |
+import com.google.dart.compiler.ast.DartAnnotation; |
import com.google.dart.compiler.ast.DartMethodDefinition; |
import com.google.dart.compiler.ast.DartMethodInvocation; |
import com.google.dart.compiler.ast.DartNamedExpression; |
@@ -58,6 +59,7 @@ |
import com.google.dart.compiler.ast.DartNativeDirective; |
import com.google.dart.compiler.ast.DartNewExpression; |
import com.google.dart.compiler.ast.DartNode; |
+import com.google.dart.compiler.ast.DartNodeWithMetadata; |
import com.google.dart.compiler.ast.DartNullLiteral; |
import com.google.dart.compiler.ast.DartParameter; |
import com.google.dart.compiler.ast.DartParameterizedTypeNode; |
@@ -303,8 +305,9 @@ |
parseDirectives(unit); |
while (!EOS()) { |
- DartNode node = null; |
+ DartNodeWithMetadata node = null; |
beginTopLevelElement(); |
+ List<DartAnnotation> metadata = parseMetadata(); |
isParsingClass = isParsingInterface = false; |
// Check for ABSTRACT_KEYWORD. |
isTopLevelAbstract = false; |
@@ -333,6 +336,7 @@ |
} |
// Parsing was successful, add node. |
if (node != null) { |
+ node.setMetadata(metadata); |
unit.getTopLevelNodes().add(node); |
// Only "class" can be top-level abstract element. |
if (isTopLevelAbstract && !isParsingClass) { |
@@ -472,6 +476,7 @@ |
} |
private void parseDirectives(DartUnit unit) { |
+ List<DartAnnotation> metadata = parseMetadata(); |
if (peekPseudoKeyword(0, LIBRARY_KEYWORD)) { |
DartLibraryDirective libraryDirective = parseLibraryDirective(); |
for (DartDirective directive : unit.getDirectives()) { |
@@ -480,16 +485,23 @@ |
break; |
} |
} |
+ libraryDirective.setMetadata(metadata); |
unit.getDirectives().add(libraryDirective); |
} |
while (peekPseudoKeyword(0, IMPORT_KEYWORD)) { |
- unit.getDirectives().add(parseImportDirective()); |
+ DartImportDirective importDirective = parseImportDirective(); |
+ importDirective.setMetadata(metadata); |
+ unit.getDirectives().add(importDirective); |
} |
while (peekPseudoKeyword(0, PART_KEYWORD)) { |
if (peekPseudoKeyword(1, OF_KEYWORD)) { |
- unit.getDirectives().add(parsePartOfDirective()); |
+ DartPartOfDirective partOfDirective = parsePartOfDirective(); |
+ partOfDirective.setMetadata(metadata); |
+ unit.getDirectives().add(partOfDirective); |
} else { |
- unit.getDirectives().add(parsePartDirective()); |
+ DartSourceDirective partDirective = parsePartDirective(); |
+ partDirective.setMetadata(metadata); |
+ unit.getDirectives().add(partDirective); |
} |
} |
// |
@@ -505,23 +517,30 @@ |
break; |
} |
} |
+ libraryDirective.setMetadata(metadata); |
unit.getDirectives().add(libraryDirective); |
done(libraryDirective); |
} |
while (peek(0) == Token.IMPORT) { |
beginImportDirective(); |
- unit.getDirectives().add(done(parseObsoleteImportDirective())); |
+ DartImportDirective importDirective = parseObsoleteImportDirective(); |
+ importDirective.setMetadata(metadata); |
+ unit.getDirectives().add(done(importDirective)); |
} |
while (peek(0) == Token.SOURCE) { |
beginSourceDirective(); |
- unit.getDirectives().add(done(parseSourceDirective())); |
+ DartSourceDirective sourceDirective = parseSourceDirective(); |
+ sourceDirective.setMetadata(metadata); |
+ unit.getDirectives().add(done(sourceDirective)); |
} |
while (peek(0) == Token.RESOURCE) { |
parseResourceDirective(); |
} |
while (peek(0) == Token.NATIVE) { |
beginNativeDirective(); |
- unit.getDirectives().add(done(parseNativeDirective())); |
+ DartNativeDirective nativeDirective = parseNativeDirective(); |
+ nativeDirective.setMetadata(metadata); |
+ unit.getDirectives().add(done(nativeDirective)); |
} |
} |
@@ -696,6 +715,26 @@ |
return new DartNativeDirective(nativeUri); |
} |
+ private List<DartAnnotation> parseMetadata() { |
+ List<DartAnnotation> metadata = new ArrayList<DartAnnotation>(); |
+ while (match(Token.AT)) { |
+ beginMetadata(); |
+ next(); |
+ beginQualifiedIdentifier(); |
+ DartExpression name = parseQualified(); |
+ if (optional(Token.PERIOD)) { |
+ name = new DartPropertyAccess(name, parseIdentifier()); |
+ } |
+ done(name); |
+ List<DartExpression> arguments = null; |
+ if (match(Token.LPAREN)) { |
+ arguments = parseArguments(); |
+ } |
+ metadata.add(done(new DartAnnotation(name, arguments))); |
+ } |
+ return metadata; |
+ } |
+ |
/** |
* <pre> |
* typeParameter |
@@ -886,14 +925,15 @@ |
* Helper for {@link #parseClass()}. |
* |
* '{' classMemberDefinition* '}' |
- * |
*/ |
@Terminals(tokens={Token.RBRACE, Token.SEMICOLON}) |
private void parseClassOrInterfaceBody(List<DartNode> members) { |
if (optional(Token.LBRACE)) { |
while (!match(Token.RBRACE) && !EOS() && !looksLikeTopLevelKeyword()) { |
- DartNode member = parseFieldOrMethod(true); |
+ List<DartAnnotation> metadata = parseMetadata(); |
+ DartNodeWithMetadata member = parseFieldOrMethod(true); |
if (member != null) { |
+ member.setMetadata(metadata); |
members.add(member); |
} |
// Recover at a semicolon |
@@ -1120,7 +1160,7 @@ |
* @return a {@link DartNode} representing the grammar fragment above |
*/ |
@Terminals(tokens={Token.SEMICOLON}) |
- private DartNode parseFieldOrMethod(boolean allowStatic) { |
+ private DartNodeWithMetadata parseFieldOrMethod(boolean allowStatic) { |
beginClassMember(); |
Modifiers modifiers = Modifiers.NONE; |
if (peek(1) != Token.LPAREN && optionalPseudoKeyword(EXTERNAL_KEYWORD)) { |
@@ -1188,7 +1228,7 @@ |
return done(factoryNode); |
} |
- final DartNode member; |
+ final DartNodeWithMetadata member; |
switch (peek(0)) { |
case VAR: { |
@@ -1634,7 +1674,7 @@ |
} |
} |
- private DartNode parseMethodOrAccessor(Modifiers modifiers, DartTypeNode returnType) { |
+ private DartNodeWithMetadata parseMethodOrAccessor(Modifiers modifiers, DartTypeNode returnType) { |
DartMethodDefinition method = done(parseMethod(modifiers, returnType)); |
// Abstract method can not have a body. |
if (method.getFunction().getBody() != null) { |
@@ -1943,6 +1983,7 @@ |
*/ |
private DartParameter parseFormalParameter(boolean isOptional, boolean isNamed) { |
beginFormalParameter(); |
+ List<DartAnnotation> metadata = parseMetadata(); |
DartExpression paramName = null; |
DartTypeNode type = null; |
DartExpression defaultExpr = null; |
@@ -2047,7 +2088,9 @@ |
break; |
} |
- return done(new DartParameter(paramName, type, functionParams, defaultExpr, modifiers)); |
+ DartParameter parameter = new DartParameter(paramName, type, functionParams, defaultExpr, modifiers); |
+ parameter.setMetadata(metadata); |
+ return done(parameter); |
} |
/** |