Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index f38af71614f9e9946dd54d4e3c6e343248a0b636..a3ba093d16855812a14943b2fd19189542b7050a 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -135,9 +135,38 @@ struct FormalParametersBase { |
// Used in functions where the return type is ExpressionT. |
#define CHECK_OK CHECK_OK_CUSTOM(EmptyExpression) |
+// Common base class template shared between parser and pre-parser. |
+// The Impl parameter is the actual class of the parser/pre-parser, |
+// following the Curiously Recurring Template Pattern (CRTP). |
+// The structure of the parser objects is roughly the following: |
+// |
+// // Common denominator, needed to avoid cyclic dependency. |
+// // Instances of this template will end up with very minimal |
+// // definitions, ideally containing just typedefs. |
+// template <typename Impl> |
+// class ParserBaseTraits; |
+ |
+// // The parser base object, which should just implement pure |
+// // parser behavior. The Impl parameter is the actual derived |
+// // class (according to CRTP), which implements impure parser |
+// // behavior. |
+// template <typename Impl> |
+// class ParserBase : public ParserBaseTraits<Impl> { ... }; |
+// |
+// // And then, for each parser variant (e.g., parser, preparser, etc): |
+// class Parser; |
+// |
+// template <> |
+// class ParserBaseTraits<Parser> { ... }; |
+// |
+// class Parser : public ParserBase<Parser> { ... }; |
+// |
+// TODO(nikolaos): Currently the traits objects contain many things |
+// that will be moved to the implementation objects or to the parser |
+// base. The following comments will have to change, when this happens. |
-// Common base class shared between parser and pre-parser. Traits encapsulate |
-// the differences between Parser and PreParser: |
+// The traits class template encapsulates the differences between |
+// parser/pre-parser implementations. In particular: |
// - Return types: For example, Parser functions return Expression* and |
// PreParser functions return PreParserExpression. |
@@ -155,33 +184,40 @@ struct FormalParametersBase { |
// pretenured, and PreParser doesn't care. |
// The traits are expected to contain the following typedefs: |
-// struct Traits { |
+// template <> |
+// class ParserBaseTraits<Impl> { |
// // In particular... |
// struct Type { |
-// // Used by FunctionState and BlockState. |
-// typedef Scope; |
// typedef GeneratorVariable; |
+// typedef AstProperties; |
+// typedef ExpressionClassifier; |
// // Return types for traversing functions. |
// typedef Identifier; |
// typedef Expression; |
+// typedef YieldExpression; |
// typedef FunctionLiteral; |
// typedef ClassLiteral; |
-// typedef ObjectLiteralProperty; |
// typedef Literal; |
+// typedef ObjectLiteralProperty; |
// typedef ExpressionList; |
// typedef PropertyList; |
// typedef FormalParameter; |
// typedef FormalParameters; |
+// typedef StatementList; |
// // For constructing objects returned by the traversing functions. |
// typedef Factory; |
// }; |
// // ... |
// }; |
-template <typename Traits> |
-class ParserBase : public Traits { |
+template <typename Impl> |
+class ParserBaseTraits; |
+ |
+template <typename Impl> |
+class ParserBase : public ParserBaseTraits<Impl> { |
public: |
// Shorten type names defined by Traits. |
+ typedef ParserBaseTraits<Impl> Traits; |
typedef typename Traits::Type::Expression ExpressionT; |
typedef typename Traits::Type::Identifier IdentifierT; |
typedef typename Traits::Type::FormalParameter FormalParameterT; |
@@ -192,11 +228,14 @@ class ParserBase : public Traits { |
typedef typename Traits::Type::StatementList StatementListT; |
typedef typename Traits::Type::ExpressionClassifier ExpressionClassifier; |
+ // All implementation-specific methods must be called through this. |
+ Impl* impl() { return static_cast<Impl*>(this); } |
+ const Impl* impl() const { return static_cast<const Impl*>(this); } |
+ |
ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit, |
v8::Extension* extension, AstValueFactory* ast_value_factory, |
- ParserRecorder* log, typename Traits::Type::Parser this_object) |
- : Traits(this_object), |
- scope_state_(nullptr), |
+ ParserRecorder* log) |
+ : scope_state_(nullptr), |
function_state_(nullptr), |
extension_(extension), |
fni_(nullptr), |
@@ -515,8 +554,7 @@ class ParserBase : public Traits { |
// to this function. Filled in by constructor. |
bool this_function_is_parenthesized_; |
- friend class ParserTraits; |
- friend class PreParserTraits; |
+ friend class ParserBaseTraits<Impl>; |
friend class Checkpoint; |
}; |
@@ -1275,8 +1313,8 @@ class ParserBase : public Traits { |
friend class DiscardableZoneScope; |
}; |
-template <class Traits> |
-ParserBase<Traits>::FunctionState::FunctionState( |
+template <typename Impl> |
+ParserBase<Impl>::FunctionState::FunctionState( |
FunctionState** function_state_stack, ScopeState** scope_stack, |
Scope* scope, FunctionKind kind) |
: ScopeState(scope_stack, scope), |
@@ -1301,14 +1339,13 @@ ParserBase<Traits>::FunctionState::FunctionState( |
} |
} |
- |
-template <class Traits> |
-ParserBase<Traits>::FunctionState::~FunctionState() { |
+template <typename Impl> |
+ParserBase<Impl>::FunctionState::~FunctionState() { |
*function_state_stack_ = outer_function_state_; |
} |
-template <class Traits> |
-void ParserBase<Traits>::GetUnexpectedTokenMessage( |
+template <typename Impl> |
+void ParserBase<Impl>::GetUnexpectedTokenMessage( |
Token::Value token, MessageTemplate::Template* message, |
Scanner::Location* location, const char** arg, |
MessageTemplate::Template default_) { |
@@ -1366,15 +1403,13 @@ void ParserBase<Traits>::GetUnexpectedTokenMessage( |
} |
} |
- |
-template <class Traits> |
-void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) { |
+template <typename Impl> |
+void ParserBase<Impl>::ReportUnexpectedToken(Token::Value token) { |
return ReportUnexpectedTokenAt(scanner_->location(), token); |
} |
- |
-template <class Traits> |
-void ParserBase<Traits>::ReportUnexpectedTokenAt( |
+template <typename Impl> |
+void ParserBase<Impl>::ReportUnexpectedTokenAt( |
Scanner::Location source_location, Token::Value token, |
MessageTemplate::Template message) { |
const char* arg; |
@@ -1382,9 +1417,8 @@ void ParserBase<Traits>::ReportUnexpectedTokenAt( |
Traits::ReportMessageAt(source_location, message, arg); |
} |
- |
-template <class Traits> |
-typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( |
+template <typename Impl> |
+typename ParserBase<Impl>::IdentifierT ParserBase<Impl>::ParseIdentifier( |
AllowRestrictedIdentifiers allow_restricted_identifiers, bool* ok) { |
ExpressionClassifier classifier(this); |
auto result = |
@@ -1398,11 +1432,10 @@ typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( |
return result; |
} |
- |
-template <class Traits> |
-typename ParserBase<Traits>::IdentifierT |
-ParserBase<Traits>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::IdentifierT |
+ParserBase<Impl>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
+ bool* ok) { |
Token::Value next = Next(); |
if (next == Token::IDENTIFIER || next == Token::ASYNC || |
(next == Token::AWAIT && !parsing_module_ && !is_async_function())) { |
@@ -1457,9 +1490,9 @@ ParserBase<Traits>::ParseAndClassifyIdentifier(ExpressionClassifier* classifier, |
} |
} |
-template <class Traits> |
-typename ParserBase<Traits>::IdentifierT |
-ParserBase<Traits>::ParseIdentifierOrStrictReservedWord( |
+template <class Impl> |
+typename ParserBase<Impl>::IdentifierT |
+ParserBase<Impl>::ParseIdentifierOrStrictReservedWord( |
FunctionKind function_kind, bool* is_strict_reserved, bool* ok) { |
Token::Value next = Next(); |
if (next == Token::IDENTIFIER || (next == Token::AWAIT && !parsing_module_ && |
@@ -1479,9 +1512,9 @@ ParserBase<Traits>::ParseIdentifierOrStrictReservedWord( |
return this->GetSymbol(scanner()); |
} |
-template <class Traits> |
-typename ParserBase<Traits>::IdentifierT |
-ParserBase<Traits>::ParseIdentifierName(bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::IdentifierT ParserBase<Impl>::ParseIdentifierName( |
+ bool* ok) { |
Token::Value next = Next(); |
if (next != Token::IDENTIFIER && next != Token::ASYNC && |
next != Token::ENUM && next != Token::AWAIT && next != Token::LET && |
@@ -1497,8 +1530,8 @@ ParserBase<Traits>::ParseIdentifierName(bool* ok) { |
return this->GetSymbol(scanner()); |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseRegExpLiteral( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseRegExpLiteral( |
bool* ok) { |
int pos = peek_position(); |
if (!scanner()->ScanRegExpPattern()) { |
@@ -1523,11 +1556,9 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseRegExpLiteral( |
return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos); |
} |
- |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier, |
- bool* is_async, bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePrimaryExpression( |
+ ExpressionClassifier* classifier, bool* is_async, bool* ok) { |
// PrimaryExpression :: |
// 'this' |
// 'null' |
@@ -1704,9 +1735,8 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier, |
return this->EmptyExpression(); |
} |
- |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseExpression( |
bool accept_IN, bool* ok) { |
ExpressionClassifier classifier(this); |
ExpressionT result = ParseExpression(accept_IN, &classifier, CHECK_OK); |
@@ -1714,8 +1744,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( |
return result; |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseExpression( |
bool accept_IN, ExpressionClassifier* classifier, bool* ok) { |
// Expression :: |
// AssignmentExpression |
@@ -1779,9 +1809,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( |
return result; |
} |
- |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral( |
ExpressionClassifier* classifier, bool* ok) { |
// ArrayLiteral :: |
// '[' Expression? (',' Expression?)* ']' |
@@ -1856,8 +1885,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
return result; |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName( |
+template <class Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePropertyName( |
IdentifierT* name, bool* is_get, bool* is_set, bool* is_computed_name, |
ExpressionClassifier* classifier, bool* ok) { |
Token::Value token = peek(); |
@@ -1913,9 +1942,9 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName( |
: factory()->NewStringLiteral(*name, pos); |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ObjectLiteralPropertyT |
-ParserBase<Traits>::ParsePropertyDefinition( |
+template <typename Impl> |
+typename ParserBase<Impl>::ObjectLiteralPropertyT |
+ParserBase<Impl>::ParsePropertyDefinition( |
ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends, |
MethodKind method_kind, bool* is_computed_name, bool* has_seen_constructor, |
ExpressionClassifier* classifier, IdentifierT* name, bool* ok) { |
@@ -2131,9 +2160,8 @@ ParserBase<Traits>::ParsePropertyDefinition( |
return this->EmptyObjectLiteralProperty(); |
} |
- |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseObjectLiteral( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral( |
ExpressionClassifier* classifier, bool* ok) { |
// ObjectLiteral :: |
// '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}' |
@@ -2188,10 +2216,11 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseObjectLiteral( |
pos); |
} |
-template <class Traits> |
-typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments( |
- Scanner::Location* first_spread_arg_loc, bool maybe_arrow, |
- ExpressionClassifier* classifier, bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::Traits::Type::ExpressionList |
+ParserBase<Impl>::ParseArguments(Scanner::Location* first_spread_arg_loc, |
+ bool maybe_arrow, |
+ ExpressionClassifier* classifier, bool* ok) { |
// Arguments :: |
// '(' (AssignmentExpression)*[','] ')' |
@@ -2271,11 +2300,11 @@ typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments( |
} |
// Precedence = 2 |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
- ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, |
+ ExpressionClassifier* classifier, |
+ bool* ok) { |
// AssignmentExpression :: |
// ConditionalExpression |
// ArrowFunction |
@@ -2289,7 +2318,7 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
} |
FuncNameInferrer::State fni_state(fni_); |
- ParserBase<Traits>::Checkpoint checkpoint(this); |
+ Checkpoint checkpoint(this); |
ExpressionClassifier arrow_formals_classifier(this, |
classifier->duplicate_finder()); |
@@ -2478,11 +2507,9 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
return result; |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseYieldExpression(bool accept_IN, |
- ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseYieldExpression( |
+ bool accept_IN, ExpressionClassifier* classifier, bool* ok) { |
// YieldExpression :: |
// 'yield' ([no line terminator] '*'? AssignmentExpression)? |
int pos = peek_position(); |
@@ -2531,10 +2558,10 @@ ParserBase<Traits>::ParseYieldExpression(bool accept_IN, |
return yield; |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseTailCallExpression(ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseTailCallExpression(ExpressionClassifier* classifier, |
+ bool* ok) { |
// TailCallExpression:: |
// 'continue' MemberExpression Arguments |
// 'continue' CallExpression Arguments |
@@ -2594,11 +2621,11 @@ ParserBase<Traits>::ParseTailCallExpression(ExpressionClassifier* classifier, |
} |
// Precedence = 3 |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseConditionalExpression(bool accept_IN, |
- ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseConditionalExpression(bool accept_IN, |
+ ExpressionClassifier* classifier, |
+ bool* ok) { |
// ConditionalExpression :: |
// LogicalOrExpression |
// LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression |
@@ -2627,11 +2654,9 @@ ParserBase<Traits>::ParseConditionalExpression(bool accept_IN, |
// Precedence >= 4 |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, |
- ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseBinaryExpression( |
+ int prec, bool accept_IN, ExpressionClassifier* classifier, bool* ok) { |
DCHECK(prec >= 4); |
ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK); |
for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { |
@@ -2685,11 +2710,9 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, |
return x; |
} |
- |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseUnaryExpression( |
+ ExpressionClassifier* classifier, bool* ok) { |
// UnaryExpression :: |
// PostfixExpression |
// 'delete' UnaryExpression |
@@ -2765,11 +2788,9 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier, |
} |
} |
- |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParsePostfixExpression( |
+ ExpressionClassifier* classifier, bool* ok) { |
// PostfixExpression :: |
// LeftHandSideExpression ('++' | '--')? |
@@ -2798,10 +2819,10 @@ ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier, |
return expression; |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseLeftHandSideExpression( |
- ExpressionClassifier* classifier, bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseLeftHandSideExpression(ExpressionClassifier* classifier, |
+ bool* ok) { |
// LeftHandSideExpression :: |
// (NewExpression | MemberExpression) ... |
@@ -2946,9 +2967,9 @@ ParserBase<Traits>::ParseLeftHandSideExpression( |
} |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseMemberWithNewPrefixesExpression( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseMemberWithNewPrefixesExpression( |
ExpressionClassifier* classifier, bool* is_async, bool* ok) { |
// NewExpression :: |
// ('new')+ MemberExpression |
@@ -3011,10 +3032,9 @@ ParserBase<Traits>::ParseMemberWithNewPrefixesExpression( |
return this->ParseMemberExpression(classifier, is_async, ok); |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseMemberExpression(ExpressionClassifier* classifier, |
- bool* is_async, bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseMemberExpression( |
+ ExpressionClassifier* classifier, bool* is_async, bool* ok) { |
// MemberExpression :: |
// (PrimaryExpression | FunctionLiteral | ClassLiteral) |
// ('[' Expression ']' | '.' Identifier | Arguments | TemplateLiteral)* |
@@ -3080,9 +3100,9 @@ ParserBase<Traits>::ParseMemberExpression(ExpressionClassifier* classifier, |
return result; |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseSuperExpression( |
+ bool is_new, bool* ok) { |
Expect(Token::SUPER, CHECK_OK); |
int pos = position(); |
@@ -3108,10 +3128,10 @@ ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) { |
return this->EmptyExpression(); |
} |
-template <class Traits> |
-void ParserBase<Traits>::ExpectMetaProperty(Vector<const char> property_name, |
- const char* full_name, int pos, |
- bool* ok) { |
+template <typename Impl> |
+void ParserBase<Impl>::ExpectMetaProperty(Vector<const char> property_name, |
+ const char* full_name, int pos, |
+ bool* ok) { |
Consume(Token::PERIOD); |
ExpectContextualKeyword(property_name, CHECK_OK_CUSTOM(Void)); |
if (scanner()->literal_contains_escapes()) { |
@@ -3122,9 +3142,9 @@ void ParserBase<Traits>::ExpectMetaProperty(Vector<const char> property_name, |
} |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseNewTargetExpression(bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseNewTargetExpression(bool* ok) { |
int pos = position(); |
ExpectMetaProperty(CStrVector("target"), "new.target", pos, CHECK_OK); |
@@ -3138,9 +3158,9 @@ ParserBase<Traits>::ParseNewTargetExpression(bool* ok) { |
return this->NewTargetExpression(pos); |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseMemberExpressionContinuation( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseMemberExpressionContinuation( |
ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, |
bool* ok) { |
// Parses this part of MemberExpression: |
@@ -3214,10 +3234,10 @@ ParserBase<Traits>::ParseMemberExpressionContinuation( |
return this->EmptyExpression(); |
} |
- |
-template <class Traits> |
-void ParserBase<Traits>::ParseFormalParameter( |
- FormalParametersT* parameters, ExpressionClassifier* classifier, bool* ok) { |
+template <typename Impl> |
+void ParserBase<Impl>::ParseFormalParameter(FormalParametersT* parameters, |
+ ExpressionClassifier* classifier, |
+ bool* ok) { |
// FormalParameter[Yield,GeneratorParameter] : |
// BindingElement[?Yield, ?GeneratorParameter] |
bool is_rest = parameters->has_rest; |
@@ -3250,9 +3270,8 @@ void ParserBase<Traits>::ParseFormalParameter( |
scanner()->location().end_pos, is_rest); |
} |
- |
-template <class Traits> |
-void ParserBase<Traits>::ParseFormalParameterList( |
+template <typename Impl> |
+void ParserBase<Impl>::ParseFormalParameterList( |
FormalParametersT* parameters, ExpressionClassifier* classifier, bool* ok) { |
// FormalParameters[Yield] : |
// [empty] |
@@ -3302,12 +3321,12 @@ void ParserBase<Traits>::ParseFormalParameterList( |
} |
} |
-template <class Traits> |
-void ParserBase<Traits>::CheckArityRestrictions(int param_count, |
- FunctionKind function_kind, |
- bool has_rest, |
- int formals_start_pos, |
- int formals_end_pos, bool* ok) { |
+template <typename Impl> |
+void ParserBase<Impl>::CheckArityRestrictions(int param_count, |
+ FunctionKind function_kind, |
+ bool has_rest, |
+ int formals_start_pos, |
+ int formals_end_pos, bool* ok) { |
if (IsGetterFunction(function_kind)) { |
if (param_count != 0) { |
ReportMessageAt(Scanner::Location(formals_start_pos, formals_end_pos), |
@@ -3328,9 +3347,8 @@ void ParserBase<Traits>::CheckArityRestrictions(int param_count, |
} |
} |
- |
-template <class Traits> |
-bool ParserBase<Traits>::IsNextLetKeyword() { |
+template <typename Impl> |
+bool ParserBase<Impl>::IsNextLetKeyword() { |
DCHECK(peek() == Token::LET); |
Token::Value next_next = PeekAhead(); |
switch (next_next) { |
@@ -3354,8 +3372,8 @@ bool ParserBase<Traits>::IsNextLetKeyword() { |
} |
} |
-template <class Traits> |
-bool ParserBase<Traits>::IsTrivialExpression() { |
+template <typename Impl> |
+bool ParserBase<Impl>::IsTrivialExpression() { |
Token::Value peek_token = peek(); |
if (peek_token == Token::SMI || peek_token == Token::NUMBER || |
peek_token == Token::NULL_LITERAL || peek_token == Token::TRUE_LITERAL || |
@@ -3372,9 +3390,9 @@ bool ParserBase<Traits>::IsTrivialExpression() { |
return false; |
} |
-template <class Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseArrowFunctionLiteral( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::ParseArrowFunctionLiteral( |
bool accept_IN, const FormalParametersT& formal_parameters, bool is_async, |
const ExpressionClassifier& formals_classifier, bool* ok) { |
if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { |
@@ -3491,12 +3509,9 @@ ParserBase<Traits>::ParseArrowFunctionLiteral( |
return function_literal; |
} |
- |
-template <typename Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::ParseTemplateLiteral(ExpressionT tag, int start, |
- ExpressionClassifier* classifier, |
- bool* ok) { |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( |
+ ExpressionT tag, int start, ExpressionClassifier* classifier, bool* ok) { |
// A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal |
// text followed by a substitution expression), finalized by a single |
// TEMPLATE_TAIL. |
@@ -3588,20 +3603,18 @@ ParserBase<Traits>::ParseTemplateLiteral(ExpressionT tag, int start, |
return Traits::CloseTemplateLiteral(&ts, start, tag); |
} |
- |
-template <typename Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::CheckAndRewriteReferenceExpression( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::CheckAndRewriteReferenceExpression( |
ExpressionT expression, int beg_pos, int end_pos, |
MessageTemplate::Template message, bool* ok) { |
return this->CheckAndRewriteReferenceExpression(expression, beg_pos, end_pos, |
message, kReferenceError, ok); |
} |
- |
-template <typename Traits> |
-typename ParserBase<Traits>::ExpressionT |
-ParserBase<Traits>::CheckAndRewriteReferenceExpression( |
+template <typename Impl> |
+typename ParserBase<Impl>::ExpressionT |
+ParserBase<Impl>::CheckAndRewriteReferenceExpression( |
ExpressionT expression, int beg_pos, int end_pos, |
MessageTemplate::Template message, ParseErrorType type, bool* ok) { |
if (this->IsIdentifier(expression) && is_strict(language_mode()) && |
@@ -3625,15 +3638,13 @@ ParserBase<Traits>::CheckAndRewriteReferenceExpression( |
return this->EmptyExpression(); |
} |
- |
-template <typename Traits> |
-bool ParserBase<Traits>::IsValidReferenceExpression(ExpressionT expression) { |
+template <typename Impl> |
+bool ParserBase<Impl>::IsValidReferenceExpression(ExpressionT expression) { |
return this->IsAssignableIdentifier(expression) || expression->IsProperty(); |
} |
- |
-template <typename Traits> |
-void ParserBase<Traits>::CheckDestructuringElement( |
+template <typename Impl> |
+void ParserBase<Impl>::CheckDestructuringElement( |
ExpressionT expression, ExpressionClassifier* classifier, int begin, |
int end) { |
if (!IsValidPattern(expression) && !expression->IsAssignment() && |
@@ -3648,8 +3659,8 @@ void ParserBase<Traits>::CheckDestructuringElement( |
#undef CHECK_OK |
#undef CHECK_OK_CUSTOM |
-template <typename Traits> |
-void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( |
+template <typename Impl> |
+void ParserBase<Impl>::ObjectLiteralChecker::CheckProperty( |
Token::Value property, PropertyKind type, MethodKind method_type, |
ExpressionClassifier* classifier, bool* ok) { |
DCHECK(!IsStaticMethod(method_type)); |
@@ -3667,8 +3678,8 @@ void ParserBase<Traits>::ObjectLiteralChecker::CheckProperty( |
} |
} |
-template <typename Traits> |
-void ParserBase<Traits>::ClassLiteralChecker::CheckProperty( |
+template <typename Impl> |
+void ParserBase<Impl>::ClassLiteralChecker::CheckProperty( |
Token::Value property, PropertyKind type, MethodKind method_type, |
ExpressionClassifier* classifier, bool* ok) { |
DCHECK(type == kMethodProperty || type == kAccessorProperty); |