Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 070bb3b9182ac152053ce25b45587361f976630f..0945582e833ed3762b222683842be669341a89f9 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -1280,13 +1280,12 @@ void* Parser::ParseModule(ZoneList<Statement*>* body, bool* ok) { |
} |
-Literal* Parser::ParseModuleSpecifier(bool* ok) { |
+const AstRawString* Parser::ParseModuleSpecifier(bool* ok) { |
// ModuleSpecifier : |
// StringLiteral |
- int pos = peek_position(); |
Expect(Token::STRING, CHECK_OK); |
- return factory()->NewStringLiteral(GetSymbol(scanner()), pos); |
+ return GetSymbol(scanner()); |
} |
@@ -1338,9 +1337,7 @@ void* Parser::ParseExportClause(ZoneList<const AstRawString*>* export_names, |
} |
-void* Parser::ParseNamedImports(ZoneList<const AstRawString*>* import_names, |
- ZoneList<const AstRawString*>* local_names, |
- bool* ok) { |
+ZoneList<ImportDeclaration*>* Parser::ParseNamedImports(int pos, bool* ok) { |
// NamedImports : |
// '{' '}' |
// '{' ImportsList '}' |
@@ -1356,6 +1353,8 @@ void* Parser::ParseNamedImports(ZoneList<const AstRawString*>* import_names, |
Expect(Token::LBRACE, CHECK_OK); |
+ ZoneList<ImportDeclaration*>* result = |
+ new (zone()) ZoneList<ImportDeclaration*>(1, zone()); |
while (peek() != Token::RBRACE) { |
const AstRawString* import_name = ParseIdentifierName(CHECK_OK); |
const AstRawString* local_name = import_name; |
@@ -1374,15 +1373,18 @@ void* Parser::ParseNamedImports(ZoneList<const AstRawString*>* import_names, |
ReportMessage("strict_eval_arguments"); |
return NULL; |
} |
- import_names->Add(import_name, zone()); |
- local_names->Add(local_name, zone()); |
+ VariableProxy* proxy = NewUnresolved(local_name, IMPORT); |
+ ImportDeclaration* declaration = |
+ factory()->NewImportDeclaration(proxy, import_name, NULL, scope_, pos); |
+ Declare(declaration, true, CHECK_OK); |
+ result->Add(declaration, zone()); |
if (peek() == Token::RBRACE) break; |
Expect(Token::COMMA, CHECK_OK); |
} |
Expect(Token::RBRACE, CHECK_OK); |
- return NULL; |
+ return result; |
} |
@@ -1408,7 +1410,7 @@ Statement* Parser::ParseImportDeclaration(bool* ok) { |
// 'import' ModuleSpecifier ';' |
if (tok == Token::STRING) { |
- Literal* module_specifier = ParseModuleSpecifier(CHECK_OK); |
+ const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); |
ExpectSemicolon(CHECK_OK); |
// TODO(ES6): Add module to the requested modules of scope_->module(). |
USE(module_specifier); |
@@ -1420,11 +1422,11 @@ Statement* Parser::ParseImportDeclaration(bool* ok) { |
if (tok != Token::MUL && tok != Token::LBRACE) { |
imported_default_binding = |
ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); |
+ // TODO(ES6): Add an appropriate declaration. |
} |
const AstRawString* module_instance_binding = NULL; |
- ZoneList<const AstRawString*> local_names(1, zone()); |
- ZoneList<const AstRawString*> import_names(1, zone()); |
+ ZoneList<ImportDeclaration*>* named_declarations = NULL; |
if (imported_default_binding == NULL || Check(Token::COMMA)) { |
switch (peek()) { |
case Token::MUL: { |
@@ -1432,11 +1434,12 @@ Statement* Parser::ParseImportDeclaration(bool* ok) { |
ExpectContextualKeyword(CStrVector("as"), CHECK_OK); |
module_instance_binding = |
ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); |
+ // TODO(ES6): Add an appropriate declaration. |
break; |
} |
case Token::LBRACE: |
- ParseNamedImports(&import_names, &local_names, CHECK_OK); |
+ named_declarations = ParseNamedImports(pos, CHECK_OK); |
break; |
default: |
@@ -1447,23 +1450,21 @@ Statement* Parser::ParseImportDeclaration(bool* ok) { |
} |
ExpectContextualKeyword(CStrVector("from"), CHECK_OK); |
- Literal* module = ParseModuleSpecifier(CHECK_OK); |
- USE(module); |
- |
+ const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); |
ExpectSemicolon(CHECK_OK); |
if (module_instance_binding != NULL) { |
- // TODO(ES6): Bind name to the Module Instance Object of module. |
+ // TODO(ES6): Set the module specifier for the module namespace binding. |
} |
if (imported_default_binding != NULL) { |
- // TODO(ES6): Add an appropriate declaration. |
+ // TODO(ES6): Set the module specifier for the default binding. |
} |
- 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 |
+ if (named_declarations != NULL) { |
+ for (int i = 0; i < named_declarations->length(); ++i) { |
+ named_declarations->at(i)->set_module_specifier(module_specifier); |
+ } |
} |
return factory()->NewEmptyStatement(pos); |
@@ -1540,10 +1541,10 @@ Statement* Parser::ParseExportDeclaration(bool* ok) { |
case Token::MUL: { |
Consume(Token::MUL); |
ExpectContextualKeyword(CStrVector("from"), CHECK_OK); |
- Literal* module = ParseModuleSpecifier(CHECK_OK); |
+ const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); |
ExpectSemicolon(CHECK_OK); |
// TODO(ES6): scope_->module()->AddStarExport(...) |
- USE(module); |
+ USE(module_specifier); |
return factory()->NewEmptyStatement(pos); |
} |
@@ -1565,7 +1566,7 @@ Statement* Parser::ParseExportDeclaration(bool* ok) { |
ZoneList<const AstRawString*> local_names(1, zone()); |
ParseExportClause(&export_names, &export_locations, &local_names, |
&reserved_loc, CHECK_OK); |
- Literal* indirect_export_module_specifier = NULL; |
+ const AstRawString* indirect_export_module_specifier = NULL; |
if (CheckContextualKeyword(CStrVector("from"))) { |
indirect_export_module_specifier = ParseModuleSpecifier(CHECK_OK); |
} else if (reserved_loc.IsValid()) { |