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

Unified Diff: runtime/vm/parser.cc

Issue 538803002: Enable await in for and for-in loops. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 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
« no previous file with comments | « runtime/vm/parser.h ('k') | tests/language/await_future_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index d2ce185de0210d552083566be687a88b91e93f30..66b4ad7f132ac8a328a9d00402b5ef3432942fad 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -5935,7 +5935,8 @@ AstNode* Parser::CallGetter(intptr_t token_pos,
// Returns ast nodes of the variable initialization.
AstNode* Parser::ParseVariableDeclaration(const AbstractType& type,
bool is_final,
- bool is_const) {
+ bool is_const,
+ SequenceNode** await_preamble) {
TRACE_PARSER("ParseVariableDeclaration");
ASSERT(IsIdentifier());
const intptr_t ident_pos = TokenPos();
@@ -5948,7 +5949,8 @@ AstNode* Parser::ParseVariableDeclaration(const AbstractType& type,
// Variable initialization.
const intptr_t assign_pos = TokenPos();
ConsumeToken();
- AstNode* expr = ParseAwaitableExpr(is_const, kConsumeCascades, NULL);
+ AstNode* expr = ParseAwaitableExpr(
+ is_const, kConsumeCascades, await_preamble);
initialization = new(I) StoreLocalNode(
assign_pos, variable, expr);
if (is_const) {
@@ -6061,8 +6063,17 @@ AstNode* Parser::ParseVariableDeclarationList() {
ReportError("identifier expected");
}
- AstNode* initializers = ParseVariableDeclaration(type, is_final, is_const);
+ SequenceNode* preamble = NULL;
+ AstNode* initializers =
+ ParseVariableDeclaration(type, is_final, is_const, &preamble);
ASSERT(initializers != NULL);
+ if (preamble != NULL) {
hausner 2014/09/04 16:30:58 I don't understand this. If preamble is not NULL,
Michael Lippautz (Google) 2014/09/04 17:07:38 There's no need anymore as this was a leftover. Do
+ SequenceNode* sequence = NodeAsSequenceNode(initializers->token_pos(),
+ preamble,
+ NULL);
+ sequence->Add(initializers);
+ initializers = sequence;
+ }
while (CurrentToken() == Token::kCOMMA) {
ConsumeToken();
if (!IsIdentifier()) {
@@ -6073,7 +6084,13 @@ AstNode* Parser::ParseVariableDeclarationList() {
SequenceNode* sequence = NodeAsSequenceNode(initializers->token_pos(),
initializers,
NULL);
- sequence->Add(ParseVariableDeclaration(type, is_final, is_const));
+ preamble = NULL;
+ AstNode* declaration = ParseVariableDeclaration(
+ type, is_final, is_const, &preamble);
+ if (preamble != NULL) {
+ sequence->Add(preamble);
+ }
+ sequence->Add(declaration);
initializers = sequence;
}
return initializers;
@@ -7035,7 +7052,8 @@ AstNode* Parser::ParseForInStatement(intptr_t forin_pos,
}
ExpectToken(Token::kIN);
const intptr_t collection_pos = TokenPos();
- AstNode* collection_expr = ParseExpr(kAllowConst, kConsumeCascades);
+ AstNode* collection_expr =
+ ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
ExpectToken(Token::kRPAREN);
OpenBlock(); // Implicit block around while loop.
@@ -7136,19 +7154,21 @@ AstNode* Parser::ParseForStatement(String* label_name) {
if (IsVariableDeclaration()) {
initializer = ParseVariableDeclarationList();
} else {
- initializer = ParseExpr(kAllowConst, kConsumeCascades);
+ initializer = ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
}
}
ExpectSemicolon();
AstNode* condition = NULL;
+ SequenceNode* condition_preamble = NULL;
if (CurrentToken() != Token::kSEMICOLON) {
- condition = ParseExpr(kAllowConst, kConsumeCascades);
+ condition = ParseAwaitableExpr(
+ kAllowConst, kConsumeCascades, &condition_preamble);
}
ExpectSemicolon();
AstNode* increment = NULL;
const intptr_t incr_pos = TokenPos();
if (CurrentToken() != Token::kRPAREN) {
- increment = ParseExprList();
+ increment = ParseAwaitableExprList();
}
ExpectToken(Token::kRPAREN);
const bool parsing_loop_body = true;
@@ -7175,6 +7195,7 @@ AstNode* Parser::ParseForStatement(String* label_name) {
label,
NodeAsSequenceNode(init_pos, initializer, NULL),
condition,
+ condition_preamble,
NodeAsSequenceNode(incr_pos, increment, NULL),
body);
current_block_->statements->Add(for_node);
@@ -8262,16 +8283,29 @@ AstNode* Parser::ParseBinaryExpr(int min_preced) {
}
-AstNode* Parser::ParseExprList() {
- TRACE_PARSER("ParseExprList");
- AstNode* expressions = ParseExpr(kAllowConst, kConsumeCascades);
+AstNode* Parser::ParseAwaitableExprList() {
+ TRACE_PARSER("ParseAwaitableExprList");
+ SequenceNode* preamble = NULL;
+ AstNode* expressions = ParseAwaitableExpr(
+ kAllowConst, kConsumeCascades, &preamble);
+ if (preamble != NULL) {
hausner 2014/09/04 16:30:58 Ditto.
Michael Lippautz (Google) 2014/09/04 17:07:38 Done.
+ SequenceNode* sequence = NodeAsSequenceNode(
+ expressions->token_pos(), preamble, NULL);
+ sequence->Add(expressions);
+ expressions = sequence;
+ }
if (CurrentToken() == Token::kCOMMA) {
// Collect comma-separated expressions in a non scope owning sequence node.
SequenceNode* list = new(I) SequenceNode(TokenPos(), NULL);
list->Add(expressions);
while (CurrentToken() == Token::kCOMMA) {
ConsumeToken();
- AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
+ preamble = NULL;
+ AstNode* expr = ParseAwaitableExpr(
+ kAllowConst, kConsumeCascades, &preamble);
+ if (preamble != NULL) {
+ list->Add(preamble);
+ }
list->Add(expr);
}
expressions = list;
« no previous file with comments | « runtime/vm/parser.h ('k') | tests/language/await_future_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698