| Index: src/expression-classifier.h
|
| diff --git a/src/expression-classifier.h b/src/expression-classifier.h
|
| deleted file mode 100644
|
| index 7392a7add8bd3c6ff63a8aba043c66cbfdb52ce8..0000000000000000000000000000000000000000
|
| --- a/src/expression-classifier.h
|
| +++ /dev/null
|
| @@ -1,304 +0,0 @@
|
| -// Copyright 2015 the V8 project authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef V8_EXPRESSION_CLASSIFIER_H
|
| -#define V8_EXPRESSION_CLASSIFIER_H
|
| -
|
| -#include "src/messages.h"
|
| -#include "src/scanner.h"
|
| -#include "src/token.h"
|
| -
|
| -namespace v8 {
|
| -namespace internal {
|
| -
|
| -
|
| -class ExpressionClassifier {
|
| - public:
|
| - struct Error {
|
| - Error()
|
| - : location(Scanner::Location::invalid()),
|
| - message(MessageTemplate::kNone),
|
| - arg(nullptr) {}
|
| -
|
| - Scanner::Location location;
|
| - MessageTemplate::Template message;
|
| - const char* arg;
|
| - };
|
| -
|
| - enum TargetProduction {
|
| - ExpressionProduction = 1 << 0,
|
| - FormalParameterInitializerProduction = 1 << 1,
|
| - BindingPatternProduction = 1 << 2,
|
| - AssignmentPatternProduction = 1 << 3,
|
| - DistinctFormalParametersProduction = 1 << 4,
|
| - StrictModeFormalParametersProduction = 1 << 5,
|
| - StrongModeFormalParametersProduction = 1 << 6,
|
| - ArrowFormalParametersProduction = 1 << 7,
|
| - LetPatternProduction = 1 << 8,
|
| -
|
| - ExpressionProductions =
|
| - (ExpressionProduction | FormalParameterInitializerProduction),
|
| - PatternProductions = (BindingPatternProduction |
|
| - AssignmentPatternProduction | LetPatternProduction),
|
| - FormalParametersProductions = (DistinctFormalParametersProduction |
|
| - StrictModeFormalParametersProduction |
|
| - StrongModeFormalParametersProduction),
|
| - StandardProductions = ExpressionProductions | PatternProductions,
|
| - AllProductions = (StandardProductions | FormalParametersProductions |
|
| - ArrowFormalParametersProduction)
|
| - };
|
| -
|
| - enum FunctionProperties { NonSimpleParameter = 1 << 0 };
|
| -
|
| - ExpressionClassifier()
|
| - : invalid_productions_(0),
|
| - function_properties_(0),
|
| - duplicate_finder_(nullptr) {}
|
| -
|
| - explicit ExpressionClassifier(DuplicateFinder* duplicate_finder)
|
| - : invalid_productions_(0),
|
| - function_properties_(0),
|
| - duplicate_finder_(duplicate_finder) {}
|
| -
|
| - bool is_valid(unsigned productions) const {
|
| - return (invalid_productions_ & productions) == 0;
|
| - }
|
| -
|
| - DuplicateFinder* duplicate_finder() const { return duplicate_finder_; }
|
| -
|
| - bool is_valid_expression() const { return is_valid(ExpressionProduction); }
|
| -
|
| - bool is_valid_formal_parameter_initializer() const {
|
| - return is_valid(FormalParameterInitializerProduction);
|
| - }
|
| -
|
| - bool is_valid_binding_pattern() const {
|
| - return is_valid(BindingPatternProduction);
|
| - }
|
| -
|
| - bool is_valid_assignment_pattern() const {
|
| - return is_valid(AssignmentPatternProduction);
|
| - }
|
| -
|
| - bool is_valid_arrow_formal_parameters() const {
|
| - return is_valid(ArrowFormalParametersProduction);
|
| - }
|
| -
|
| - bool is_valid_formal_parameter_list_without_duplicates() const {
|
| - return is_valid(DistinctFormalParametersProduction);
|
| - }
|
| -
|
| - // Note: callers should also check
|
| - // is_valid_formal_parameter_list_without_duplicates().
|
| - bool is_valid_strict_mode_formal_parameters() const {
|
| - return is_valid(StrictModeFormalParametersProduction);
|
| - }
|
| -
|
| - // Note: callers should also check is_valid_strict_mode_formal_parameters()
|
| - // and is_valid_formal_parameter_list_without_duplicates().
|
| - bool is_valid_strong_mode_formal_parameters() const {
|
| - return is_valid(StrongModeFormalParametersProduction);
|
| - }
|
| -
|
| - bool is_valid_let_pattern() const { return is_valid(LetPatternProduction); }
|
| -
|
| - const Error& expression_error() const { return expression_error_; }
|
| -
|
| - const Error& formal_parameter_initializer_error() const {
|
| - return formal_parameter_initializer_error_;
|
| - }
|
| -
|
| - const Error& binding_pattern_error() const { return binding_pattern_error_; }
|
| -
|
| - const Error& assignment_pattern_error() const {
|
| - return assignment_pattern_error_;
|
| - }
|
| -
|
| - const Error& arrow_formal_parameters_error() const {
|
| - return arrow_formal_parameters_error_;
|
| - }
|
| -
|
| - const Error& duplicate_formal_parameter_error() const {
|
| - return duplicate_formal_parameter_error_;
|
| - }
|
| -
|
| - const Error& strict_mode_formal_parameter_error() const {
|
| - return strict_mode_formal_parameter_error_;
|
| - }
|
| -
|
| - const Error& strong_mode_formal_parameter_error() const {
|
| - return strong_mode_formal_parameter_error_;
|
| - }
|
| -
|
| - const Error& let_pattern_error() const { return let_pattern_error_; }
|
| -
|
| - bool is_simple_parameter_list() const {
|
| - return !(function_properties_ & NonSimpleParameter);
|
| - }
|
| -
|
| - void RecordNonSimpleParameter() {
|
| - function_properties_ |= NonSimpleParameter;
|
| - }
|
| -
|
| - void RecordExpressionError(const Scanner::Location& loc,
|
| - MessageTemplate::Template message,
|
| - const char* arg = nullptr) {
|
| - if (!is_valid_expression()) return;
|
| - invalid_productions_ |= ExpressionProduction;
|
| - expression_error_.location = loc;
|
| - expression_error_.message = message;
|
| - expression_error_.arg = arg;
|
| - }
|
| -
|
| - void RecordFormalParameterInitializerError(const Scanner::Location& loc,
|
| - MessageTemplate::Template message,
|
| - const char* arg = nullptr) {
|
| - if (!is_valid_formal_parameter_initializer()) return;
|
| - invalid_productions_ |= FormalParameterInitializerProduction;
|
| - formal_parameter_initializer_error_.location = loc;
|
| - formal_parameter_initializer_error_.message = message;
|
| - formal_parameter_initializer_error_.arg = arg;
|
| - }
|
| -
|
| - void RecordBindingPatternError(const Scanner::Location& loc,
|
| - MessageTemplate::Template message,
|
| - const char* arg = nullptr) {
|
| - if (!is_valid_binding_pattern()) return;
|
| - invalid_productions_ |= BindingPatternProduction;
|
| - binding_pattern_error_.location = loc;
|
| - binding_pattern_error_.message = message;
|
| - binding_pattern_error_.arg = arg;
|
| - }
|
| -
|
| - void RecordAssignmentPatternError(const Scanner::Location& loc,
|
| - MessageTemplate::Template message,
|
| - const char* arg = nullptr) {
|
| - if (!is_valid_assignment_pattern()) return;
|
| - invalid_productions_ |= AssignmentPatternProduction;
|
| - assignment_pattern_error_.location = loc;
|
| - assignment_pattern_error_.message = message;
|
| - assignment_pattern_error_.arg = arg;
|
| - }
|
| -
|
| - void RecordArrowFormalParametersError(const Scanner::Location& loc,
|
| - MessageTemplate::Template message,
|
| - const char* arg = nullptr) {
|
| - if (!is_valid_arrow_formal_parameters()) return;
|
| - invalid_productions_ |= ArrowFormalParametersProduction;
|
| - arrow_formal_parameters_error_.location = loc;
|
| - arrow_formal_parameters_error_.message = message;
|
| - arrow_formal_parameters_error_.arg = arg;
|
| - }
|
| -
|
| - void RecordDuplicateFormalParameterError(const Scanner::Location& loc) {
|
| - if (!is_valid_formal_parameter_list_without_duplicates()) return;
|
| - invalid_productions_ |= DistinctFormalParametersProduction;
|
| - duplicate_formal_parameter_error_.location = loc;
|
| - duplicate_formal_parameter_error_.message = MessageTemplate::kParamDupe;
|
| - duplicate_formal_parameter_error_.arg = nullptr;
|
| - }
|
| -
|
| - // Record a binding that would be invalid in strict mode. Confusingly this
|
| - // is not the same as StrictFormalParameterList, which simply forbids
|
| - // duplicate bindings.
|
| - void RecordStrictModeFormalParameterError(const Scanner::Location& loc,
|
| - MessageTemplate::Template message,
|
| - const char* arg = nullptr) {
|
| - if (!is_valid_strict_mode_formal_parameters()) return;
|
| - invalid_productions_ |= StrictModeFormalParametersProduction;
|
| - strict_mode_formal_parameter_error_.location = loc;
|
| - strict_mode_formal_parameter_error_.message = message;
|
| - strict_mode_formal_parameter_error_.arg = arg;
|
| - }
|
| -
|
| - void RecordStrongModeFormalParameterError(const Scanner::Location& loc,
|
| - MessageTemplate::Template message,
|
| - const char* arg = nullptr) {
|
| - if (!is_valid_strong_mode_formal_parameters()) return;
|
| - invalid_productions_ |= StrongModeFormalParametersProduction;
|
| - strong_mode_formal_parameter_error_.location = loc;
|
| - strong_mode_formal_parameter_error_.message = message;
|
| - strong_mode_formal_parameter_error_.arg = arg;
|
| - }
|
| -
|
| - void RecordLetPatternError(const Scanner::Location& loc,
|
| - MessageTemplate::Template message,
|
| - const char* arg = nullptr) {
|
| - if (!is_valid_let_pattern()) return;
|
| - invalid_productions_ |= LetPatternProduction;
|
| - let_pattern_error_.location = loc;
|
| - let_pattern_error_.message = message;
|
| - let_pattern_error_.arg = arg;
|
| - }
|
| -
|
| - void Accumulate(const ExpressionClassifier& inner,
|
| - unsigned productions = StandardProductions) {
|
| - // Propagate errors from inner, but don't overwrite already recorded
|
| - // errors.
|
| - unsigned non_arrow_inner_invalid_productions =
|
| - inner.invalid_productions_ & ~ArrowFormalParametersProduction;
|
| - if (non_arrow_inner_invalid_productions == 0) return;
|
| - unsigned non_arrow_productions =
|
| - productions & ~ArrowFormalParametersProduction;
|
| - unsigned errors =
|
| - non_arrow_productions & non_arrow_inner_invalid_productions;
|
| - errors &= ~invalid_productions_;
|
| - if (errors != 0) {
|
| - invalid_productions_ |= errors;
|
| - if (errors & ExpressionProduction)
|
| - expression_error_ = inner.expression_error_;
|
| - if (errors & FormalParameterInitializerProduction)
|
| - formal_parameter_initializer_error_ =
|
| - inner.formal_parameter_initializer_error_;
|
| - if (errors & BindingPatternProduction)
|
| - binding_pattern_error_ = inner.binding_pattern_error_;
|
| - if (errors & AssignmentPatternProduction)
|
| - assignment_pattern_error_ = inner.assignment_pattern_error_;
|
| - if (errors & DistinctFormalParametersProduction)
|
| - duplicate_formal_parameter_error_ =
|
| - inner.duplicate_formal_parameter_error_;
|
| - if (errors & StrictModeFormalParametersProduction)
|
| - strict_mode_formal_parameter_error_ =
|
| - inner.strict_mode_formal_parameter_error_;
|
| - if (errors & StrongModeFormalParametersProduction)
|
| - strong_mode_formal_parameter_error_ =
|
| - inner.strong_mode_formal_parameter_error_;
|
| - if (errors & LetPatternProduction)
|
| - let_pattern_error_ = inner.let_pattern_error_;
|
| - }
|
| -
|
| - // As an exception to the above, the result continues to be a valid arrow
|
| - // formal parameters if the inner expression is a valid binding pattern.
|
| - if (productions & ArrowFormalParametersProduction &&
|
| - is_valid_arrow_formal_parameters()) {
|
| - // Also copy function properties if expecting an arrow function
|
| - // parameter.
|
| - function_properties_ |= inner.function_properties_;
|
| -
|
| - if (!inner.is_valid_binding_pattern()) {
|
| - invalid_productions_ |= ArrowFormalParametersProduction;
|
| - arrow_formal_parameters_error_ = inner.binding_pattern_error_;
|
| - }
|
| - }
|
| - }
|
| -
|
| - private:
|
| - unsigned invalid_productions_;
|
| - unsigned function_properties_;
|
| - Error expression_error_;
|
| - Error formal_parameter_initializer_error_;
|
| - Error binding_pattern_error_;
|
| - Error assignment_pattern_error_;
|
| - Error arrow_formal_parameters_error_;
|
| - Error duplicate_formal_parameter_error_;
|
| - Error strict_mode_formal_parameter_error_;
|
| - Error strong_mode_formal_parameter_error_;
|
| - Error let_pattern_error_;
|
| - DuplicateFinder* duplicate_finder_;
|
| -};
|
| -
|
| -} // namespace internal
|
| -} // namespace v8
|
| -
|
| -#endif // V8_EXPRESSION_CLASSIFIER_H
|
|
|