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

Unified Diff: compiler/java/com/google/dart/compiler/parser/DartParser.java

Issue 10860012: Add support for metadata annotation syntax (issue 4056) (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 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
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);
}
/**

Powered by Google App Engine
This is Rietveld 408576698