Commit 8b33567f authored by adamk's avatar adamk Committed by Commit bot

Simplify error message logic in ParseImportNames

The new logic ensures that the error messages are the same in the
"import { <reserved word> }" and "import { foo as <reserved ord> }"
cases.

Also prepares ParseImportNames for returning both the import and local
names to ParseImportClause.

BUG=v8:1569
LOG=n

Review URL: https://codereview.chromium.org/952863006

Cr-Commit-Position: refs/heads/master@{#26863}
parent f1e2aa52
......@@ -1338,7 +1338,8 @@ void* Parser::ParseExportClause(ZoneList<const AstRawString*>* export_names,
}
void* Parser::ParseNamedImports(ZoneList<const AstRawString*>* names,
void* Parser::ParseNamedImports(ZoneList<const AstRawString*>* import_names,
ZoneList<const AstRawString*>* local_names,
bool* ok) {
// NamedImports :
// '{' '}'
......@@ -1355,27 +1356,26 @@ void* Parser::ParseNamedImports(ZoneList<const AstRawString*>* names,
Expect(Token::LBRACE, CHECK_OK);
Token::Value name_tok;
while ((name_tok = peek()) != Token::RBRACE) {
const AstRawString* name = ParseIdentifierName(CHECK_OK);
const AstRawString* import_name = NULL;
while (peek() != Token::RBRACE) {
const AstRawString* import_name = ParseIdentifierName(CHECK_OK);
const AstRawString* local_name = import_name;
// In the presence of 'as', the left-side of the 'as' can
// be any IdentifierName. But without 'as', it must be a valid
// BindingIdentiifer.
// BindingIdentifier.
if (CheckContextualKeyword(CStrVector("as"))) {
import_name = ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
} else if (!Token::IsIdentifier(name_tok, STRICT, false)) {
local_name = ParseIdentifierName(CHECK_OK);
}
if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false)) {
*ok = false;
ReportMessageAt(scanner()->location(), "unexpected_reserved");
ReportMessage("unexpected_reserved");
return NULL;
} else if (IsEvalOrArguments(name)) {
} else if (IsEvalOrArguments(local_name)) {
*ok = false;
ReportMessageAt(scanner()->location(), "strict_eval_arguments");
ReportMessage("strict_eval_arguments");
return NULL;
}
// TODO(ES6): Return the import_name as well as the name.
names->Add(name, zone());
USE(import_name);
import_names->Add(import_name, zone());
local_names->Add(local_name, zone());
if (peek() == Token::RBRACE) break;
Expect(Token::COMMA, CHECK_OK);
}
......@@ -1408,8 +1408,10 @@ Statement* Parser::ParseImportDeclaration(bool* ok) {
// 'import' ModuleSpecifier ';'
if (tok == Token::STRING) {
ParseModuleSpecifier(CHECK_OK);
Literal* module_specifier = ParseModuleSpecifier(CHECK_OK);
ExpectSemicolon(CHECK_OK);
// TODO(ES6): Add module to the requested modules of scope_->module().
USE(module_specifier);
return factory()->NewEmptyStatement(pos);
}
......@@ -1421,7 +1423,8 @@ Statement* Parser::ParseImportDeclaration(bool* ok) {
}
const AstRawString* module_instance_binding = NULL;
ZoneList<const AstRawString*> names(1, zone());
ZoneList<const AstRawString*> local_names(1, zone());
ZoneList<const AstRawString*> import_names(1, zone());
if (imported_default_binding == NULL || Check(Token::COMMA)) {
switch (peek()) {
case Token::MUL: {
......@@ -1433,7 +1436,7 @@ Statement* Parser::ParseImportDeclaration(bool* ok) {
}
case Token::LBRACE:
ParseNamedImports(&names, CHECK_OK);
ParseNamedImports(&import_names, &local_names, CHECK_OK);
break;
default:
......@@ -1457,7 +1460,9 @@ Statement* Parser::ParseImportDeclaration(bool* ok) {
// TODO(ES6): Add an appropriate declaration.
}
for (int i = 0; i < names.length(); ++i) {
const int length = import_names.length();
DCHECK_EQ(length, local_names.length());
for (int i = 0; i < length; ++i) {
// TODO(ES6): Add an appropriate declaration for each name
}
......
......@@ -714,7 +714,8 @@ class Parser : public ParserBase<ParserTraits> {
ZoneList<Scanner::Location>* export_locations,
ZoneList<const AstRawString*>* local_names,
Scanner::Location* reserved_loc, bool* ok);
void* ParseNamedImports(ZoneList<const AstRawString*>* names, bool* ok);
void* ParseNamedImports(ZoneList<const AstRawString*>* import_names,
ZoneList<const AstRawString*>* local_names, bool* ok);
Statement* ParseStatement(ZoneList<const AstRawString*>* labels, bool* ok);
Statement* ParseSubStatement(ZoneList<const AstRawString*>* labels, bool* ok);
Statement* ParseFunctionDeclaration(ZoneList<const AstRawString*>* names,
......
// 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.
//
// MODULE
import { foo as eval } from "mod";
# 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.
*%(basename)s:7: SyntaxError: Unexpected eval or arguments in strict mode
import { foo as eval } from "mod";
^^^^
SyntaxError: Unexpected eval or arguments in strict mode
// 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.
//
// MODULE
import { foo as import } from "mod";
# 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.
*%(basename)s:7: SyntaxError: Unexpected reserved word
import { foo as import } from "mod";
^^^^^^
SyntaxError: Unexpected reserved word
// 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.
//
// MODULE
import { eval } from "mod";
# 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.
*%(basename)s:7: SyntaxError: Unexpected eval or arguments in strict mode
import { eval } from "mod";
^^^^
SyntaxError: Unexpected eval or arguments in strict mode
// 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.
//
// MODULE
import { import } from "mod";
# 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.
*%(basename)s:7: SyntaxError: Unexpected reserved word
import { import } from "mod";
^^^^^^
SyntaxError: Unexpected reserved word
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment