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

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

Issue 2279773002: [parser] Clean up type definitions (Closed)
Patch Set: Created 4 years, 4 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/parser.cc ('k') | src/parsing/preparser.h » ('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 7712fd3dc4539ae5a7d88608b4b9b0e080e4cd18..c3807349b1f601a4365b570901e9dbf26235b033 100644
--- a/src/parsing/parser-base.h
+++ b/src/parsing/parser-base.h
@@ -140,88 +140,80 @@ struct FormalParametersBase {
// 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.
+// // A structure template containing type definitions, needed to
+// // avoid a cyclic dependency.
// template <typename Impl>
-// class ParserBaseTraits;
-
+// struct ParserTypes;
+//
// // 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> { ... };
+// class ParserBase { ... };
//
// // And then, for each parser variant (e.g., parser, preparser, etc):
// class Parser;
//
// template <>
-// class ParserBaseTraits<Parser> { ... };
+// class ParserTypes<Parser> { ... };
//
// class Parser : public ParserBase<Parser> { ... };
//
-// 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.
-
-// - Creating parse tree nodes: Parser generates an AST during the recursive
-// descent. PreParser doesn't create a tree. Instead, it passes around minimal
-// data objects (PreParserExpression, PreParserIdentifier etc.) which contain
-// just enough data for the upper layer functions. PreParserFactory is
-// responsible for creating these dummy objects. It provides a similar kind of
-// interface as AstNodeFactory, so ParserBase doesn't need to care which one is
-// used.
-
-// The traits are expected to contain the following typedefs:
+// The parser base object implements pure parsing, according to the
+// language grammar. Different parser implementations may exhibit
+// different parser-driven behavior that is not considered as pure
+// parsing, e.g., early error detection and reporting, AST generation, etc.
+
+// The ParserTypes structure encapsulates the differences in the
+// types used in parsing methods. E.g., Parser methods use Expression*
+// and PreParser methods use PreParserExpression. For any given parser
+// implementation class Impl, it is expected to contain the following typedefs:
+//
// template <>
-// class ParserBaseTraits<Impl> {
-// // In particular...
-// struct Type {
-// // Synonyms for ParserBase<Impl> and Impl, respectively.
-// typedef Base;
-// typedef Impl;
-// typedef GeneratorVariable;
-// typedef AstProperties;
-// typedef ExpressionClassifier;
-// // Return types for traversing functions.
-// typedef Identifier;
-// typedef Expression;
-// typedef YieldExpression;
-// typedef FunctionLiteral;
-// typedef ClassLiteral;
-// typedef Literal;
-// typedef ObjectLiteralProperty;
-// typedef ExpressionList;
-// typedef PropertyList;
-// typedef FormalParameter;
-// typedef FormalParameters;
-// typedef StatementList;
-// // For constructing objects returned by the traversing functions.
-// typedef Factory;
-// };
-// // ...
+// struct ParserTypes<Impl> {
+// // Synonyms for ParserBase<Impl> and Impl, respectively.
+// typedef Base;
+// typedef Impl;
+// // TODO(nikolaos): these three will probably go away, as they are
+// // not related to pure parsing.
+// typedef GeneratorVariable;
+// typedef AstProperties;
+// typedef ExpressionClassifier;
+// // Return types for traversing functions.
+// typedef Identifier;
+// typedef Expression;
+// typedef YieldExpression;
+// typedef FunctionLiteral;
+// typedef ClassLiteral;
+// 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 Impl>
-class ParserBaseTraits;
+struct ParserTypes;
template <typename Impl>
-class ParserBase : public ParserBaseTraits<Impl> {
+class ParserBase {
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;
- typedef typename Traits::Type::FormalParameters FormalParametersT;
- typedef typename Traits::Type::FunctionLiteral FunctionLiteralT;
- typedef typename Traits::Type::Literal LiteralT;
- typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT;
- typedef typename Traits::Type::StatementList StatementListT;
- typedef typename Traits::Type::ExpressionClassifier ExpressionClassifier;
+ // Shorten type names defined by ParserTypes<Impl>.
+ typedef ParserTypes<Impl> Types;
+ typedef typename Types::Expression ExpressionT;
+ typedef typename Types::Identifier IdentifierT;
+ typedef typename Types::FormalParameter FormalParameterT;
+ typedef typename Types::FormalParameters FormalParametersT;
+ typedef typename Types::FunctionLiteral FunctionLiteralT;
+ typedef typename Types::Literal LiteralT;
+ typedef typename Types::ObjectLiteralProperty ObjectLiteralPropertyT;
+ typedef typename Types::StatementList StatementListT;
+ typedef typename Types::ExpressionClassifier ExpressionClassifier;
// All implementation-specific methods must be called through this.
Impl* impl() { return static_cast<Impl*>(this); }
@@ -447,13 +439,12 @@ class ParserBase : public ParserBaseTraits<Impl> {
FunctionState* outer() const { return outer_function_state_; }
void set_generator_object_variable(
- typename Traits::Type::GeneratorVariable* variable) {
+ typename Types::GeneratorVariable* variable) {
DCHECK(variable != NULL);
DCHECK(is_resumable());
generator_object_variable_ = variable;
}
- typename Traits::Type::GeneratorVariable* generator_object_variable()
- const {
+ typename Types::GeneratorVariable* generator_object_variable() const {
return generator_object_variable_;
}
@@ -876,7 +867,7 @@ class ParserBase : public ParserBaseTraits<Impl> {
return Token::Precedence(token);
}
- typename Traits::Type::Factory* factory() { return &ast_node_factory_; }
+ typename Types::Factory* factory() { return &ast_node_factory_; }
DeclarationScope* GetReceiverScope() const {
return scope()->GetReceiverScope();
@@ -1099,10 +1090,10 @@ class ParserBase : public ParserBaseTraits<Impl> {
ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends,
MethodKind kind, bool* is_computed_name, bool* has_seen_constructor,
ExpressionClassifier* classifier, IdentifierT* name, bool* ok);
- typename Traits::Type::ExpressionList ParseArguments(
+ typename Types::ExpressionList ParseArguments(
Scanner::Location* first_spread_pos, bool maybe_arrow,
ExpressionClassifier* classifier, bool* ok);
- typename Traits::Type::ExpressionList ParseArguments(
+ typename Types::ExpressionList ParseArguments(
Scanner::Location* first_spread_pos, ExpressionClassifier* classifier,
bool* ok) {
return ParseArguments(first_spread_pos, false, classifier, ok);
@@ -1268,7 +1259,7 @@ class ParserBase : public ParserBaseTraits<Impl> {
v8::Extension* extension_;
FuncNameInferrer* fni_;
AstValueFactory* ast_value_factory_; // Not owned.
- typename Traits::Type::Factory ast_node_factory_;
+ typename Types::Factory ast_node_factory_;
ParserRecorder* log_;
Mode mode_;
bool parsing_module_;
@@ -1797,7 +1788,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseArrayLiteral(
// '[' Expression? (',' Expression?)* ']'
int pos = peek_position();
- typename Traits::Type::ExpressionList values = impl()->NewExpressionList(4);
+ typename Types::ExpressionList values = impl()->NewExpressionList(4);
int first_spread_index = -1;
Expect(Token::LBRACK, CHECK_OK);
while (peek() != Token::RBRACK) {
@@ -2114,7 +2105,7 @@ ParserBase<Impl>::ParsePropertyDefinition(
CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
}
- typename Traits::Type::FunctionLiteral value = impl()->ParseFunctionLiteral(
+ FunctionLiteralT value = impl()->ParseFunctionLiteral(
*name, scanner()->location(), kSkipFunctionNameCheck,
is_get ? FunctionKind::kGetterFunction : FunctionKind::kSetterFunction,
kNoSourcePosition, FunctionLiteral::kAccessorOrMethod, language_mode(),
@@ -2147,7 +2138,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral(
// '{' (PropertyDefinition (',' PropertyDefinition)* ','? )? '}'
int pos = peek_position();
- typename Traits::Type::PropertyList properties = impl()->NewPropertyList(4);
+ typename Types::PropertyList properties = impl()->NewPropertyList(4);
int number_of_boilerplate_properties = 0;
bool has_computed_names = false;
ObjectLiteralChecker checker(this);
@@ -2196,7 +2187,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseObjectLiteral(
}
template <typename Impl>
-typename ParserBase<Impl>::Traits::Type::ExpressionList
+typename ParserBase<Impl>::Types::ExpressionList
ParserBase<Impl>::ParseArguments(Scanner::Location* first_spread_arg_loc,
bool maybe_arrow,
ExpressionClassifier* classifier, bool* ok) {
@@ -2204,7 +2195,7 @@ ParserBase<Impl>::ParseArguments(Scanner::Location* first_spread_arg_loc,
// '(' (AssignmentExpression)*[','] ')'
Scanner::Location spread_arg = Scanner::Location::invalid();
- typename Traits::Type::ExpressionList result = impl()->NewExpressionList(4);
+ typename Types::ExpressionList result = impl()->NewExpressionList(4);
Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList));
bool done = (peek() == Token::RPAREN);
bool was_unspread = false;
@@ -2544,8 +2535,8 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseYieldExpression(
expression = impl()->BuildIteratorResult(expression, false);
// Hackily disambiguate o from o.next and o [Symbol.iterator]().
// TODO(verwaest): Come up with a better solution.
- typename Traits::Type::YieldExpression yield = factory()->NewYield(
- generator_object, expression, pos, Yield::kOnExceptionThrow);
+ ExpressionT yield = factory()->NewYield(generator_object, expression, pos,
+ Yield::kOnExceptionThrow);
return yield;
}
@@ -2743,7 +2734,7 @@ typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseUnaryExpression(
return impl()->EmptyExpression();
}
- // Allow Traits do rewrite the expression.
+ // Allow the parser's implementation to rewrite the expression.
return impl()->BuildUnaryExpression(expression, op, pos);
} else if (Token::IsCountOp(op)) {
BindingPatternUnexpectedToken(classifier);
@@ -2866,7 +2857,7 @@ ParserBase<Impl>::ParseLeftHandSideExpression(ExpressionClassifier* classifier,
}
}
Scanner::Location spread_pos;
- typename Traits::Type::ExpressionList args;
+ typename Types::ExpressionList args;
if (V8_UNLIKELY(is_async && impl()->IsIdentifier(result))) {
ExpressionClassifier async_classifier(this);
args = ParseArguments(&spread_pos, true, &async_classifier, CHECK_OK);
@@ -3001,7 +2992,7 @@ ParserBase<Impl>::ParseMemberWithNewPrefixesExpression(
if (peek() == Token::LPAREN) {
// NewExpression with arguments.
Scanner::Location spread_pos;
- typename Traits::Type::ExpressionList args =
+ typename Types::ExpressionList args =
ParseArguments(&spread_pos, classifier, CHECK_OK);
if (spread_pos.IsValid()) {
@@ -3398,7 +3389,7 @@ ParserBase<Impl>::ParseArrowFunctionLiteral(
return impl()->EmptyExpression();
}
- typename Traits::Type::StatementList body;
+ typename Types::StatementList body;
int num_parameters = formal_parameters.scope->num_parameters();
int materialized_literal_count = -1;
int expected_property_count = -1;
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698