OLD | NEW |
---|---|
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 4408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4419 "class name extends (F, G) {}", | 4419 "class name extends (F, G) {}", |
4420 "class name extends class {} {}", | 4420 "class name extends class {} {}", |
4421 "class name extends class base {} {}", | 4421 "class name extends class base {} {}", |
4422 NULL}; | 4422 NULL}; |
4423 | 4423 |
4424 RunParserSyncTest(context_data, statement_data, kSuccess); | 4424 RunParserSyncTest(context_data, statement_data, kSuccess); |
4425 } | 4425 } |
4426 | 4426 |
4427 | 4427 |
4428 TEST(ClassBodyNoErrors) { | 4428 TEST(ClassBodyNoErrors) { |
4429 // clang-format off | |
4429 // Tests that parser and preparser accept valid class syntax. | 4430 // Tests that parser and preparser accept valid class syntax. |
4430 const char* context_data[][2] = {{"(class {", "});"}, | 4431 const char* context_data[][2] = {{"(class {", "});"}, |
4431 {"(class extends Base {", "});"}, | 4432 {"(class extends Base {", "});"}, |
4432 {"class C {", "}"}, | 4433 {"class C {", "}"}, |
4433 {"class C extends Base {", "}"}, | 4434 {"class C extends Base {", "}"}, |
4434 {NULL, NULL}}; | 4435 {NULL, NULL}}; |
4435 const char* class_body_data[] = { | 4436 const char* class_body_data[] = { |
4436 ";", | 4437 ";", |
4437 ";;", | 4438 ";;", |
4438 "m() {}", | 4439 "m() {}", |
4439 "m() {};", | 4440 "m() {};", |
4440 "; m() {}", | 4441 "; m() {}", |
4441 "m() {}; n(x) {}", | 4442 "m() {}; n(x) {}", |
4442 "get x() {}", | 4443 "get x() {}", |
4443 "set x(v) {}", | 4444 "set x(v) {}", |
4444 "get() {}", | 4445 "get() {}", |
4445 "set() {}", | 4446 "set() {}", |
4446 "*g() {}", | 4447 "*g() {}", |
4447 "*g() {};", | 4448 "*g() {};", |
4448 "; *g() {}", | 4449 "; *g() {}", |
4449 "*g() {}; *h(x) {}", | 4450 "*g() {}; *h(x) {}", |
4450 "static() {}", | 4451 "static() {}", |
4452 "get static() {}", | |
4453 "set static(v) {}", | |
4451 "static m() {}", | 4454 "static m() {}", |
4452 "static get x() {}", | 4455 "static get x() {}", |
4453 "static set x(v) {}", | 4456 "static set x(v) {}", |
4454 "static get() {}", | 4457 "static get() {}", |
4455 "static set() {}", | 4458 "static set() {}", |
4456 "static static() {}", | 4459 "static static() {}", |
4457 "static get static() {}", | 4460 "static get static() {}", |
4458 "static set static(v) {}", | 4461 "static set static(v) {}", |
4459 "*static() {}", | 4462 "*static() {}", |
4463 "static *static() {}", | |
4460 "*get() {}", | 4464 "*get() {}", |
4461 "*set() {}", | 4465 "*set() {}", |
4462 "static *g() {}", | 4466 "static *g() {}", |
4467 | |
4468 // Escaped 'static' should be allowed anywhere | |
caitp (gmail)
2016/01/19 21:17:03
missing a `st\u{61}tic foo() {}` error case, since
adamk
2016/01/19 21:21:34
That's already tested down in EscapedKeywords.
| |
4469 // static-as-PropertyName is. | |
4470 "st\\u0061tic() {}", | |
4471 "get st\\u0061tic() {}", | |
4472 "set st\\u0061tic(v) {}", | |
4473 "static st\\u0061tic() {}", | |
4474 "static get st\\u0061tic() {}", | |
4475 "static set st\\u0061tic(v) {}", | |
4476 "*st\\u0061tic() {}", | |
4477 "static *st\\u0061tic() {}", | |
4463 NULL}; | 4478 NULL}; |
4479 // clang-format on | |
4464 | 4480 |
4465 static const ParserFlag always_flags[] = { | 4481 static const ParserFlag always_flags[] = { |
4466 kAllowHarmonySloppy | 4482 kAllowHarmonySloppy |
4467 }; | 4483 }; |
4468 RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, | 4484 RunParserSyncTest(context_data, class_body_data, kSuccess, NULL, 0, |
4469 always_flags, arraysize(always_flags)); | 4485 always_flags, arraysize(always_flags)); |
4470 } | 4486 } |
4471 | 4487 |
4472 | 4488 |
4473 TEST(ClassPropertyNameNoErrors) { | 4489 TEST(ClassPropertyNameNoErrors) { |
(...skipping 3197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7671 "for (const let in {}) {}", | 7687 "for (const let in {}) {}", |
7672 "for (const let of []) {}", | 7688 "for (const let of []) {}", |
7673 "let [let] = 1", | 7689 "let [let] = 1", |
7674 "for (let [let] = 1; let < 1; let++) {}", | 7690 "for (let [let] = 1; let < 1; let++) {}", |
7675 "for (let [let] in {}) {}", | 7691 "for (let [let] in {}) {}", |
7676 "for (let [let] of []) {}", | 7692 "for (let [let] of []) {}", |
7677 "const [let] = 1", | 7693 "const [let] = 1", |
7678 "for (const [let] = 1; let < 1; let++) {}", | 7694 "for (const [let] = 1; let < 1; let++) {}", |
7679 "for (const [let] in {}) {}", | 7695 "for (const [let] in {}) {}", |
7680 "for (const [let] of []) {}", | 7696 "for (const [let] of []) {}", |
7697 | |
7698 // Sprinkle in the escaped version too. | |
7699 "let l\\u0065t = 1", | |
7700 "const l\\u0065t = 1", | |
7701 "let [l\\u0065t] = 1", | |
7702 "const [l\\u0065t] = 1", | |
7703 "for (let l\\u0065t in {}) {}", | |
7681 NULL | 7704 NULL |
7682 }; | 7705 }; |
7683 // clang-format on | 7706 // clang-format on |
7684 | 7707 |
7685 static const ParserFlag fail_flags[] = { | 7708 static const ParserFlag fail_flags[] = { |
7686 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst, | 7709 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kNoLegacyConst, |
7687 kAllowHarmonyDestructuring}; | 7710 kAllowHarmonyDestructuring}; |
7688 RunParserSyncTest(context_data, fail_data, kError, NULL, 0, fail_flags, | 7711 RunParserSyncTest(context_data, fail_data, kError, NULL, 0, fail_flags, |
7689 arraysize(fail_flags)); | 7712 arraysize(fail_flags)); |
7690 } | 7713 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7729 "th\\u0069s.a = 1;", | 7752 "th\\u0069s.a = 1;", |
7730 "thr\\u006fw 'boo';", | 7753 "thr\\u006fw 'boo';", |
7731 "t\\u0072y { true } catch (e) {}", | 7754 "t\\u0072y { true } catch (e) {}", |
7732 "var x = typ\\u0065of 'blah'", | 7755 "var x = typ\\u0065of 'blah'", |
7733 "v\\u0061r a = true", | 7756 "v\\u0061r a = true", |
7734 "var v\\u0061r = true", | 7757 "var v\\u0061r = true", |
7735 "(function() { return v\\u006fid 0; })()", | 7758 "(function() { return v\\u006fid 0; })()", |
7736 "wh\\u0069le (true) { }", | 7759 "wh\\u0069le (true) { }", |
7737 "w\\u0069th (this.scope) { }", | 7760 "w\\u0069th (this.scope) { }", |
7738 "(function*() { y\\u0069eld 1; })()", | 7761 "(function*() { y\\u0069eld 1; })()", |
7762 "(function*() { var y\\u0069eld = 1; })()", | |
7739 | 7763 |
7740 "var \\u0065num = 1;", | 7764 "var \\u0065num = 1;", |
7741 "var { \\u0065num } = {}", | 7765 "var { \\u0065num } = {}", |
7742 "(\\u0065num = 1);", | 7766 "(\\u0065num = 1);", |
7743 | 7767 |
7744 // Null / Boolean literals | 7768 // Null / Boolean literals |
7745 "(x === n\\u0075ll);", | 7769 "(x === n\\u0075ll);", |
7746 "var x = n\\u0075ll;", | 7770 "var x = n\\u0075ll;", |
7747 "var n\\u0075ll = 1;", | 7771 "var n\\u0075ll = 1;", |
7748 "var { n\\u0075ll } = { 1 };", | 7772 "var { n\\u0075ll } = { 1 };", |
(...skipping 17 matching lines...) Expand all Loading... | |
7766 "class C \\u0065xtends function B() {} {}", | 7790 "class C \\u0065xtends function B() {} {}", |
7767 "for (var a i\\u006e this) {}", | 7791 "for (var a i\\u006e this) {}", |
7768 "if ('foo' \\u0069n this) {}", | 7792 "if ('foo' \\u0069n this) {}", |
7769 "if (this \\u0069nstanceof Array) {}", | 7793 "if (this \\u0069nstanceof Array) {}", |
7770 "(n\\u0065w function f() {})", | 7794 "(n\\u0065w function f() {})", |
7771 "(typ\\u0065of 123)", | 7795 "(typ\\u0065of 123)", |
7772 "(v\\u006fid 0)", | 7796 "(v\\u006fid 0)", |
7773 "do { ; } wh\\u0069le (true) { }", | 7797 "do { ; } wh\\u0069le (true) { }", |
7774 "(function*() { return (n++, y\\u0069eld 1); })()", | 7798 "(function*() { return (n++, y\\u0069eld 1); })()", |
7775 "class C { st\\u0061tic bar() {} }", | 7799 "class C { st\\u0061tic bar() {} }", |
7800 "class C { st\\u0061tic *bar() {} }", | |
7801 "class C { st\\u0061tic get bar() {} }", | |
7802 "class C { st\\u0061tic set bar() {} }", | |
7776 | 7803 |
7804 // TODO(adamk): These should not be errors in sloppy mode. | |
7777 "(y\\u0069eld);", | 7805 "(y\\u0069eld);", |
7778 "var y\\u0069eld = 1;", | 7806 "var y\\u0069eld = 1;", |
7779 "var { y\\u0069eld } = {};", | 7807 "var { y\\u0069eld } = {};", |
7780 NULL | 7808 NULL |
7781 }; | 7809 }; |
7782 // clang-format on | 7810 // clang-format on |
7783 | 7811 |
7784 static const ParserFlag always_flags[] = {kAllowHarmonySloppy, | 7812 static const ParserFlag always_flags[] = {kAllowHarmonySloppy, |
7785 kAllowHarmonyDestructuring}; | 7813 kAllowHarmonyDestructuring}; |
7786 RunParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, | 7814 RunParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, |
7787 always_flags, arraysize(always_flags)); | 7815 always_flags, arraysize(always_flags)); |
7788 RunParserSyncTest(strict_context_data, fail_data, kError, NULL, 0, | 7816 RunParserSyncTest(strict_context_data, fail_data, kError, NULL, 0, |
7789 always_flags, arraysize(always_flags)); | 7817 always_flags, arraysize(always_flags)); |
7790 RunModuleParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, | 7818 RunModuleParserSyncTest(sloppy_context_data, fail_data, kError, NULL, 0, |
7791 always_flags, arraysize(always_flags)); | 7819 always_flags, arraysize(always_flags)); |
7792 | 7820 |
7793 // clang-format off | 7821 // clang-format off |
7794 const char* let_data[] = { | 7822 const char* let_data[] = { |
7795 "var l\\u0065t = 1;", | 7823 "var l\\u0065t = 1;", |
7796 "l\\u0065t = 1;", | 7824 "l\\u0065t = 1;", |
7797 "(l\\u0065t === 1);", | 7825 "(l\\u0065t === 1);", |
7798 NULL | 7826 NULL |
7799 }; | 7827 }; |
7800 // clang-format on | 7828 // clang-format on |
7801 | 7829 |
7802 RunParserSyncTest(sloppy_context_data, let_data, kError, NULL, 0, | 7830 RunParserSyncTest(sloppy_context_data, let_data, kSuccess, NULL, 0, |
7803 always_flags, arraysize(always_flags)); | 7831 always_flags, arraysize(always_flags)); |
7804 RunParserSyncTest(strict_context_data, let_data, kError, NULL, 0, | 7832 RunParserSyncTest(strict_context_data, let_data, kError, NULL, 0, |
7805 always_flags, arraysize(always_flags)); | 7833 always_flags, arraysize(always_flags)); |
7806 | 7834 |
7807 static const ParserFlag sloppy_let_flags[] = { | 7835 static const ParserFlag sloppy_let_flags[] = { |
7808 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowHarmonyDestructuring}; | 7836 kAllowHarmonySloppy, kAllowHarmonySloppyLet, kAllowHarmonyDestructuring}; |
7809 RunParserSyncTest(sloppy_context_data, let_data, kError, NULL, 0, | 7837 RunParserSyncTest(sloppy_context_data, let_data, kSuccess, NULL, 0, |
7810 sloppy_let_flags, arraysize(sloppy_let_flags)); | 7838 sloppy_let_flags, arraysize(sloppy_let_flags)); |
7811 | 7839 |
7812 // Non-errors in sloppy mode | 7840 // Non-errors in sloppy mode |
7813 const char* valid_data[] = {"(\\u0069mplements = 1);", | 7841 const char* valid_data[] = {"(\\u0069mplements = 1);", |
7814 "var impl\\u0065ments = 1;", | 7842 "var impl\\u0065ments = 1;", |
7815 "var { impl\\u0065ments } = {};", | 7843 "var { impl\\u0065ments } = {};", |
7816 "(\\u0069nterface = 1);", | 7844 "(\\u0069nterface = 1);", |
7817 "var int\\u0065rface = 1;", | 7845 "var int\\u0065rface = 1;", |
7818 "var { int\\u0065rface } = {};", | 7846 "var { int\\u0065rface } = {};", |
7819 "(p\\u0061ckage = 1);", | 7847 "(p\\u0061ckage = 1);", |
7820 "var packa\\u0067e = 1;", | 7848 "var packa\\u0067e = 1;", |
7821 "var { packa\\u0067e } = {};", | 7849 "var { packa\\u0067e } = {};", |
7822 "(p\\u0072ivate = 1);", | 7850 "(p\\u0072ivate = 1);", |
7823 "var p\\u0072ivate;", | 7851 "var p\\u0072ivate;", |
7824 "var { p\\u0072ivate } = {};", | 7852 "var { p\\u0072ivate } = {};", |
7825 "(prot\\u0065cted);", | 7853 "(prot\\u0065cted);", |
7826 "var prot\\u0065cted = 1;", | 7854 "var prot\\u0065cted = 1;", |
7827 "var { prot\\u0065cted } = {};", | 7855 "var { prot\\u0065cted } = {};", |
7828 "(publ\\u0069c);", | 7856 "(publ\\u0069c);", |
7829 "var publ\\u0069c = 1;", | 7857 "var publ\\u0069c = 1;", |
7830 "var { publ\\u0069c } = {};", | 7858 "var { publ\\u0069c } = {};", |
7859 "(st\\u0061tic);", | |
7860 "var st\\u0061tic = 1;", | |
7861 "var { st\\u0061tic } = {};", | |
7831 NULL}; | 7862 NULL}; |
7832 RunParserSyncTest(sloppy_context_data, valid_data, kSuccess, NULL, 0, | 7863 RunParserSyncTest(sloppy_context_data, valid_data, kSuccess, NULL, 0, |
7833 always_flags, arraysize(always_flags)); | 7864 always_flags, arraysize(always_flags)); |
7834 RunParserSyncTest(strict_context_data, valid_data, kError, NULL, 0, | 7865 RunParserSyncTest(strict_context_data, valid_data, kError, NULL, 0, |
7835 always_flags, arraysize(always_flags)); | 7866 always_flags, arraysize(always_flags)); |
7836 RunModuleParserSyncTest(strict_context_data, valid_data, kError, NULL, 0, | 7867 RunModuleParserSyncTest(strict_context_data, valid_data, kError, NULL, 0, |
7837 always_flags, arraysize(always_flags)); | 7868 always_flags, arraysize(always_flags)); |
7838 } | 7869 } |
7839 | 7870 |
7840 | 7871 |
7841 TEST(MiscSyntaxErrors) { | 7872 TEST(MiscSyntaxErrors) { |
7842 const char* context_data[][2] = { | 7873 const char* context_data[][2] = { |
7843 {"'use strict'", ""}, {"", ""}, {NULL, NULL}}; | 7874 {"'use strict'", ""}, {"", ""}, {NULL, NULL}}; |
7844 const char* error_data[] = {"for (();;) {}", NULL}; | 7875 const char* error_data[] = {"for (();;) {}", NULL}; |
7845 | 7876 |
7846 RunParserSyncTest(context_data, error_data, kError, NULL, 0, NULL, 0); | 7877 RunParserSyncTest(context_data, error_data, kError, NULL, 0, NULL, 0); |
7847 } | 7878 } |
OLD | NEW |