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

Unified Diff: runtime/vm/parser.cc

Issue 11377102: Remove named function literals from library and tests (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month 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 | « no previous file | sdk/lib/core/map.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
===================================================================
--- runtime/vm/parser.cc (revision 14804)
+++ runtime/vm/parser.cc (working copy)
@@ -33,6 +33,8 @@
"Warning on legacy type Dynamic)");
DEFINE_FLAG(bool, warn_legacy_getters, false,
"Warning on legacy getter syntax");
+DEFINE_FLAG(bool, strict_function_literals, false,
+ "enforce new function literal rules");
DECLARE_FLAG(bool, use_cha);
static void CheckedModeHandler(bool value) {
@@ -4960,25 +4962,46 @@
const String* function_name = NULL;
result_type = Type::DynamicType();
- if (CurrentToken() == Token::kVOID) {
- ConsumeToken();
- result_type = Type::VoidType();
- } else if ((CurrentToken() == Token::kIDENT) &&
- (LookaheadToken(1) != Token::kLPAREN)) {
- result_type = ParseType(ClassFinalizer::kCanonicalize);
- }
- const intptr_t ident_pos = TokenPos();
- if (IsIdentifier()) {
- variable_name = CurrentLiteral();
- function_name = variable_name;
- ConsumeToken();
+
+ intptr_t ident_pos = TokenPos();
+ if (FLAG_strict_function_literals) {
+ if (is_literal) {
+ ASSERT(CurrentToken() == Token::kLPAREN);
+ function_name = &String::ZoneHandle(Symbols::AnonymousClosure());
+ } else {
+ if (CurrentToken() == Token::kVOID) {
+ ConsumeToken();
+ result_type = Type::VoidType();
+ } else if ((CurrentToken() == Token::kIDENT) &&
+ (LookaheadToken(1) != Token::kLPAREN)) {
+ result_type = ParseType(ClassFinalizer::kCanonicalize);
+ }
+ ident_pos = TokenPos();
+ variable_name = ExpectIdentifier("function name expected");
+ function_name = variable_name;
+ }
} else {
- if (!is_literal) {
- ErrorMsg("function name expected");
+ // TODO(hausner) remove this block once support for old-style function
+ // literals is gone.
+ if (CurrentToken() == Token::kVOID) {
+ ConsumeToken();
+ result_type = Type::VoidType();
+ } else if ((CurrentToken() == Token::kIDENT) &&
+ (LookaheadToken(1) != Token::kLPAREN)) {
+ result_type = ParseType(ClassFinalizer::kCanonicalize);
}
- function_name = &String::ZoneHandle(Symbols::AnonymousClosure());
+ ident_pos = TokenPos();
+ if (IsIdentifier()) {
+ variable_name = CurrentLiteral();
+ function_name = variable_name;
+ ConsumeToken();
+ } else {
+ if (!is_literal) {
+ ErrorMsg("function name expected");
+ }
+ function_name = &String::ZoneHandle(Symbols::AnonymousClosure());
+ }
}
- ASSERT(ident_pos >= 0);
if (CurrentToken() != Token::kLPAREN) {
ErrorMsg("'(' expected");
@@ -5380,29 +5403,46 @@
bool Parser::IsFunctionLiteral() {
- if (!allow_function_literals_) {
- return false;
- }
- const intptr_t saved_pos = TokenPos();
- bool is_function_literal = false;
- if (IsIdentifier() && (LookaheadToken(1) == Token::kLPAREN)) {
- ConsumeToken(); // Consume function identifier.
- } else if (TryParseReturnType()) {
- if (!IsIdentifier()) {
- SetPosition(saved_pos);
+ // TODO(hausner): Remove code block that supports old-style function
+ // literals.
+ if (FLAG_strict_function_literals) {
+ if (CurrentToken() != Token::kLPAREN || !allow_function_literals_) {
return false;
}
- ConsumeToken(); // Comsume function identifier.
- }
- if (CurrentToken() == Token::kLPAREN) {
+ const intptr_t saved_pos = TokenPos();
+ bool is_function_literal = false;
SkipToMatchingParenthesis();
if ((CurrentToken() == Token::kLBRACE) ||
(CurrentToken() == Token::kARROW)) {
is_function_literal = true;
}
+ SetPosition(saved_pos);
+ return is_function_literal;
+ } else {
+ if (!allow_function_literals_) {
+ return false;
+ }
+ const intptr_t saved_pos = TokenPos();
+ bool is_function_literal = false;
+ if (IsIdentifier() && (LookaheadToken(1) == Token::kLPAREN)) {
+ ConsumeToken(); // Consume function identifier.
+ } else if (TryParseReturnType()) {
+ if (!IsIdentifier()) {
+ SetPosition(saved_pos);
+ return false;
+ }
+ ConsumeToken(); // Comsume function identifier.
+ }
+ if (CurrentToken() == Token::kLPAREN) {
+ SkipToMatchingParenthesis();
+ if ((CurrentToken() == Token::kLBRACE) ||
+ (CurrentToken() == Token::kARROW)) {
+ is_function_literal = true;
+ }
+ }
+ SetPosition(saved_pos);
+ return is_function_literal;
}
- SetPosition(saved_pos);
- return is_function_literal;
}
« no previous file with comments | « no previous file | sdk/lib/core/map.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698