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

Unified Diff: src/preparser.cc

Issue 1416753009: [parser] early error when declaration Pattern missing Initializer (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add a bunch of message tests + refactor a bit Created 5 years, 1 month 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
Index: src/preparser.cc
diff --git a/src/preparser.cc b/src/preparser.cc
index 74e11b1d454b3b33a3f6bcadb18f91476a246f37..bf1d6a766667744cafa2acc399396ed18421232d 100644
--- a/src/preparser.cc
+++ b/src/preparser.cc
@@ -558,7 +558,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
(allow_harmony_sloppy() && !allow_legacy_const())) {
DCHECK(var_context != kStatement);
is_strict_const = true;
adamk 2015/11/04 00:37:54 This means "is not legacy const".
- require_initializer = var_context != kForStatement;
+ require_initializer = true;
adamk 2015/11/04 00:37:54 Seems like "is_const" would be a better name for t
lexical = true;
}
} else if (peek() == Token::LET && allow_let()) {
@@ -579,11 +579,15 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
do {
// Parse binding pattern.
if (nvars > 0) Consume(Token::COMMA);
+ int decl_pos = peek_position();
+ bool is_pattern = false;
{
ExpressionClassifier pattern_classifier;
Token::Value next = peek();
PreParserExpression pattern =
ParsePrimaryExpression(&pattern_classifier, CHECK_OK);
+ is_pattern = pattern.IsObjectLiteral(); // (or pattern.IsArrayLiteral());
adamk 2015/11/04 00:37:54 I'd rather you just add the bit for ArrayLiteral t
caitp (gmail) 2015/11/04 15:07:28 Done, although I think it will mean adding an extr
+
ValidateBindingPattern(&pattern_classifier, CHECK_OK);
if (lexical) {
ValidateLetPattern(&pattern_classifier, CHECK_OK);
@@ -596,12 +600,25 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
}
}
+ bool is_for_iteration_variable =
+ var_context == kForStatement &&
+ (peek() == Token::IN || PeekContextualKeyword(CStrVector("of")));
+
Scanner::Location variable_loc = scanner()->location();
nvars++;
- if (peek() == Token::ASSIGN || require_initializer ||
+ if (peek() == Token::ASSIGN ||
+ (!is_for_iteration_variable && (require_initializer || is_pattern)) ||
adamk 2015/11/04 00:37:54 Maybe put this in the same order as in the parser
rossberg 2015/11/04 10:52:36 Same comment as in the parser: move this to else b
// require initializers for multiple consts.
(is_strict_const && peek() == Token::COMMA)) {
adamk 2015/11/04 00:37:54 I think this bit is now redundant with your is_for
caitp (gmail) 2015/11/04 15:07:28 Well, this was the only place the variable was use
- Expect(Token::ASSIGN, CHECK_OK);
+ if (peek() != Token::ASSIGN) {
adamk 2015/11/04 00:37:54 Same note here as in the parser, you can use if (!
+ PreParserTraits::ReportMessageAt(
+ Scanner::Location(decl_pos, scanner()->location().end_pos),
+ MessageTemplate::kDeclarationMissingInitializer,
+ is_pattern ? "destructuring" : "const");
+ *ok = false;
+ return Statement::Default();
+ }
+ Consume(Token::ASSIGN);
ExpressionClassifier classifier;
ParseAssignmentExpression(var_context != kForStatement, &classifier,
CHECK_OK);
« src/parser.cc ('K') | « src/preparser.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698