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

Side by Side Diff: test/cctest/test-parsing.cc

Issue 1841543003: [esnext] implement frontend changes for async/await proposal (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Uncomment that test Created 4 years, 7 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/token.h ('k') | no next file » | 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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1490 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 data.Dispose(); 1501 data.Dispose();
1502 return i::MessageTemplate::FormatMessage(isolate, message, arg_object); 1502 return i::MessageTemplate::FormatMessage(isolate, message, arg_object);
1503 } 1503 }
1504 1504
1505 enum ParserFlag { 1505 enum ParserFlag {
1506 kAllowLazy, 1506 kAllowLazy,
1507 kAllowNatives, 1507 kAllowNatives,
1508 kAllowHarmonyFunctionSent, 1508 kAllowHarmonyFunctionSent,
1509 kAllowHarmonyRestrictiveDeclarations, 1509 kAllowHarmonyRestrictiveDeclarations,
1510 kAllowHarmonyExponentiationOperator, 1510 kAllowHarmonyExponentiationOperator,
1511 kAllowHarmonyForIn 1511 kAllowHarmonyForIn,
1512 kAllowHarmonyAsyncAwait
1512 }; 1513 };
1513 1514
1514 enum ParserSyncTestResult { 1515 enum ParserSyncTestResult {
1515 kSuccessOrError, 1516 kSuccessOrError,
1516 kSuccess, 1517 kSuccess,
1517 kError 1518 kError
1518 }; 1519 };
1519 1520
1520 template <typename Traits> 1521 template <typename Traits>
1521 void SetParserFlags(i::ParserBase<Traits>* parser, 1522 void SetParserFlags(i::ParserBase<Traits>* parser,
1522 i::EnumSet<ParserFlag> flags) { 1523 i::EnumSet<ParserFlag> flags) {
1523 parser->set_allow_lazy(flags.Contains(kAllowLazy)); 1524 parser->set_allow_lazy(flags.Contains(kAllowLazy));
1524 parser->set_allow_natives(flags.Contains(kAllowNatives)); 1525 parser->set_allow_natives(flags.Contains(kAllowNatives));
1525 parser->set_allow_harmony_function_sent( 1526 parser->set_allow_harmony_function_sent(
1526 flags.Contains(kAllowHarmonyFunctionSent)); 1527 flags.Contains(kAllowHarmonyFunctionSent));
1527 parser->set_allow_harmony_restrictive_declarations( 1528 parser->set_allow_harmony_restrictive_declarations(
1528 flags.Contains(kAllowHarmonyRestrictiveDeclarations)); 1529 flags.Contains(kAllowHarmonyRestrictiveDeclarations));
1529 parser->set_allow_harmony_exponentiation_operator( 1530 parser->set_allow_harmony_exponentiation_operator(
1530 flags.Contains(kAllowHarmonyExponentiationOperator)); 1531 flags.Contains(kAllowHarmonyExponentiationOperator));
1531 parser->set_allow_harmony_for_in(flags.Contains(kAllowHarmonyForIn)); 1532 parser->set_allow_harmony_for_in(flags.Contains(kAllowHarmonyForIn));
1533 parser->set_allow_harmony_async_await(
1534 flags.Contains(kAllowHarmonyAsyncAwait));
1532 } 1535 }
1533 1536
1534 1537
1535 void TestParserSyncWithFlags(i::Handle<i::String> source, 1538 void TestParserSyncWithFlags(i::Handle<i::String> source,
1536 i::EnumSet<ParserFlag> flags, 1539 i::EnumSet<ParserFlag> flags,
1537 ParserSyncTestResult result, 1540 ParserSyncTestResult result,
1538 bool is_module = false, 1541 bool is_module = false,
1539 bool test_preparser = true) { 1542 bool test_preparser = true) {
1540 i::Isolate* isolate = CcTest::i_isolate(); 1543 i::Isolate* isolate = CcTest::i_isolate();
1541 i::Factory* factory = isolate->factory(); 1544 i::Factory* factory = isolate->factory();
(...skipping 5899 matching lines...) Expand 10 before | Expand all | Expand 10 after
7441 NULL 7444 NULL
7442 }; 7445 };
7443 // clang-format on 7446 // clang-format on
7444 7447
7445 static const ParserFlag always_flags[] = { 7448 static const ParserFlag always_flags[] = {
7446 kAllowHarmonyExponentiationOperator}; 7449 kAllowHarmonyExponentiationOperator};
7447 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags, 7450 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
7448 arraysize(always_flags)); 7451 arraysize(always_flags));
7449 } 7452 }
7450 7453
7454 TEST(AsyncAwait) {
7455 // clang-format off
7456 const char* context_data[][2] = {
7457 { "'use strict';", "" },
7458 { "", "" },
7459 { NULL, NULL }
7460 };
7461
7462 const char* data[] = {
7463 "var asyncFn = async function() { await 1; };",
7464 "var asyncFn = async function withName() { await 1; };",
7465 "var asyncFn = async () => await 'test';",
7466 "var asyncFn = async x => await x + 'test';",
7467 "async function asyncFn() { await 1; }",
7468 "var O = { async method() { await 1; } }",
7469 "var O = { async ['meth' + 'od']() { await 1; } }",
7470 "var O = { async 'method'() { await 1; } }",
7471 "var O = { async 0() { await 1; } }",
7472 "async function await() {}",
7473 NULL
7474 };
7475 // clang-format on
7476
7477 static const ParserFlag always_flags[] = {kAllowHarmonyAsyncAwait};
7478 RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
7479 arraysize(always_flags));
7480
7481 // clang-format off
7482 const char* async_body_context_data[][2] = {
7483 { "async function f() {", "}" },
7484 { "var f = async function() {", "}" },
7485 { "var f = async() => {", "}" },
7486 { "var O = { async method() {", "} }" },
7487 { "'use strict'; async function f() {", "}" },
7488 { "'use strict'; var f = async function() {", "}" },
7489 { "'use strict'; var f = async() => {", "}" },
7490 { "'use strict'; var O = { async method() {", "} }" },
7491 { NULL, NULL }
7492 };
7493
7494 const char* body_context_data[][2] = {
7495 { "function f() {", "}" },
7496 { "function* g() {", "}" },
7497 { "var f = function() {", "}" },
7498 { "var g = function*() {", "}" },
7499 { "var O = { method() {", "} }" },
7500 { "var O = { *method() {", "} }" },
7501 { "var f = () => {", "}" },
7502 { "'use strict'; function f() {", "}" },
7503 { "'use strict'; function* g() {", "}" },
7504 { "'use strict'; var f = function() {", "}" },
7505 { "'use strict'; var g = function*() {", "}" },
7506 { "'use strict'; var O = { method() {", "} }" },
7507 { "'use strict'; var O = { *method() {", "} }" },
7508 { "'use strict'; var f = () => {", "}" },
7509 { NULL, NULL }
7510 };
7511
7512 const char* body_data[] = {
7513 "var async = 1; return async;",
7514 "let async = 1; return async;",
7515 "const async = 1; return async;",
7516 "function async() {} return async();",
7517 "var async = async => async; return async();",
7518 "function foo() { var await = 1; return await; }",
7519 "function foo(await) { return await; }",
7520 "function* foo() { var await = 1; return await; }",
7521 "function* foo(await) { return await; }",
7522 "var f = (await) => await;",
7523 "var f = () => { var await = 1; return await; }",
7524 "var O = { method() { var await = 1; return await; } };",
7525 "var O = { method(await) { return await; } };",
7526 "var O = { *method() { var await = 1; return await; } };",
7527 "var O = { *method(await) { return await; } };",
7528
7529 "(function await() {})",
7530 NULL
7531 };
7532 // clang-format on
7533
7534 RunParserSyncTest(async_body_context_data, body_data, kSuccess, NULL, 0,
7535 always_flags, arraysize(always_flags));
7536 RunParserSyncTest(body_context_data, body_data, kSuccess, NULL, 0,
7537 always_flags, arraysize(always_flags));
7538 }
7539
7540 TEST(AsyncAwaitErrors) {
7541 // clang-format off
7542 const char* context_data[][2] = {
7543 { "'use strict';", "" },
7544 { "", "" },
7545 { NULL, NULL }
7546 };
7547
7548 const char* strict_context_data[][2] = {
7549 { "'use strict';", "" },
7550 { NULL, NULL }
7551 };
7552
7553 const char* error_data[] = {
7554 "var asyncFn = async function() { var await = 1; };",
7555 "var asyncFn = async function() { var { await } = 1; };",
7556 "var asyncFn = async function() { var [ await ] = 1; };",
7557 "var asyncFn = async function await() {};",
7558 "var asyncFn = async () => var await = 'test';",
7559 "var asyncFn = async await => await + 'test';",
7560 "var asyncFn = async function(await) {};",
7561 "var asyncFn = async function() { return async (await) => {}; }",
7562 "var asyncFn = async (await) => 'test';",
7563 "var asyncFn = async x => { var await = 1; }",
7564 "var asyncFn = async x => { var { await } = 1; }",
7565 "var asyncFn = async x => { var [ await ] = 1; }",
7566 "async function f(await) {}",
7567 "async function f() { var await = 1; }",
7568 "async function f() { var { await } = 1; }",
7569 "async function f() { var [ await ] = 1; }",
7570
7571 "var O = { async method(a, a) {} }",
7572 "var O = { async ['meth' + 'od'](a, a) {} }",
7573 "var O = { async 'method'(a, a) {} }",
7574 "var O = { async 0(a, a) {} }",
7575
7576 "async function f() { var O = { async [await](a, a) {} } }",
7577
7578 "var asyncFn = async function() { await; }",
7579 "async function f() { await; }",
7580 "var O = { async method() { await; } };",
7581 "var f = async() => await;",
7582 "var f = async() => { await; };",
7583
7584 "var asyncFn = async function*() {}",
7585 "async function* f() {}",
7586 "var O = { *async method() {} };",
7587 "var O = { async *method() {} };",
7588 "var O = { async method*() {} };",
7589
7590 "var asyncFn = async function(x = await 1) { return x; }",
7591 "async function f(x = await 1) { return x; }",
7592 "var f = async(x = await 1) => x;",
7593 "var O = { async method(x = await 1) { return x; } };",
7594
7595 "var f = async(x = await) => 1;",
7596
7597 "class C { async constructor() {} }",
7598 "class C {}; class C2 extends C { async constructor() {} }",
7599 "class C { static async prototype() {} }",
7600 "class C {}; class C2 extends C { static async prototype() {} }",
7601
7602 "var f = async() => ((async(x = await 1) => x)();",
7603
7604 "var asyncFn = async function() { function await() {} }",
7605 "var asyncFn = async() => { function await() {} }",
7606 "var O = { async method() { function await() {} } }",
7607 "async function foo() { function await() {} }",
7608
7609 NULL
7610 };
7611
7612 const char* strict_error_data[] = {
7613 "var O = { async method(eval) {} }",
7614 "var O = { async ['meth' + 'od'](eval) {} }",
7615 "var O = { async 'method'(eval) {} }",
7616 "var O = { async 0(eval) {} }",
7617
7618 "var O = { async method(arguments) {} }",
7619 "var O = { async ['meth' + 'od'](arguments) {} }",
7620 "var O = { async 'method'(arguments) {} }",
7621 "var O = { async 0(arguments) {} }",
7622
7623 "var O = { async method(dupe, dupe) {} }",
7624
7625 // TODO(caitp): preparser needs to report duplicate parameter errors, too.
7626 // "var f = async(dupe, dupe) => {}",
7627
7628 NULL
7629 };
7630 // clang-format on
7631
7632 static const ParserFlag always_flags[] = {kAllowHarmonyAsyncAwait};
7633 RunParserSyncTest(context_data, error_data, kError, NULL, 0, always_flags,
7634 arraysize(always_flags));
7635 RunParserSyncTest(strict_context_data, strict_error_data, kError, NULL, 0,
7636 always_flags, arraysize(always_flags));
7637 }
7638
7639 TEST(AsyncAwaitModule) {
7640 // clang-format off
7641 const char* context_data[][2] = {
7642 { "", "" },
7643 { NULL, NULL }
7644 };
7645
7646 const char* data[] = {
7647 "export default async function() { await 1; }",
7648 "export default async function async() { await 1; }",
7649 "export async function async() { await 1; }",
7650 NULL
7651 };
7652 // clang-format on
7653
7654 static const ParserFlag always_flags[] = {kAllowHarmonyAsyncAwait};
7655 RunModuleParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
7656 arraysize(always_flags), NULL, 0, false);
7657 }
7658
7659 TEST(AsyncAwaitModuleErrors) {
7660 // clang-format off
7661 const char* context_data[][2] = {
7662 { "", "" },
7663 { NULL, NULL }
7664 };
7665
7666 const char* error_data[] = {
7667 "export default (async function await() {})",
7668 "export default async function await() {}",
7669 "export async function await() {}",
7670 "export async function() {}",
7671 "export async",
7672 NULL
7673 };
7674 // clang-format on
7675
7676 static const ParserFlag always_flags[] = {kAllowHarmonyAsyncAwait};
7677 RunModuleParserSyncTest(context_data, error_data, kError, NULL, 0,
7678 always_flags, arraysize(always_flags), NULL, 0,
7679 false);
7680 }
7681
7451 TEST(RestrictiveForInErrors) { 7682 TEST(RestrictiveForInErrors) {
7452 // clang-format off 7683 // clang-format off
7453 const char* context_data[][2] = { 7684 const char* context_data[][2] = {
7454 { "'use strict'", "" }, 7685 { "'use strict'", "" },
7455 { "", "" }, 7686 { "", "" },
7456 { NULL, NULL } 7687 { NULL, NULL }
7457 }; 7688 };
7458 const char* error_data[] = { 7689 const char* error_data[] = {
7459 "for (var x = 0 in {});", 7690 "for (var x = 0 in {});",
7460 "for (const x = 0 in {});", 7691 "for (const x = 0 in {});",
7461 "for (let x = 0 in {});", 7692 "for (let x = 0 in {});",
7462 NULL 7693 NULL
7463 }; 7694 };
7464 // clang-format on 7695 // clang-format on
7465 7696
7466 static const ParserFlag always_flags[] = {kAllowHarmonyForIn}; 7697 static const ParserFlag always_flags[] = {kAllowHarmonyForIn};
7467 RunParserSyncTest(context_data, error_data, kError, nullptr, 0, always_flags, 7698 RunParserSyncTest(context_data, error_data, kError, nullptr, 0, always_flags,
7468 arraysize(always_flags)); 7699 arraysize(always_flags));
7469 } 7700 }
OLDNEW
« no previous file with comments | « src/parsing/token.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698