| Index: src/expression-classifier.h
|
| diff --git a/src/expression-classifier.h b/src/expression-classifier.h
|
| index 7392a7add8bd3c6ff63a8aba043c66cbfdb52ce8..1bd0b6303a1e7deeb7b2ba733667bc9ef356456f 100644
|
| --- a/src/expression-classifier.h
|
| +++ b/src/expression-classifier.h
|
| @@ -36,6 +36,7 @@ class ExpressionClassifier {
|
| StrongModeFormalParametersProduction = 1 << 6,
|
| ArrowFormalParametersProduction = 1 << 7,
|
| LetPatternProduction = 1 << 8,
|
| + CoverInitializedNameProduction = 1 << 9,
|
|
|
| ExpressionProductions =
|
| (ExpressionProduction | FormalParameterInitializerProduction),
|
| @@ -45,8 +46,9 @@ class ExpressionClassifier {
|
| StrictModeFormalParametersProduction |
|
| StrongModeFormalParametersProduction),
|
| StandardProductions = ExpressionProductions | PatternProductions,
|
| - AllProductions = (StandardProductions | FormalParametersProductions |
|
| - ArrowFormalParametersProduction)
|
| + AllProductions =
|
| + (StandardProductions | FormalParametersProductions |
|
| + ArrowFormalParametersProduction | CoverInitializedNameProduction)
|
| };
|
|
|
| enum FunctionProperties { NonSimpleParameter = 1 << 0 };
|
| @@ -133,6 +135,13 @@ class ExpressionClassifier {
|
|
|
| const Error& let_pattern_error() const { return let_pattern_error_; }
|
|
|
| + bool has_cover_initialized_name() const {
|
| + return !is_valid(CoverInitializedNameProduction);
|
| + }
|
| + const Error& cover_initialized_name_error() const {
|
| + return cover_initialized_name_error_;
|
| + }
|
| +
|
| bool is_simple_parameter_list() const {
|
| return !(function_properties_ & NonSimpleParameter);
|
| }
|
| @@ -181,6 +190,13 @@ class ExpressionClassifier {
|
| assignment_pattern_error_.arg = arg;
|
| }
|
|
|
| + void RecordPatternError(const Scanner::Location& loc,
|
| + MessageTemplate::Template message,
|
| + const char* arg = nullptr) {
|
| + RecordBindingPatternError(loc, message, arg);
|
| + RecordAssignmentPatternError(loc, message, arg);
|
| + }
|
| +
|
| void RecordArrowFormalParametersError(const Scanner::Location& loc,
|
| MessageTemplate::Template message,
|
| const char* arg = nullptr) {
|
| @@ -232,6 +248,26 @@ class ExpressionClassifier {
|
| let_pattern_error_.arg = arg;
|
| }
|
|
|
| + void RecordCoverInitializedNameError(const Scanner::Location& loc,
|
| + MessageTemplate::Template message,
|
| + const char* arg = nullptr) {
|
| + if (has_cover_initialized_name()) return;
|
| + invalid_productions_ |= CoverInitializedNameProduction;
|
| + cover_initialized_name_error_.location = loc;
|
| + cover_initialized_name_error_.message = message;
|
| + cover_initialized_name_error_.arg = arg;
|
| + }
|
| +
|
| + void ForgiveCoverInitializedNameError() {
|
| + invalid_productions_ &= ~CoverInitializedNameProduction;
|
| + cover_initialized_name_error_ = Error();
|
| + }
|
| +
|
| + void ForgiveAssignmentPatternError() {
|
| + invalid_productions_ &= ~AssignmentPatternProduction;
|
| + assignment_pattern_error_ = Error();
|
| + }
|
| +
|
| void Accumulate(const ExpressionClassifier& inner,
|
| unsigned productions = StandardProductions) {
|
| // Propagate errors from inner, but don't overwrite already recorded
|
| @@ -266,6 +302,8 @@ class ExpressionClassifier {
|
| inner.strong_mode_formal_parameter_error_;
|
| if (errors & LetPatternProduction)
|
| let_pattern_error_ = inner.let_pattern_error_;
|
| + if (errors & CoverInitializedNameProduction)
|
| + cover_initialized_name_error_ = inner.cover_initialized_name_error_;
|
| }
|
|
|
| // As an exception to the above, the result continues to be a valid arrow
|
| @@ -295,6 +333,7 @@ class ExpressionClassifier {
|
| Error strict_mode_formal_parameter_error_;
|
| Error strong_mode_formal_parameter_error_;
|
| Error let_pattern_error_;
|
| + Error cover_initialized_name_error_;
|
| DuplicateFinder* duplicate_finder_;
|
| };
|
|
|
|
|