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

Unified Diff: src/parsing/parser-base.h

Issue 2133543003: [parser] report errors for invalid binding patterns in async formal parameters (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fixup Created 4 years, 5 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 | « src/parsing/expression-classifier.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parsing/parser-base.h
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
index a946cfa6bc825bbca6162cdaf4d97105f6c9aa4c..f3e65cb8d6135d736d23b83777c8dd40bf798957 100644
--- a/src/parsing/parser-base.h
+++ b/src/parsing/parser-base.h
@@ -897,15 +897,17 @@ class ParserBase : public Traits {
ExpressionT expr,
bool parenthesized_formals, bool is_async,
bool* ok) {
- if (classifier->is_valid_binding_pattern()) {
+ if (!is_async && classifier->is_valid_binding_pattern() &&
+ !this->IsIdentifier(expr)) {
nickie 2016/07/12 12:27:13 Merging the conditions and removing the "else" cha
// A simple arrow formal parameter: IDENTIFIER => BODY.
- if (!this->IsIdentifier(expr)) {
- Traits::ReportMessageAt(scanner()->location(),
- MessageTemplate::kUnexpectedToken,
- Token::String(scanner()->current_token()));
- *ok = false;
- }
- } else if (!classifier->is_valid_arrow_formal_parameters()) {
+ Traits::ReportMessageAt(scanner()->location(),
+ MessageTemplate::kUnexpectedToken,
+ Token::String(scanner()->current_token()));
+ *ok = false;
+ return;
+ }
+
+ if (!classifier->is_valid_arrow_formal_parameters()) {
// If after parsing the expr, we see an error but the expression is
// neither a valid binding pattern nor a valid parenthesized formal
// parameter list, show the "arrow formal parameters" error if the formals
@@ -915,12 +917,22 @@ class ParserBase : public Traits {
: classifier->binding_pattern_error();
ReportClassifierError(error);
*ok = false;
+ return;
}
- if (is_async && !classifier->is_valid_async_arrow_formal_parameters()) {
- const typename ExpressionClassifier::Error& error =
- classifier->async_arrow_formal_parameters_error();
- ReportClassifierError(error);
- *ok = false;
+
+ if (is_async) {
+ if (!classifier->is_valid_async_arrow_formal_parameters()) {
+ const typename ExpressionClassifier::Error& error =
+ classifier->async_arrow_formal_parameters_error();
+ ReportClassifierError(error);
+ *ok = false;
+ return;
+ }
+ if (!classifier->is_valid_binding_pattern()) {
+ ReportClassifierError(classifier->binding_pattern_error());
+ *ok = false;
+ return;
+ }
}
}
@@ -1024,7 +1036,12 @@ class ParserBase : public Traits {
ExpressionT ParseAssignmentExpression(bool accept_IN,
ExpressionClassifier* classifier,
- bool* ok);
+ bool merge_patterns, bool* ok);
+ ExpressionT ParseAssignmentExpression(bool accept_IN,
+ ExpressionClassifier* classifier,
+ bool* ok) {
+ return ParseAssignmentExpression(accept_IN, classifier, false, ok);
+ }
ExpressionT ParseYieldExpression(bool accept_IN,
ExpressionClassifier* classifier, bool* ok);
ExpressionT ParseTailCallExpression(ExpressionClassifier* classifier,
@@ -2172,7 +2189,7 @@ typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments(
int expr_pos = peek_position();
ExpressionT argument = this->ParseAssignmentExpression(
- true, classifier, CHECK_OK_CUSTOM(NullExpressionList));
+ true, classifier, maybe_arrow, CHECK_OK_CUSTOM(NullExpressionList));
CheckNoTailCallExpressions(classifier, CHECK_OK_CUSTOM(NullExpressionList));
if (!maybe_arrow) {
Traits::RewriteNonPattern(classifier,
@@ -2239,7 +2256,7 @@ template <class Traits>
typename ParserBase<Traits>::ExpressionT
ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
ExpressionClassifier* classifier,
- bool* ok) {
+ bool merge_patterns, bool* ok) {
// AssignmentExpression ::
// ConditionalExpression
// ArrowFunction
@@ -2331,14 +2348,18 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
// "expression" was not itself an arrow function parameter list, but it might
// form part of one. Propagate speculative formal parameter error locations.
// Do not merge pending non-pattern expressions yet!
- classifier->Accumulate(
- &arrow_formals_classifier,
+ int productions_to_propagate =
ExpressionClassifier::StandardProductions |
- ExpressionClassifier::FormalParametersProductions |
- ExpressionClassifier::CoverInitializedNameProduction |
- ExpressionClassifier::AsyncArrowFormalParametersProduction |
- ExpressionClassifier::AsyncBindingPatternProduction,
- false);
+ ExpressionClassifier::FormalParametersProductions |
+ ExpressionClassifier::CoverInitializedNameProduction |
+ ExpressionClassifier::AsyncArrowFormalParametersProduction |
+ ExpressionClassifier::AsyncBindingPatternProduction;
+ if (merge_patterns) {
+ productions_to_propagate |= ExpressionClassifier::BindingPatternProduction;
+ }
+
+ classifier->Accumulate(&arrow_formals_classifier, productions_to_propagate,
+ false);
if (!Token::IsAssignmentOp(peek())) {
// Parsed conditional expression only (no assignment).
@@ -2805,7 +2826,16 @@ ParserBase<Traits>::ParseLeftHandSideExpression(
CheckNoTailCallExpressions(classifier, CHECK_OK);
int pos;
Traits::RewriteNonPattern(classifier, CHECK_OK);
- BindingPatternUnexpectedToken(classifier);
+
+ const char* arg;
+ MessageTemplate::Template message = MessageTemplate::kUnexpectedToken;
+ Scanner::Location location = scanner()->peek_location();
+ GetUnexpectedTokenMessage(peek(), &message, &location, &arg);
+
+ if (!is_async) {
+ classifier->RecordBindingPatternError(location, message, arg);
+ }
+
if (scanner()->current_token() == Token::IDENTIFIER ||
scanner()->current_token() == Token::SUPER ||
scanner()->current_token() == Token::ASYNC) {
@@ -2837,6 +2867,8 @@ ParserBase<Traits>::ParseLeftHandSideExpression(
}
// async () => ...
return factory()->NewEmptyParentheses(pos);
+ } else {
+ classifier->ReplaceBindingPatternError(location, message, arg);
}
ArrowFormalParametersUnexpectedToken(classifier);
« no previous file with comments | « src/parsing/expression-classifier.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698