Index: src/expression-classifier.h |
diff --git a/src/expression-classifier.h b/src/expression-classifier.h |
index 7392a7add8bd3c6ff63a8aba043c66cbfdb52ce8..4ed47156572ae013b0e6f8bc7f087b98ee19cc87 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,21 @@ 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_.location = Scanner::Location::invalid(); |
+ } |
+ |
void Accumulate(const ExpressionClassifier& inner, |
unsigned productions = StandardProductions) { |
// Propagate errors from inner, but don't overwrite already recorded |
@@ -266,6 +297,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 |
@@ -283,6 +316,17 @@ class ExpressionClassifier { |
} |
} |
+ static const Error& FirdRecorded(const Error& a, const Error& b) { |
+ // Determine message which occurred earlier in source. Used by |
+ // ParserBase::ValidateExpression() |
+ DCHECK(a.location.IsValid() || b.location.IsValid()); |
+ if (a.location.beg_pos < 0) return b; |
+ if (b.location.beg_pos < 0 || b.location.beg_pos >= a.location.beg_pos) { |
+ return a; |
+ } |
+ return b; |
+ } |
+ |
private: |
unsigned invalid_productions_; |
unsigned function_properties_; |
@@ -295,6 +339,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_; |
}; |