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

Unified Diff: dart/lib/compiler/implementation/scanner/parser.dart

Issue 10917170: Improve handling of built-in identifiers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 3 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: dart/lib/compiler/implementation/scanner/parser.dart
diff --git a/dart/lib/compiler/implementation/scanner/parser.dart b/dart/lib/compiler/implementation/scanner/parser.dart
index 2dba34448856d03d18dd38c41edc678f64f266ab..919b3ba07437e30e2ce5f383296781582769da9a 100644
--- a/dart/lib/compiler/implementation/scanner/parser.dart
+++ b/dart/lib/compiler/implementation/scanner/parser.dart
@@ -207,7 +207,7 @@ class Parser {
if (value === 'var') return parseType(token);
if (value !== 'this') {
Token peek = peekAfterExpectedType(token);
- if (isIdentifier(peek) || optional('this', peek)) {
+ if (peek.isIdentifier() || optional('this', peek)) {
return parseType(token);
}
}
@@ -215,7 +215,16 @@ class Parser {
return token;
}
- bool isIdentifier(Token token) => token.isIdentifier();
+ bool isValidTypeReference(Token token) {
+ final kind = token.kind;
+ if (kind === IDENTIFIER_TOKEN) return true;
+ if (kind === KEYWORD_TOKEN) {
+ Keyword keyword = token.value;
+ String value = keyword.stringValue;
+ return (keyword.isPseudo) || (value === 'Dynamic') || (value === 'void');
ngeoffray 2012/09/10 16:20:54 No need for parens in keyword.isPseudo
+ }
+ return false;
+ }
Token parseDefaultClauseOpt(Token token) {
if (isDefaultKeyword(token)) {
@@ -303,7 +312,7 @@ class Parser {
}
Token parseIdentifier(Token token) {
- if (isIdentifier(token)) {
+ if (token.isIdentifier()) {
listener.handleIdentifier(token);
} else {
listener.expectedIdentifier(token);
@@ -341,7 +350,7 @@ class Parser {
Token parseType(Token token) {
Token begin = token;
- if (isIdentifier(token)) {
+ if (isValidTypeReference(token)) {
token = parseIdentifier(token);
token = parseQualifiedRestOpt(token);
} else {
@@ -403,7 +412,7 @@ class Parser {
Token getOrSet = findGetOrSet(token);
if (token === getOrSet) token = token.next;
Token peek = peekAfterExpectedType(token);
- if (isIdentifier(peek)) {
+ if (peek.isIdentifier()) {
// Skip type.
token = peek;
}
@@ -547,7 +556,7 @@ class Parser {
// We are looking at "identifier ...".
Token peek = token.next;
if (peek.kind === PERIOD_TOKEN) {
- if (isIdentifier(peek.next)) {
+ if (peek.next.isIdentifier()) {
// Look past a library prefix.
peek = peek.next.next;
}
@@ -571,7 +580,7 @@ class Parser {
* If [token] is not the start of a type, [Listener.unexpectedType] is called.
*/
Token peekAfterExpectedType(Token token) {
- if ('void' !== token.stringValue && !isIdentifier(token)) {
+ if ('void' !== token.stringValue && !token.isIdentifier()) {
return listener.expectedType(token);
}
return peekAfterType(token);
@@ -603,13 +612,13 @@ class Parser {
if (optional('<', token.next)) {
// For example: get<T> ...
final Token peek = peekAfterExpectedType(token);
- if (isGetOrSet(peek) && isIdentifier(peek.next)) {
+ if (isGetOrSet(peek) && peek.next.isIdentifier()) {
// For example: get<T> get identifier
return peek;
}
} else {
// For example: get ...
- if (isGetOrSet(token.next) && isIdentifier(token.next.next)) {
+ if (isGetOrSet(token.next) && token.next.next.isIdentifier()) {
// For example: get get identifier
return token.next;
} else {
@@ -619,7 +628,7 @@ class Parser {
}
} else if (token.stringValue !== 'operator') {
final Token peek = peekAfterExpectedType(token);
- if (isGetOrSet(peek) && isIdentifier(peek.next)) {
+ if (isGetOrSet(peek) && peek.next.isIdentifier()) {
// type? get identifier
return peek;
}
@@ -640,7 +649,7 @@ class Parser {
Token getOrSet = findGetOrSet(token);
if (token === getOrSet) token = token.next;
Token peek = peekAfterExpectedType(token);
- if (isIdentifier(peek) && token.stringValue !== 'operator') {
+ if (peek.isIdentifier() && token.stringValue !== 'operator') {
// Skip type.
token = peek;
}
@@ -865,7 +874,7 @@ class Parser {
return parseEmptyStatement(token);
} else if (value === 'const') {
return parseExpressionStatementOrConstDeclaration(token);
- } else if (isIdentifier(token)) {
+ } else if (token.isIdentifier()) {
return parseExpressionStatementOrDeclaration(token);
} else {
return parseExpressionStatement(token);
@@ -888,7 +897,7 @@ class Parser {
Token peekIdentifierAfterType(Token token) {
Token peek = peekAfterType(token);
- if (peek !== null && isIdentifier(peek)) {
+ if (peek !== null && peek.isIdentifier()) {
// We are looking at "type identifier".
return peek;
} else {
@@ -901,7 +910,7 @@ class Parser {
if (peek !== null) {
// We are looking at "type identifier".
return peek;
- } else if (isIdentifier(token)) {
+ } else if (token.isIdentifier()) {
// We are looking at "identifier".
return token;
} else {
@@ -910,10 +919,10 @@ class Parser {
}
Token parseExpressionStatementOrDeclaration(Token token) {
- assert(isIdentifier(token) || token.stringValue === 'void');
+ assert(token.isIdentifier() || token.stringValue === 'void');
Token identifier = peekIdentifierAfterType(token);
if (identifier !== null) {
- assert(isIdentifier(identifier));
+ assert(identifier.isIdentifier());
Token afterId = identifier.next;
int afterIdKind = afterId.kind;
if (afterIdKind === EQ_TOKEN ||
@@ -954,7 +963,7 @@ class Parser {
}
Token identifier = peekIdentifierAfterOptionalType(token.next);
if (identifier !== null) {
- assert(isIdentifier(identifier));
+ assert(identifier.isIdentifier());
Token afterId = identifier.next;
int afterIdKind = afterId.kind;
if (afterIdKind === EQ_TOKEN ||
@@ -982,7 +991,7 @@ class Parser {
do {
token = parseLabel(token);
labelCount++;
- } while (isIdentifier(token) && optional(':', token.next));
+ } while (token.isIdentifier() && optional(':', token.next));
listener.beginLabeledStatement(token, labelCount);
token = parseStatement(token);
listener.endLabeledStatement(labelCount);
@@ -1082,7 +1091,7 @@ class Parser {
token = token.next;
if (optional('[', token)) {
token = parseArgumentOrIndexStar(token);
- } else if (isIdentifier(token)) {
+ } else if (token.isIdentifier()) {
token = parseSend(token);
listener.handleBinaryExpression(cascadeOperator);
} else {
@@ -1198,7 +1207,7 @@ class Parser {
return parseConstExpression(token);
} else if (value === 'void') {
return parseFunctionExpression(token);
- } else if (isIdentifier(token)) {
+ } else if (token.isIdentifier()) {
return parseSendOrFunctionLiteral(token);
} else {
return listener.expectedExpression(token);
@@ -1599,7 +1608,7 @@ class Parser {
}
Token identifier = peekIdentifierAfterType(token);
if (identifier !== null) {
- assert(isIdentifier(identifier));
+ assert(identifier.isIdentifier());
Token afterId = identifier.next;
int afterIdKind = afterId.kind;
if (afterIdKind === EQ_TOKEN || afterIdKind === SEMICOLON_TOKEN ||
@@ -1764,7 +1773,7 @@ class Parser {
* switch case.
*/
Token peekPastLabels(Token token) {
- while (isIdentifier(token) && optional(':', token.next)) {
+ while (token.isIdentifier() && optional(':', token.next)) {
token = token.next.next;
}
return token;
@@ -1836,7 +1845,7 @@ class Parser {
Token breakKeyword = token;
token = token.next;
bool hasTarget = false;
- if (isIdentifier(token)) {
+ if (token.isIdentifier()) {
token = parseIdentifier(token);
hasTarget = true;
}
@@ -1849,7 +1858,7 @@ class Parser {
Token continueKeyword = token;
token = token.next;
bool hasTarget = false;
- if (isIdentifier(token)) {
+ if (token.isIdentifier()) {
token = parseIdentifier(token);
hasTarget = true;
}
« no previous file with comments | « dart/lib/compiler/implementation/scanner/listener.dart ('k') | dart/lib/compiler/implementation/scanner/scanner.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698