Index: test/cctest/test-parsing.cc |
diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc |
index bbfe7b53efccf6c4d6a88b207f8ed823abdeb7b1..376cc9b9e9afca23b366671121d718a7c5f62076 100644 |
--- a/test/cctest/test-parsing.cc |
+++ b/test/cctest/test-parsing.cc |
@@ -1491,6 +1491,7 @@ enum ParserFlag { |
kAllowHarmonyRestrictiveGenerators, |
kAllowHarmonyTrailingCommas, |
kAllowHarmonyClassFields, |
+ kAllowHarmonyPrivateClassFields, |
}; |
enum ParserSyncTestResult { |
@@ -1517,6 +1518,8 @@ void SetParserFlags(i::ParserBase<Traits>* parser, |
flags.Contains(kAllowHarmonyTrailingCommas)); |
parser->set_allow_harmony_class_fields( |
flags.Contains(kAllowHarmonyClassFields)); |
+ parser->set_allow_harmony_private_class_fields( |
+ flags.Contains(kAllowHarmonyPrivateClassFields)); |
} |
@@ -4727,6 +4730,102 @@ TEST(ClassFieldsErrors) { |
arraysize(with_async)); |
} |
+TEST(ClassPrivatesNoErrors) { |
+ // clang-format off |
+ // Tests proposed class private fields syntax. |
+ const char* class_body_contexts[][2] = {{"(class {", "});"}, |
+ {"(class extends Base {", "});"}, |
+ {"class C {", "}"}, |
+ {"class C extends Base {", "}"}, |
+ {NULL, NULL}}; |
+ const char* class_body_data[] = { |
+ // Basic syntax |
+ "#a = 0;", |
+ "#a = 0; #b", |
+ "#a = 0; b(){}", |
+ "#a = 0; *b(){}", |
+ "#a = 0; ['b'](){}", |
+ "#a;", |
+ "#a; #b;", |
+ "#a; b(){}", |
+ "#a; *b(){}", |
+ "#a; ['b'](){}", |
+ |
+ // ASI |
+ "#a = 0\n", |
+ "#a = 0\n #b", |
+ "#a = 0\n b(){}", |
+ "#a\n", |
+ "#a\n #b\n", |
+ "#a\n b(){}", |
+ "#a\n *b(){}", |
+ "#a\n ['b'](){}", |
+ |
+ // Misc edge cases |
+ "#yield", |
+ "#yield = 0", |
+ "#yield\n #a", |
+ NULL |
+ }; |
+ // clang-format on |
+ |
+ static const ParserFlag flags[] = {kAllowHarmonyPrivateClassFields}; |
+ RunParserSyncTest(class_body_contexts, class_body_data, kSuccess, NULL, 0, |
+ flags, arraysize(flags)); |
+ |
+ // clang-format off |
+ const char* declaration_contexts[][2] = {{"(class { #x;", "});"}, |
+ {"(class extends Base { #x;", "});"}, |
+ {"class C { #x;", "}"}, |
+ {"class C extends Base { #x;", "}"}, |
+ {"(class {", "\n#x;});"}, |
+ {NULL, NULL}}; |
+ const char* declaration_bodies[] = { |
+ "m(){ ++#x; return #x; }", |
+ "m(o){ ++#x; return o.#x; }", |
+ "m(){ #x = 0; }", |
+ "m(o){ o.#x = 0; }", |
+ "m(){ ({a: #x} = {a: 0}); }", |
+ "m(){ ({a: o.#x} = {a: 0}); }", |
+ "static m(){ ++#x; return #x; }", |
+ "static m(o){ ++#x; return o.#x; }", |
+ "static m(){ #x = 0; }", |
+ "static m(o){ o.#x = 0; }", |
+ "static m(){ ({a: #x} = {a: 0}); }", |
+ "static m(){ ({a: o.#x} = {a: 0}); }", |
+ NULL |
+ }; |
+ // clang-format on |
+ |
+ RunParserSyncTest(declaration_contexts, declaration_bodies, kSuccess, NULL, 0, |
+ flags, arraysize(flags)); |
+} |
+ |
+TEST(ClassPrivatesErrors) { |
+ // clang-format off |
+ // Tests proposed class private fields syntax. |
+ const char* context_data[][2] = {{"(class {", "});"}, |
+ {"(class extends Base {", "});"}, |
+ {"class C {", "}"}, |
+ {"class C extends Base {", "}"}, |
+ {NULL, NULL}}; |
+ // clang-format off |
+ const char* class_body_data[] = { |
+ "#x = 0\n *a(){}", |
+ "#['x'] = 0;", |
+ "#['x'];", |
+ "#x; #x;", |
+ "#x = 0; #x;", |
+ "#x = 0; #x = 0", |
+ NULL |
+ }; |
+ // clang-format on |
+ |
+ static const ParserFlag without_async[] = {kAllowHarmonyPrivateClassFields}; |
+ RunParserSyncTest(context_data, class_body_data, kError, NULL, 0, |
+ without_async, arraysize(without_async)); |
+} |
+ |
TEST(ClassExpressionErrors) { |
const char* context_data[][2] = {{"(", ");"}, |
{"var C = ", ";"}, |