| 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;
|
| }
|
|
|
|
|
|
|