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

Side by Side Diff: src/parsing/parser.cc

Issue 2108193003: [modules] AST and parser rework. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@anonymous-declarations
Patch Set: Rebase. Created 4 years, 5 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 unified diff | Download patch
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/pattern-rewriter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/ast-expression-rewriter.h" 9 #include "src/ast/ast-expression-rewriter.h"
10 #include "src/ast/ast-expression-visitor.h" 10 #include "src/ast/ast-expression-visitor.h"
(...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 AstNodeFactory function_factory(ast_value_factory()); 941 AstNodeFactory function_factory(ast_value_factory());
942 FunctionState function_state(&function_state_, &scope_, scope, 942 FunctionState function_state(&function_state_, &scope_, scope,
943 kNormalFunction, &function_factory); 943 kNormalFunction, &function_factory);
944 944
945 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); 945 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
946 bool ok = true; 946 bool ok = true;
947 int beg_pos = scanner()->location().beg_pos; 947 int beg_pos = scanner()->location().beg_pos;
948 parsing_module_ = info->is_module(); 948 parsing_module_ = info->is_module();
949 if (parsing_module_) { 949 if (parsing_module_) {
950 ParseModuleItemList(body, &ok); 950 ParseModuleItemList(body, &ok);
951 ok = ok &&
952 scope_->module()->Validate(scope_, &pending_error_handler_, zone());
951 } else { 953 } else {
952 // Don't count the mode in the use counters--give the program a chance 954 // Don't count the mode in the use counters--give the program a chance
953 // to enable script-wide strict mode below. 955 // to enable script-wide strict mode below.
954 scope_->SetLanguageMode(info->language_mode()); 956 scope_->SetLanguageMode(info->language_mode());
955 ParseStatementList(body, Token::EOS, &ok); 957 ParseStatementList(body, Token::EOS, &ok);
956 } 958 }
957 959
958 // The parser will peek but not consume EOS. Our scope logically goes all 960 // The parser will peek but not consume EOS. Our scope logically goes all
959 // the way to the EOS, though. 961 // the way to the EOS, though.
960 scope->set_end_position(scanner()->peek_location().beg_pos); 962 scope->set_end_position(scanner()->peek_location().beg_pos);
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
1311 } 1313 }
1312 /* falls through */ 1314 /* falls through */
1313 default: 1315 default:
1314 break; 1316 break;
1315 } 1317 }
1316 return ParseStatement(NULL, kAllowLabelledFunctionStatement, ok); 1318 return ParseStatement(NULL, kAllowLabelledFunctionStatement, ok);
1317 } 1319 }
1318 1320
1319 1321
1320 Statement* Parser::ParseModuleItem(bool* ok) { 1322 Statement* Parser::ParseModuleItem(bool* ok) {
1321 // (Ecma 262 6th Edition, 15.2): 1323 // ecma262/#prod-ModuleItem
1322 // ModuleItem : 1324 // ModuleItem :
1323 // ImportDeclaration 1325 // ImportDeclaration
1324 // ExportDeclaration 1326 // ExportDeclaration
1325 // StatementListItem 1327 // StatementListItem
1326 1328
1327 switch (peek()) { 1329 switch (peek()) {
1328 case Token::IMPORT: 1330 case Token::IMPORT:
1329 return ParseImportDeclaration(ok); 1331 ParseImportDeclaration(CHECK_OK);
1332 return factory()->NewEmptyStatement(kNoSourcePosition);
1330 case Token::EXPORT: 1333 case Token::EXPORT:
1331 return ParseExportDeclaration(ok); 1334 return ParseExportDeclaration(ok);
1332 default: 1335 default:
1333 return ParseStatementListItem(ok); 1336 return ParseStatementListItem(ok);
1334 } 1337 }
1335 } 1338 }
1336 1339
1337 1340
1338 void* Parser::ParseModuleItemList(ZoneList<Statement*>* body, bool* ok) { 1341 void* Parser::ParseModuleItemList(ZoneList<Statement*>* body, bool* ok) {
1339 // (Ecma 262 6th Edition, 15.2): 1342 // ecma262/#prod-Module
1340 // Module : 1343 // Module :
1341 // ModuleBody? 1344 // ModuleBody?
1342 // 1345 //
1346 // ecma262/#prod-ModuleItemList
1343 // ModuleBody : 1347 // ModuleBody :
1344 // ModuleItem* 1348 // ModuleItem*
1345 1349
1346 DCHECK(scope_->is_module_scope()); 1350 DCHECK(scope_->is_module_scope());
1347
1348 while (peek() != Token::EOS) { 1351 while (peek() != Token::EOS) {
1349 Statement* stat = ParseModuleItem(CHECK_OK); 1352 Statement* stat = ParseModuleItem(CHECK_OK);
1350 if (stat && !stat->IsEmpty()) { 1353 if (stat && !stat->IsEmpty()) {
1351 body->Add(stat, zone()); 1354 body->Add(stat, zone());
1352 } 1355 }
1353 } 1356 }
1354 1357 return nullptr;
1355 // Check that all exports are bound.
1356 ModuleDescriptor* descriptor = scope_->module();
1357 for (ModuleDescriptor::Iterator it = descriptor->iterator(); !it.done();
1358 it.Advance()) {
1359 if (scope_->LookupLocal(it.local_name()) == NULL) {
1360 // TODO(adamk): Pass both local_name and export_name once ParserTraits
1361 // supports multiple arg error messages.
1362 // Also try to report this at a better location.
1363 ParserTraits::ReportMessage(MessageTemplate::kModuleExportUndefined,
1364 it.local_name());
1365 *ok = false;
1366 return NULL;
1367 }
1368 }
1369
1370 return NULL;
1371 } 1358 }
1372 1359
1373 1360
1374 const AstRawString* Parser::ParseModuleSpecifier(bool* ok) { 1361 const AstRawString* Parser::ParseModuleSpecifier(bool* ok) {
1375 // ModuleSpecifier : 1362 // ModuleSpecifier :
1376 // StringLiteral 1363 // StringLiteral
1377 1364
1378 Expect(Token::STRING, CHECK_OK); 1365 Expect(Token::STRING, CHECK_OK);
1379 return GetSymbol(scanner()); 1366 return GetSymbol(scanner());
1380 } 1367 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1417 } 1404 }
1418 export_names->Add(export_name, zone()); 1405 export_names->Add(export_name, zone());
1419 local_names->Add(local_name, zone()); 1406 local_names->Add(local_name, zone());
1420 export_locations->Add(scanner()->location(), zone()); 1407 export_locations->Add(scanner()->location(), zone());
1421 if (peek() == Token::RBRACE) break; 1408 if (peek() == Token::RBRACE) break;
1422 Expect(Token::COMMA, CHECK_OK); 1409 Expect(Token::COMMA, CHECK_OK);
1423 } 1410 }
1424 1411
1425 Expect(Token::RBRACE, CHECK_OK); 1412 Expect(Token::RBRACE, CHECK_OK);
1426 1413
1427 return 0; 1414 return nullptr;
1428 } 1415 }
1429 1416
1430 1417
1431 ZoneList<ImportDeclaration*>* Parser::ParseNamedImports(int pos, bool* ok) { 1418 ZoneList<const Parser::NamedImport*>* Parser::ParseNamedImports(
1419 int pos, bool* ok) {
1432 // NamedImports : 1420 // NamedImports :
1433 // '{' '}' 1421 // '{' '}'
1434 // '{' ImportsList '}' 1422 // '{' ImportsList '}'
1435 // '{' ImportsList ',' '}' 1423 // '{' ImportsList ',' '}'
1436 // 1424 //
1437 // ImportsList : 1425 // ImportsList :
1438 // ImportSpecifier 1426 // ImportSpecifier
1439 // ImportsList ',' ImportSpecifier 1427 // ImportsList ',' ImportSpecifier
1440 // 1428 //
1441 // ImportSpecifier : 1429 // ImportSpecifier :
1442 // BindingIdentifier 1430 // BindingIdentifier
1443 // IdentifierName 'as' BindingIdentifier 1431 // IdentifierName 'as' BindingIdentifier
1444 1432
1445 Expect(Token::LBRACE, CHECK_OK); 1433 Expect(Token::LBRACE, CHECK_OK);
1446 1434
1447 ZoneList<ImportDeclaration*>* result = 1435 auto result = new (zone()) ZoneList<const NamedImport*>(1, zone());
1448 new (zone()) ZoneList<ImportDeclaration*>(1, zone());
1449 while (peek() != Token::RBRACE) { 1436 while (peek() != Token::RBRACE) {
1450 const AstRawString* import_name = ParseIdentifierName(CHECK_OK); 1437 const AstRawString* import_name = ParseIdentifierName(CHECK_OK);
1451 const AstRawString* local_name = import_name; 1438 const AstRawString* local_name = import_name;
1452 // In the presence of 'as', the left-side of the 'as' can 1439 // In the presence of 'as', the left-side of the 'as' can
1453 // be any IdentifierName. But without 'as', it must be a valid 1440 // be any IdentifierName. But without 'as', it must be a valid
1454 // BindingIdentifier. 1441 // BindingIdentifier.
1455 if (CheckContextualKeyword(CStrVector("as"))) { 1442 if (CheckContextualKeyword(CStrVector("as"))) {
1456 local_name = ParseIdentifierName(CHECK_OK); 1443 local_name = ParseIdentifierName(CHECK_OK);
1457 } 1444 }
1458 if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false, 1445 if (!Token::IsIdentifier(scanner()->current_token(), STRICT, false,
1459 parsing_module_)) { 1446 parsing_module_)) {
1460 *ok = false; 1447 *ok = false;
1461 ReportMessage(MessageTemplate::kUnexpectedReserved); 1448 ReportMessage(MessageTemplate::kUnexpectedReserved);
1462 return NULL; 1449 return nullptr;
1463 } else if (IsEvalOrArguments(local_name)) { 1450 } else if (IsEvalOrArguments(local_name)) {
1464 *ok = false; 1451 *ok = false;
1465 ReportMessage(MessageTemplate::kStrictEvalArguments); 1452 ReportMessage(MessageTemplate::kStrictEvalArguments);
1466 return NULL; 1453 return nullptr;
1467 } 1454 }
1468 VariableProxy* proxy = NewUnresolved(local_name, CONST); 1455
1469 ImportDeclaration* declaration = 1456 DeclareImport(local_name, position(), CHECK_OK);
1470 factory()->NewImportDeclaration(proxy, import_name, NULL, scope_, pos); 1457
1471 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 1458 NamedImport* import = new (zone()) NamedImport(
1472 result->Add(declaration, zone()); 1459 import_name, local_name, scanner()->location());
1460 result->Add(import, zone());
1461
1473 if (peek() == Token::RBRACE) break; 1462 if (peek() == Token::RBRACE) break;
1474 Expect(Token::COMMA, CHECK_OK); 1463 Expect(Token::COMMA, CHECK_OK);
1475 } 1464 }
1476 1465
1477 Expect(Token::RBRACE, CHECK_OK); 1466 Expect(Token::RBRACE, CHECK_OK);
1478
1479 return result; 1467 return result;
1480 } 1468 }
1481 1469
1482 1470
1483 Statement* Parser::ParseImportDeclaration(bool* ok) { 1471 void* Parser::ParseImportDeclaration(bool* ok) {
1484 // ImportDeclaration : 1472 // ImportDeclaration :
1485 // 'import' ImportClause 'from' ModuleSpecifier ';' 1473 // 'import' ImportClause 'from' ModuleSpecifier ';'
1486 // 'import' ModuleSpecifier ';' 1474 // 'import' ModuleSpecifier ';'
1487 // 1475 //
1488 // ImportClause : 1476 // ImportClause :
1477 // ImportedDefaultBinding
1489 // NameSpaceImport 1478 // NameSpaceImport
1490 // NamedImports 1479 // NamedImports
1491 // ImportedDefaultBinding
1492 // ImportedDefaultBinding ',' NameSpaceImport 1480 // ImportedDefaultBinding ',' NameSpaceImport
1493 // ImportedDefaultBinding ',' NamedImports 1481 // ImportedDefaultBinding ',' NamedImports
1494 // 1482 //
1495 // NameSpaceImport : 1483 // NameSpaceImport :
1496 // '*' 'as' ImportedBinding 1484 // '*' 'as' ImportedBinding
1497 1485
1498 int pos = peek_position(); 1486 int pos = peek_position();
1499 Expect(Token::IMPORT, CHECK_OK); 1487 Expect(Token::IMPORT, CHECK_OK);
1500 1488
1501 Token::Value tok = peek(); 1489 Token::Value tok = peek();
1502 1490
1503 // 'import' ModuleSpecifier ';' 1491 // 'import' ModuleSpecifier ';'
1504 if (tok == Token::STRING) { 1492 if (tok == Token::STRING) {
1505 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); 1493 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK);
1506 scope_->module()->AddModuleRequest(module_specifier, zone());
1507 ExpectSemicolon(CHECK_OK); 1494 ExpectSemicolon(CHECK_OK);
1508 return factory()->NewEmptyStatement(pos); 1495 scope_->module()->AddEmptyImport(
1496 module_specifier, scanner()->location(), zone());
1497 return nullptr;
1509 } 1498 }
1510 1499
1511 // Parse ImportedDefaultBinding if present. 1500 // Parse ImportedDefaultBinding if present.
1512 ImportDeclaration* import_default_declaration = NULL; 1501 const AstRawString* import_default_binding = nullptr;
1502 Scanner::Location import_default_binding_loc;
1513 if (tok != Token::MUL && tok != Token::LBRACE) { 1503 if (tok != Token::MUL && tok != Token::LBRACE) {
1514 const AstRawString* local_name = 1504 import_default_binding =
1515 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); 1505 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK);
1516 VariableProxy* proxy = NewUnresolved(local_name, CONST); 1506 import_default_binding_loc = scanner()->location();
1517 import_default_declaration = factory()->NewImportDeclaration( 1507 DeclareImport(import_default_binding, pos, CHECK_OK);
1518 proxy, ast_value_factory()->default_string(), NULL, scope_, pos);
1519 Declare(import_default_declaration, DeclarationDescriptor::NORMAL, true,
1520 CHECK_OK);
1521 } 1508 }
1522 1509
1523 const AstRawString* module_instance_binding = NULL; 1510 // Parse NameSpaceImport or NamedImports if present.
1524 ZoneList<ImportDeclaration*>* named_declarations = NULL; 1511 const AstRawString* module_namespace_binding = nullptr;
1525 if (import_default_declaration == NULL || Check(Token::COMMA)) { 1512 Scanner::Location module_namespace_binding_loc;
1513 const ZoneList<const NamedImport*>* named_imports = nullptr;
1514 if (import_default_binding == nullptr || Check(Token::COMMA)) {
1526 switch (peek()) { 1515 switch (peek()) {
1527 case Token::MUL: { 1516 case Token::MUL: {
1528 Consume(Token::MUL); 1517 Consume(Token::MUL);
1529 ExpectContextualKeyword(CStrVector("as"), CHECK_OK); 1518 ExpectContextualKeyword(CStrVector("as"), CHECK_OK);
1530 module_instance_binding = 1519 module_namespace_binding =
1531 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); 1520 ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK);
1532 // TODO(ES6): Add an appropriate declaration. 1521 module_namespace_binding_loc = scanner()->location();
1533 break; 1522 break;
1534 } 1523 }
1535 1524
1536 case Token::LBRACE: 1525 case Token::LBRACE:
1537 named_declarations = ParseNamedImports(pos, CHECK_OK); 1526 named_imports = ParseNamedImports(pos, CHECK_OK);
1538 break; 1527 break;
1539 1528
1540 default: 1529 default:
1541 *ok = false; 1530 *ok = false;
1542 ReportUnexpectedToken(scanner()->current_token()); 1531 ReportUnexpectedToken(scanner()->current_token());
1543 return NULL; 1532 return nullptr;
1544 } 1533 }
1545 } 1534 }
1546 1535
1547 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); 1536 ExpectContextualKeyword(CStrVector("from"), CHECK_OK);
1548 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); 1537 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK);
1549 scope_->module()->AddModuleRequest(module_specifier, zone()); 1538 ExpectSemicolon(CHECK_OK);
1550 1539
1551 if (module_instance_binding != NULL) { 1540 // Now that we have all the information, we can make the appropriate
1552 // TODO(ES6): Set the module specifier for the module namespace binding. 1541 // declarations.
1542
1543 if (module_namespace_binding != nullptr) {
1544 scope_->module()->AddStarImport(
1545 module_namespace_binding, module_specifier,
1546 module_namespace_binding_loc, zone());
1547 // TODO(neis): Create special immutable binding for the namespace object.
1553 } 1548 }
1554 1549
1555 if (import_default_declaration != NULL) { 1550 // TODO(neis): Would prefer to call DeclareImport below rather than above and
1556 import_default_declaration->set_module_specifier(module_specifier); 1551 // in ParseNamedImports, but then a possible error message would point to the
1552 // wrong location. Maybe have a DeclareAt version of Declare that takes a
1553 // location?
1554
1555 if (import_default_binding != nullptr) {
1556 scope_->module()->AddImport(
1557 ast_value_factory()->default_string(), import_default_binding,
1558 module_specifier, import_default_binding_loc, zone());
1559 // DeclareImport(import_default_binding, pos, CHECK_OK);
1557 } 1560 }
1558 1561
1559 if (named_declarations != NULL) { 1562 if (named_imports != nullptr) {
1560 for (int i = 0; i < named_declarations->length(); ++i) { 1563 if (named_imports->length() == 0) {
1561 named_declarations->at(i)->set_module_specifier(module_specifier); 1564 scope_->module()->AddEmptyImport(
1565 module_specifier, scanner()->location(), zone());
1566 } else {
1567 for (int i = 0; i < named_imports->length(); ++i) {
1568 const NamedImport* import = named_imports->at(i);
1569 scope_->module()->AddImport(
1570 import->import_name, import->local_name,
1571 module_specifier, import->location, zone());
1572 // DeclareImport(import->local_name, pos, CHECK_OK);
1573 }
1562 } 1574 }
1563 } 1575 }
1564 1576
1565 ExpectSemicolon(CHECK_OK); 1577 return nullptr;
1566 return factory()->NewEmptyStatement(pos);
1567 } 1578 }
1568 1579
1569 1580
1570 Statement* Parser::ParseExportDefault(bool* ok) { 1581 Statement* Parser::ParseExportDefault(bool* ok) {
1571 // Supports the following productions, starting after the 'default' token: 1582 // Supports the following productions, starting after the 'default' token:
1572 // 'export' 'default' FunctionDeclaration 1583 // 'export' 'default' HoistableDeclaration
1573 // 'export' 'default' ClassDeclaration 1584 // 'export' 'default' ClassDeclaration
1574 // 'export' 'default' AssignmentExpression[In] ';' 1585 // 'export' 'default' AssignmentExpression[In] ';'
1575 1586
1576 Expect(Token::DEFAULT, CHECK_OK); 1587 Expect(Token::DEFAULT, CHECK_OK);
1577 Scanner::Location default_loc = scanner()->location(); 1588 Scanner::Location default_loc = scanner()->location();
1578 1589
1579 const AstRawString* default_string = ast_value_factory()->default_string(); 1590 ZoneList<const AstRawString*> local_names(1, zone());
1580 ZoneList<const AstRawString*> names(1, zone());
1581 Statement* result = nullptr; 1591 Statement* result = nullptr;
1582 Expression* default_export = nullptr;
1583 switch (peek()) { 1592 switch (peek()) {
1584 case Token::FUNCTION: 1593 case Token::FUNCTION:
1585 result = ParseHoistableDeclaration(&names, true, CHECK_OK); 1594 result = ParseHoistableDeclaration(&local_names, true, CHECK_OK);
1586 break; 1595 break;
1587 1596
1588 case Token::CLASS: 1597 case Token::CLASS:
1589 Consume(Token::CLASS); 1598 Consume(Token::CLASS);
1590 result = ParseClassDeclaration(&names, true, CHECK_OK); 1599 result = ParseClassDeclaration(&local_names, true, CHECK_OK);
1591 break; 1600 break;
1592 1601
1593 case Token::ASYNC: 1602 case Token::ASYNC:
1594 if (allow_harmony_async_await() && PeekAhead() == Token::FUNCTION && 1603 if (allow_harmony_async_await() && PeekAhead() == Token::FUNCTION &&
1595 !scanner()->HasAnyLineTerminatorAfterNext()) { 1604 !scanner()->HasAnyLineTerminatorAfterNext()) {
1596 Consume(Token::ASYNC); 1605 Consume(Token::ASYNC);
1597 result = ParseAsyncFunctionDeclaration(&names, true, CHECK_OK); 1606 result = ParseAsyncFunctionDeclaration(&local_names, true, CHECK_OK);
1598 break; 1607 break;
1599 } 1608 }
1600 /* falls through */ 1609 /* falls through */
1601 1610
1602 default: { 1611 default: {
1603 int pos = peek_position(); 1612 int pos = position();
1604 ExpressionClassifier classifier(this); 1613 ExpressionClassifier classifier(this);
1605 Expression* expr = ParseAssignmentExpression(true, &classifier, CHECK_OK); 1614 Expression* value =
1615 ParseAssignmentExpression(true, &classifier, CHECK_OK);
1606 RewriteNonPattern(&classifier, CHECK_OK); 1616 RewriteNonPattern(&classifier, CHECK_OK);
1617 SetFunctionName(value, ast_value_factory()->default_string());
1618
1619 const AstRawString* local_name =
1620 ast_value_factory()->star_default_star_string();
1621 local_names.Add(local_name, zone());
1622
1623 // It's fine to declare this as CONST because the user has no way of
1624 // writing to it.
1625 VariableProxy* proxy = NewUnresolved(local_name, CONST);
1626 Declaration* declaration =
1627 factory()->NewVariableDeclaration(proxy, CONST, scope_, pos);
1628 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
1629 proxy->var()->set_initializer_position(position());
1630
1631 Assignment* assignment = factory()->NewAssignment(
1632 Token::INIT, proxy, value, kNoSourcePosition);
1633 result = factory()->NewExpressionStatement(assignment, kNoSourcePosition);
1607 1634
1608 ExpectSemicolon(CHECK_OK); 1635 ExpectSemicolon(CHECK_OK);
1609 result = factory()->NewExpressionStatement(expr, pos);
1610 break; 1636 break;
1611 } 1637 }
1612 } 1638 }
1613 1639
1614 DCHECK_LE(names.length(), 1); 1640 DCHECK_EQ(local_names.length(), 1);
1615 if (names.length() == 1) { 1641 scope_->module()->AddExport(
1616 scope_->module()->AddLocalExport(default_string, names.first(), zone(), ok); 1642 local_names.first(), ast_value_factory()->default_string(), default_loc,
1617 if (!*ok) { 1643 zone());
1618 ParserTraits::ReportMessageAt(
1619 default_loc, MessageTemplate::kDuplicateExport, default_string);
1620 return nullptr;
1621 }
1622 } else {
1623 // TODO(ES6): Assign result to a const binding with the name "*default*"
1624 // and add an export entry with "*default*" as the local name.
1625 USE(default_export);
1626 }
1627 1644
1645 DCHECK_NOT_NULL(result);
1628 return result; 1646 return result;
1629 } 1647 }
1630 1648
1631
1632 Statement* Parser::ParseExportDeclaration(bool* ok) { 1649 Statement* Parser::ParseExportDeclaration(bool* ok) {
1633 // ExportDeclaration: 1650 // ExportDeclaration:
1634 // 'export' '*' 'from' ModuleSpecifier ';' 1651 // 'export' '*' 'from' ModuleSpecifier ';'
1635 // 'export' ExportClause ('from' ModuleSpecifier)? ';' 1652 // 'export' ExportClause ('from' ModuleSpecifier)? ';'
1636 // 'export' VariableStatement 1653 // 'export' VariableStatement
1637 // 'export' Declaration 1654 // 'export' Declaration
1638 // 'export' 'default' ... (handled in ParseExportDefault) 1655 // 'export' 'default' ... (handled in ParseExportDefault)
1639 1656
1640 int pos = peek_position(); 1657 int pos = peek_position();
1641 Expect(Token::EXPORT, CHECK_OK); 1658 Expect(Token::EXPORT, CHECK_OK);
1642 1659
1643 Statement* result = NULL; 1660 Statement* result = nullptr;
1644 ZoneList<const AstRawString*> names(1, zone()); 1661 ZoneList<const AstRawString*> names(1, zone());
1645 switch (peek()) { 1662 switch (peek()) {
1646 case Token::DEFAULT: 1663 case Token::DEFAULT:
1647 return ParseExportDefault(ok); 1664 return ParseExportDefault(ok);
1648 1665
1649 case Token::MUL: { 1666 case Token::MUL: {
1650 Consume(Token::MUL); 1667 Consume(Token::MUL);
1651 ExpectContextualKeyword(CStrVector("from"), CHECK_OK); 1668 ExpectContextualKeyword(CStrVector("from"), CHECK_OK);
1652 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK); 1669 const AstRawString* module_specifier = ParseModuleSpecifier(CHECK_OK);
1653 scope_->module()->AddModuleRequest(module_specifier, zone());
1654 // TODO(ES6): scope_->module()->AddStarExport(...)
1655 ExpectSemicolon(CHECK_OK); 1670 ExpectSemicolon(CHECK_OK);
1671 scope_->module()->AddStarExport(
1672 module_specifier, scanner()->location(), zone());
1656 return factory()->NewEmptyStatement(pos); 1673 return factory()->NewEmptyStatement(pos);
1657 } 1674 }
1658 1675
1659 case Token::LBRACE: { 1676 case Token::LBRACE: {
1660 // There are two cases here: 1677 // There are two cases here:
1661 // 1678 //
1662 // 'export' ExportClause ';' 1679 // 'export' ExportClause ';'
1663 // and 1680 // and
1664 // 'export' ExportClause FromClause ';' 1681 // 'export' ExportClause FromClause ';'
1665 // 1682 //
1666 // In the first case, the exported identifiers in ExportClause must 1683 // In the first case, the exported identifiers in ExportClause must
1667 // not be reserved words, while in the latter they may be. We 1684 // not be reserved words, while in the latter they may be. We
1668 // pass in a location that gets filled with the first reserved word 1685 // pass in a location that gets filled with the first reserved word
1669 // encountered, and then throw a SyntaxError if we are in the 1686 // encountered, and then throw a SyntaxError if we are in the
1670 // non-FromClause case. 1687 // non-FromClause case.
1671 Scanner::Location reserved_loc = Scanner::Location::invalid(); 1688 Scanner::Location reserved_loc = Scanner::Location::invalid();
1672 ZoneList<const AstRawString*> export_names(1, zone()); 1689 ZoneList<const AstRawString*> export_names(1, zone());
1673 ZoneList<Scanner::Location> export_locations(1, zone()); 1690 ZoneList<Scanner::Location> export_locations(1, zone());
1674 ZoneList<const AstRawString*> local_names(1, zone()); 1691 ZoneList<const AstRawString*> original_names(1, zone());
1675 ParseExportClause(&export_names, &export_locations, &local_names, 1692 ParseExportClause(&export_names, &export_locations, &original_names,
1676 &reserved_loc, CHECK_OK); 1693 &reserved_loc, CHECK_OK);
1677 const AstRawString* indirect_export_module_specifier = NULL; 1694 const AstRawString* module_specifier = nullptr;
1678 if (CheckContextualKeyword(CStrVector("from"))) { 1695 if (CheckContextualKeyword(CStrVector("from"))) {
1679 indirect_export_module_specifier = ParseModuleSpecifier(CHECK_OK); 1696 module_specifier = ParseModuleSpecifier(CHECK_OK);
1680 } else if (reserved_loc.IsValid()) { 1697 } else if (reserved_loc.IsValid()) {
1681 // No FromClause, so reserved words are invalid in ExportClause. 1698 // No FromClause, so reserved words are invalid in ExportClause.
1682 *ok = false; 1699 *ok = false;
1683 ReportMessageAt(reserved_loc, MessageTemplate::kUnexpectedReserved); 1700 ReportMessageAt(reserved_loc, MessageTemplate::kUnexpectedReserved);
1684 return NULL; 1701 return nullptr;
1685 } 1702 }
1686 ExpectSemicolon(CHECK_OK); 1703 ExpectSemicolon(CHECK_OK);
1687 const int length = export_names.length(); 1704 const int length = export_names.length();
1688 DCHECK_EQ(length, local_names.length()); 1705 DCHECK_EQ(length, original_names.length());
1689 DCHECK_EQ(length, export_locations.length()); 1706 DCHECK_EQ(length, export_locations.length());
1690 if (indirect_export_module_specifier == NULL) { 1707 if (module_specifier == nullptr) {
1691 for (int i = 0; i < length; ++i) { 1708 for (int i = 0; i < length; ++i) {
1692 scope_->module()->AddLocalExport(export_names[i], local_names[i], 1709 scope_->module()->AddExport(original_names[i], export_names[i],
1693 zone(), ok); 1710 export_locations[i], zone());
1694 if (!*ok) {
1695 ParserTraits::ReportMessageAt(export_locations[i],
1696 MessageTemplate::kDuplicateExport,
1697 export_names[i]);
1698 return NULL;
1699 }
1700 } 1711 }
1712 } else if (length == 0) {
1713 scope_->module()->AddEmptyImport(
1714 module_specifier, scanner()->location(), zone());
1701 } else { 1715 } else {
1702 scope_->module()->AddModuleRequest(indirect_export_module_specifier,
1703 zone());
1704 for (int i = 0; i < length; ++i) { 1716 for (int i = 0; i < length; ++i) {
1705 // TODO(ES6): scope_->module()->AddIndirectExport(...);( 1717 scope_->module()->AddExport(
1718 original_names[i], export_names[i], module_specifier,
1719 export_locations[i], zone());
1706 } 1720 }
1707 } 1721 }
1708 return factory()->NewEmptyStatement(pos); 1722 return factory()->NewEmptyStatement(pos);
1709 } 1723 }
1710 1724
1711 case Token::FUNCTION: 1725 case Token::FUNCTION:
1712 result = ParseHoistableDeclaration(&names, false, CHECK_OK); 1726 result = ParseHoistableDeclaration(&names, false, CHECK_OK);
1713 break; 1727 break;
1714 1728
1715 case Token::CLASS: 1729 case Token::CLASS:
1716 Consume(Token::CLASS); 1730 Consume(Token::CLASS);
1717 result = ParseClassDeclaration(&names, false, CHECK_OK); 1731 result = ParseClassDeclaration(&names, false, CHECK_OK);
1718 break; 1732 break;
1719 1733
1720 case Token::VAR: 1734 case Token::VAR:
1721 case Token::LET: 1735 case Token::LET:
1722 case Token::CONST: 1736 case Token::CONST:
1723 result = ParseVariableStatement(kStatementListItem, &names, CHECK_OK); 1737 result = ParseVariableStatement(kStatementListItem, &names, CHECK_OK);
1724 break; 1738 break;
1725 1739
1726 case Token::ASYNC: 1740 case Token::ASYNC:
1727 if (allow_harmony_async_await()) { 1741 if (allow_harmony_async_await()) {
1742 // TODO(neis): Why don't we have the same check here as in
1743 // ParseStatementListItem?
1728 Consume(Token::ASYNC); 1744 Consume(Token::ASYNC);
1729 result = ParseAsyncFunctionDeclaration(&names, false, CHECK_OK); 1745 result = ParseAsyncFunctionDeclaration(&names, false, CHECK_OK);
1730 break; 1746 break;
1731 } 1747 }
1732 /* falls through */ 1748 /* falls through */
1733 1749
1734 default: 1750 default:
1735 *ok = false; 1751 *ok = false;
1736 ReportUnexpectedToken(scanner()->current_token()); 1752 ReportUnexpectedToken(scanner()->current_token());
1737 return NULL; 1753 return nullptr;
1738 } 1754 }
1739 1755
1740 // Extract declared names into export declarations.
1741 ModuleDescriptor* descriptor = scope_->module(); 1756 ModuleDescriptor* descriptor = scope_->module();
1742 for (int i = 0; i < names.length(); ++i) { 1757 for (int i = 0; i < names.length(); ++i) {
1743 descriptor->AddLocalExport(names[i], names[i], zone(), ok); 1758 // TODO(neis): Provide better location.
1744 if (!*ok) { 1759 descriptor->AddExport(names[i], names[i], scanner()->location(), zone());
1745 // TODO(adamk): Possibly report this error at the right place.
1746 ParserTraits::ReportMessage(MessageTemplate::kDuplicateExport, names[i]);
1747 return NULL;
1748 }
1749 } 1760 }
1750 1761
1751 DCHECK_NOT_NULL(result); 1762 DCHECK_NOT_NULL(result);
1752 return result; 1763 return result;
1753 } 1764 }
1754 1765
1755 Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels, 1766 Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels,
1756 AllowLabelledFunctionStatement allow_function, 1767 AllowLabelledFunctionStatement allow_function,
1757 bool* ok) { 1768 bool* ok) {
1758 // Statement :: 1769 // Statement ::
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 // scope. 1904 // scope.
1894 // Let/const variables are always added to the immediately enclosing scope. 1905 // Let/const variables are always added to the immediately enclosing scope.
1895 Scope* scope = 1906 Scope* scope =
1896 IsLexicalVariableMode(mode) ? scope_ : scope_->DeclarationScope(); 1907 IsLexicalVariableMode(mode) ? scope_ : scope_->DeclarationScope();
1897 return scope->NewUnresolved(factory(), name, Variable::NORMAL, 1908 return scope->NewUnresolved(factory(), name, Variable::NORMAL,
1898 scanner()->location().beg_pos, 1909 scanner()->location().beg_pos,
1899 scanner()->location().end_pos); 1910 scanner()->location().end_pos);
1900 } 1911 }
1901 1912
1902 1913
1914 void* Parser::DeclareImport(const AstRawString* local_name, int pos, bool* ok) {
1915 DCHECK_NOT_NULL(local_name);
1916 VariableProxy* proxy = NewUnresolved(local_name, IMPORT);
1917 Declaration* declaration =
1918 factory()->NewVariableDeclaration(proxy, IMPORT, scope_, pos);
1919 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
1920 return nullptr;
1921 }
1922
1923
1903 Variable* Parser::Declare(Declaration* declaration, 1924 Variable* Parser::Declare(Declaration* declaration,
1904 DeclarationDescriptor::Kind declaration_kind, 1925 DeclarationDescriptor::Kind declaration_kind,
1905 bool resolve, bool* ok, Scope* scope) { 1926 bool resolve, bool* ok, Scope* scope) {
1906 VariableProxy* proxy = declaration->proxy(); 1927 VariableProxy* proxy = declaration->proxy();
1907 DCHECK(proxy->raw_name() != NULL); 1928 DCHECK(proxy->raw_name() != NULL);
1908 const AstRawString* name = proxy->raw_name(); 1929 const AstRawString* name = proxy->raw_name();
1909 VariableMode mode = declaration->mode(); 1930 VariableMode mode = declaration->mode();
1910 DCHECK(IsDeclaredVariableMode(mode) && mode != CONST_LEGACY); 1931 DCHECK(IsDeclaredVariableMode(mode) && mode != CONST_LEGACY);
1911 bool is_function_declaration = declaration->IsFunctionDeclaration(); 1932 bool is_function_declaration = declaration->IsFunctionDeclaration();
1912 if (scope == nullptr) scope = scope_; 1933 if (scope == nullptr) scope = scope_;
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
2164 2185
2165 FuncNameInferrer::State fni_state(fni_); 2186 FuncNameInferrer::State fni_state(fni_);
2166 if (fni_ != NULL) fni_->PushEnclosingName(name); 2187 if (fni_ != NULL) fni_->PushEnclosingName(name);
2167 FunctionLiteral* fun = ParseFunctionLiteral( 2188 FunctionLiteral* fun = ParseFunctionLiteral(
2168 name, scanner()->location(), name_validity, 2189 name, scanner()->location(), name_validity,
2169 is_generator ? FunctionKind::kGeneratorFunction 2190 is_generator ? FunctionKind::kGeneratorFunction
2170 : is_async ? FunctionKind::kAsyncFunction 2191 : is_async ? FunctionKind::kAsyncFunction
2171 : FunctionKind::kNormalFunction, 2192 : FunctionKind::kNormalFunction,
2172 pos, FunctionLiteral::kDeclaration, language_mode(), CHECK_OK); 2193 pos, FunctionLiteral::kDeclaration, language_mode(), CHECK_OK);
2173 2194
2174 // Even if we're not at the top-level of the global or a function
2175 // scope, we treat it as such and introduce the function with its
2176 // initial value upon entering the corresponding scope.
2177 // In ES6, a function behaves as a lexical binding, except in 2195 // In ES6, a function behaves as a lexical binding, except in
2178 // a script scope, or the initial scope of eval or another function. 2196 // a script scope, or the initial scope of eval or another function.
2179 VariableMode mode = 2197 VariableMode mode =
2180 (!scope_->is_declaration_scope() || scope_->is_module_scope()) ? LET 2198 (!scope_->is_declaration_scope() || scope_->is_module_scope()) ? LET
2181 : VAR; 2199 : VAR;
2182 VariableProxy* proxy = NewUnresolved(variable_name, mode); 2200 VariableProxy* proxy = NewUnresolved(variable_name, mode);
2183 Declaration* declaration = 2201 Declaration* declaration =
2184 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos); 2202 factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos);
2185 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 2203 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
2186 if (names) names->Add(variable_name, zone()); 2204 if (names) names->Add(variable_name, zone());
(...skipping 3854 matching lines...) Expand 10 before | Expand all | Expand 10 after
6041 DCHECK_NOT_NULL(name); 6059 DCHECK_NOT_NULL(name);
6042 const AstRawString* prefix = 6060 const AstRawString* prefix =
6043 is_getter ? parser_->ast_value_factory()->get_space_string() 6061 is_getter ? parser_->ast_value_factory()->get_space_string()
6044 : parser_->ast_value_factory()->set_space_string(); 6062 : parser_->ast_value_factory()->set_space_string();
6045 function->set_raw_name( 6063 function->set_raw_name(
6046 parser_->ast_value_factory()->NewConsString(prefix, name)); 6064 parser_->ast_value_factory()->NewConsString(prefix, name));
6047 return; 6065 return;
6048 } 6066 }
6049 } 6067 }
6050 6068
6051 if (!value->IsAnonymousFunctionDefinition()) return;
6052 DCHECK_NOT_NULL(name);
6053
6054 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]] 6069 // Ignore "__proto__" as a name when it's being used to set the [[Prototype]]
6055 // of an object literal. 6070 // of an object literal.
6056 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return; 6071 if (property->kind() == ObjectLiteralProperty::PROTOTYPE) return;
6057 6072
6058 if (function != nullptr) { 6073 DCHECK(!value->IsAnonymousFunctionDefinition() ||
6059 function->set_raw_name(name); 6074 property->kind() == ObjectLiteralProperty::COMPUTED);
6060 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind()); 6075 SetFunctionName(value, name);
6061 } else {
6062 DCHECK(value->IsClassLiteral());
6063 DCHECK_EQ(ObjectLiteralProperty::COMPUTED, property->kind());
6064 value->AsClassLiteral()->constructor()->set_raw_name(name);
6065 }
6066 } 6076 }
6067 6077
6068 6078
6069 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value, 6079 void ParserTraits::SetFunctionNameFromIdentifierRef(Expression* value,
6070 Expression* identifier) { 6080 Expression* identifier) {
6081 if (!identifier->IsVariableProxy()) return;
6082 SetFunctionName(value, identifier->AsVariableProxy()->raw_name());
6083 }
6084
6085
6086 void ParserTraits::SetFunctionName(Expression* value,
6087 const AstRawString* name) {
6088 DCHECK_NOT_NULL(name);
6071 if (!value->IsAnonymousFunctionDefinition()) return; 6089 if (!value->IsAnonymousFunctionDefinition()) return;
6072 if (!identifier->IsVariableProxy()) return;
6073
6074 auto name = identifier->AsVariableProxy()->raw_name();
6075 DCHECK_NOT_NULL(name);
6076
6077 auto function = value->AsFunctionLiteral(); 6090 auto function = value->AsFunctionLiteral();
6078 if (function != nullptr) { 6091 if (function != nullptr) {
6079 function->set_raw_name(name); 6092 function->set_raw_name(name);
6080 } else { 6093 } else {
6081 DCHECK(value->IsClassLiteral()); 6094 DCHECK(value->IsClassLiteral());
6082 value->AsClassLiteral()->constructor()->set_raw_name(name); 6095 value->AsClassLiteral()->constructor()->set_raw_name(name);
6083 } 6096 }
6084 } 6097 }
6085 6098
6086 6099
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after
7049 7062
7050 #ifdef DEBUG 7063 #ifdef DEBUG
7051 void Parser::Print(AstNode* node) { 7064 void Parser::Print(AstNode* node) {
7052 ast_value_factory()->Internalize(Isolate::Current()); 7065 ast_value_factory()->Internalize(Isolate::Current());
7053 node->Print(Isolate::Current()); 7066 node->Print(Isolate::Current());
7054 } 7067 }
7055 #endif // DEBUG 7068 #endif // DEBUG
7056 7069
7057 } // namespace internal 7070 } // namespace internal
7058 } // namespace v8 7071 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/pattern-rewriter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698