| Index: src/parsing/preparser.cc
|
| diff --git a/src/parsing/preparser.cc b/src/parsing/preparser.cc
|
| index d81bd6dded99d7ff8cbea42039232e324d2d9654..41b3d63206fe1d3c0183c94806e035c1fc3530bf 100644
|
| --- a/src/parsing/preparser.cc
|
| +++ b/src/parsing/preparser.cc
|
| @@ -94,10 +94,10 @@ PreParserExpression PreParserTraits::ParseFunctionLiteral(
|
| PreParserIdentifier name, Scanner::Location function_name_location,
|
| FunctionNameValidity function_name_validity, FunctionKind kind,
|
| int function_token_position, FunctionLiteral::FunctionType type,
|
| - LanguageMode language_mode, bool* ok) {
|
| + LanguageMode language_mode, typesystem::TypeFlags type_flags, bool* ok) {
|
| return pre_parser_->ParseFunctionLiteral(
|
| name, function_name_location, function_name_validity, kind,
|
| - function_token_position, type, language_mode, ok);
|
| + function_token_position, type, language_mode, type_flags, ok);
|
| }
|
|
|
|
|
| @@ -419,7 +419,7 @@ PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
|
| is_generator ? FunctionKind::kGeneratorFunction
|
| : FunctionKind::kNormalFunction,
|
| pos, FunctionLiteral::kDeclaration, language_mode(),
|
| - CHECK_OK);
|
| + typesystem::kAllowSignature, CHECK_OK);
|
| return Statement::FunctionDeclaration();
|
| }
|
|
|
| @@ -546,8 +546,8 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
|
|
|
| is_pattern = pattern.IsObjectLiteral() || pattern.IsArrayLiteral();
|
|
|
| - // Optional type annotation.
|
| - if (scope_->typed() && Check(Token::COLON)) {
|
| + // Parse optional type annotation.
|
| + if (scope_->typed() && Check(Token::COLON)) { // Braces required here.
|
| ParseValidType(CHECK_OK);
|
| }
|
|
|
| @@ -1009,7 +1009,7 @@ PreParser::Expression PreParser::ParseFunctionLiteral(
|
| Identifier function_name, Scanner::Location function_name_location,
|
| FunctionNameValidity function_name_validity, FunctionKind kind,
|
| int function_token_pos, FunctionLiteral::FunctionType function_type,
|
| - LanguageMode language_mode, bool* ok) {
|
| + LanguageMode language_mode, typesystem::TypeFlags type_flags, bool* ok) {
|
| // Function ::
|
| // '(' FormalParameterList? ')' '{' FunctionBody '}'
|
|
|
| @@ -1023,6 +1023,12 @@ PreParser::Expression PreParser::ParseFunctionLiteral(
|
| DuplicateFinder duplicate_finder(scanner()->unicode_cache());
|
| ExpressionClassifier formals_classifier(this, &duplicate_finder);
|
|
|
| + // Parse optional type parameters.
|
| + if (scope_->typed() && !(type_flags & typesystem::kDisallowTypeParameters) &&
|
| + peek() == Token::LT) { // Braces required here.
|
| + ParseTypeParameters(CHECK_OK);
|
| + }
|
| +
|
| Expect(Token::LPAREN, CHECK_OK);
|
| int start_position = scanner()->location().beg_pos;
|
| function_scope->set_start_position(start_position);
|
| @@ -1040,6 +1046,18 @@ PreParser::Expression PreParser::ParseFunctionLiteral(
|
| (outer_is_script_scope && allow_lazy() && !parenthesized_function_);
|
| parenthesized_function_ = false;
|
|
|
| + // Parse optional type annotation.
|
| + if (scope_->typed() && Check(Token::COLON)) { // Braces required here.
|
| + ParseValidType(CHECK_OK);
|
| + }
|
| +
|
| + // Allow for a function signature (i.e., a literal without body).
|
| + if (peek() != Token::LBRACE && scope_->typed() &&
|
| + (type_flags & typesystem::kAllowSignature)) {
|
| + ExpectSemicolon(CHECK_OK);
|
| + return this->EmptyExpression();
|
| + }
|
| +
|
| Expect(Token::LBRACE, CHECK_OK);
|
| if (is_lazily_parsed) {
|
| ParseLazyFunctionLiteralBody(CHECK_OK);
|
|
|