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

Unified Diff: frog/leg/scanner/listener.dart

Issue 9418045: Support for native in leg, and start moving native tests to a specific test suite. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 10 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: frog/leg/scanner/listener.dart
===================================================================
--- frog/leg/scanner/listener.dart (revision 4354)
+++ frog/leg/scanner/listener.dart (working copy)
@@ -423,15 +423,30 @@
}
Token expectedExpression(Token token) {
- error("Expected an expression, but got '$token'", token);
+ error("expected an expression, but got '$token'", token);
return skipToEof(token);
}
Token unexpected(Token token) {
- error("Unexpected token '$token'", token);
+ error("unexpected token '$token'", token);
return skipToEof(token);
}
+ Token expectedBlock(Token token) {
+ error("expected a block '$token'", token);
floitsch 2012/02/19 00:59:43 but got '$token'
ngeoffray 2012/02/20 17:00:02 Done.
+ return skipToEof(token);
+ }
+
+ Token expectedFunctionBody(Token token) {
+ error("expected a function body '$token'", token);
floitsch 2012/02/19 00:59:43 but got
ngeoffray 2012/02/20 17:00:02 Done.
+ return skipToEof(token);
+ }
+
+ Token expectedClassBody(Token token) {
+ error("expected a class body '$token'", token);
floitsch 2012/02/19 00:59:43 but got.
ngeoffray 2012/02/20 17:00:02 Done.
+ return skipToEof(token);
+ }
+
skipToEof(Token token) {
while (token.info !== EOF_INFO) {
token = token.next;
@@ -511,12 +526,21 @@
void endClassDeclaration(int interfacesCount, Token beginToken,
Token extendsKeyword, Token implementsKeyword,
Token endToken) {
+ String nativeName;
ahe 2012/02/19 14:38:02 SourceString.
ngeoffray 2012/02/20 17:00:02 Done.
+ if (nodes.head != null
+ && nodes.head.asIdentifier() != null
+ && nodes.head.asIdentifier().source.stringValue == 'native') {
+ nativeName = nodes.head.asIdentifier().token.next.stringValue;
ahe 2012/02/19 14:38:02 Don't call stringValue.
ngeoffray 2012/02/20 17:00:02 Done.
+ popNode();
+ }
NodeList interfaces =
makeNodeList(interfacesCount, implementsKeyword, null, ",");
TypeAnnotation supertype = popNode();
Identifier name = popNode();
- pushElement(new PartialClassElement(
- name.source, beginToken, endToken, compilationUnitElement));
+ ClassElement element = new PartialClassElement(
+ name.source, beginToken, endToken, compilationUnitElement);
+ element.nativeName = nativeName;
+ pushElement(element);
}
void endDefaultClause(Token defaultKeyword) {
@@ -657,16 +681,56 @@
}
Token expectedExpression(Token token) {
- listener.cancel("Expected an expression, but got '$token'", token: token);
+ listener.cancel("expected an expression, but got '$token'", token: token);
pushNode(null);
return skipToEof(token);
}
Token unexpected(Token token) {
- listener.cancel("Unexpected token '$token'", token: token);
+ listener.cancel("unexpected token '$token'", token: token);
return skipToEof(token);
}
+ Token expectedBlock(Token token) {
+ if (token.stringValue === 'native') {
ahe 2012/02/19 14:38:02 Should we move this code to some static helpers in
ngeoffray 2012/02/20 17:00:02 Done.
+ token = token.next;
+ if (token.kind === STRING_TOKEN) {
+ token = token.next;
+ }
+ if (token.stringValue === '{') {
+ BeginGroupToken beginGroupToken = token;
ahe 2012/02/19 14:38:02 Why is the block being skipped here? Perhaps thi
ngeoffray 2012/02/20 09:09:37 The block contains native code, and I need to retu
+ token = beginGroupToken.endGroup;
+ }
+ return token;
+ } else {
+ return unexpected(token);
+ }
+ }
+
+ Token expectedFunctionBody(Token token) {
+ listener.cancel("expected a function body, but got '$token'", token: token);
+ return skipToEof(token);
+ }
+
+ Token expectedClassBody(Token token) {
+ if (token.stringValue === 'native') {
+ handleIdentifier(token);
+ token = token.next;
+ if (token.kind !== STRING_TOKEN) {
+ return unexpected(token);
+ }
+ token = token.next;
+ if (token.stringValue !== '{') {
+ return unexpected(token);
+ }
+ BeginGroupToken beginGroupToken = token;
ahe 2012/02/19 14:38:02 Ditto.
ngeoffray 2012/02/20 09:09:37 Ditto, I need to return the end of the class body
+ token = beginGroupToken.endGroup;
+ return token;
+ } else {
+ return unexpected(token);
+ }
+ }
+
void recoverableError(String message, [Token token, Node node]) {
listener.cancel(message, token: token, node: node);
}
@@ -866,6 +930,48 @@
listener.cancel("internal error: '${token.value}': ${error}", token: token);
}
+ Token expectedFunctionBody(Token token) {
+ if (token.stringValue === 'native') {
+ Token begin = token;
+ beginExpressionStatement(token);
+ handleIdentifier(token);
+ token = token.next;
+ if (token.kind === STRING_TOKEN) {
+ beginLiteralString(token);
+ endLiteralString(0);
+ pushNode(new NodeList.singleton(popNode()));
+ endSend(token);
+ token = token.next;
+ } else {
+ pushNode(new NodeList.empty());
+ endSend(token);
+ }
+ endExpressionStatement(token);
+ endFunctionBody(1, begin, token);
+ // TODO(ngeoffray): expect a ';'.
+ return token.next;
+ } else {
+ listener.cancel(
+ "expected a function body, but got '$token'", token: token);
+ return skipToEof(token);
+ }
+ }
+
+ Token expectedClassBody(Token token) {
+ if (token.stringValue === 'native') {
+ token = token.next;
+ if (token.kind !== STRING_TOKEN) {
+ unexpected(token);
+ } else {
+ token = token.next;
+ }
+ return token;
+ } else {
+ listener.cancel("expected a class body, but got '$token'", token: token);
+ return skipToEof(token);
+ }
+ }
+
void handleLiteralInt(Token token) {
pushNode(new LiteralInt(token, (t, e) => handleOnError(t, e)));
}

Powered by Google App Engine
This is Rietveld 408576698