diff options
author | 2023-01-26 19:17:59 -0800 | |
---|---|---|
committer | 2023-01-26 19:18:35 -0800 | |
commit | 7169bbbb9c9a24bfd7b7926d5f45dfe4ef3ff759 (patch) | |
tree | 19262c21e6741c92123dbf0f1730f5d72b03dd40 | |
parent | 6d0660613548869feb97a299f3aee7b718025802 (diff) | |
download | bun-7169bbbb9c9a24bfd7b7926d5f45dfe4ef3ff759.tar.gz bun-7169bbbb9c9a24bfd7b7926d5f45dfe4ef3ff759.tar.zst bun-7169bbbb9c9a24bfd7b7926d5f45dfe4ef3ff759.zip |
Fixes #1907
-rw-r--r-- | src/js_parser.zig | 22 | ||||
-rw-r--r-- | test/bun.js/transpiler.test.js | 91 |
2 files changed, 112 insertions, 1 deletions
diff --git a/src/js_parser.zig b/src/js_parser.zig index ab9c9bec6..4159faada 100644 --- a/src/js_parser.zig +++ b/src/js_parser.zig @@ -2184,6 +2184,7 @@ const PropertyOpts = struct { is_class: bool = false, class_has_extends: bool = false, allow_ts_decorators: bool = false, + is_ts_abstract: bool = false, ts_decorators: []Expr = &[_]Expr{}, has_argument_decorators: bool = false, }; @@ -10218,7 +10219,26 @@ fn NewParser_( return try p.parseProperty(kind, opts, null); } }, - .p_private, .p_protected, .p_public, .p_readonly, .p_abstract, .p_declare, .p_override => { + .p_declare => { + // skip declare keyword entirely + // https://github.com/oven-sh/bun/issues/1907 + if (opts.is_class and is_typescript_enabled and strings.eqlComptime(raw, "declare")) { + const scope_index = p.scopes_in_order.items.len; + _ = try p.parseProperty(kind, opts, null); + p.discardScopesUpTo(scope_index); + return null; + } + }, + .p_abstract => { + if (opts.is_class and is_typescript_enabled and !opts.is_ts_abstract and strings.eqlComptime(raw, "abstract")) { + opts.is_ts_abstract = true; + const scope_index = p.scopes_in_order.items.len; + _ = try p.parseProperty(kind, opts, null); + p.discardScopesUpTo(scope_index); + return null; + } + }, + .p_private, .p_protected, .p_public, .p_readonly, .p_override => { // Skip over TypeScript keywords if (opts.is_class and is_typescript_enabled and (js_lexer.PropertyModifierKeyword.List.get(raw) orelse .p_static) == keyword) { return try p.parseProperty(kind, opts, null); diff --git a/test/bun.js/transpiler.test.js b/test/bun.js/transpiler.test.js index 0e51970cb..62df8d76b 100644 --- a/test/bun.js/transpiler.test.js +++ b/test/bun.js/transpiler.test.js @@ -80,6 +80,97 @@ describe("Bun.Transpiler", () => { ); }); + it("modifiers", () => { + const exp = ts.expectPrinted_; + + exp("class Foo { public foo: number }", "class Foo {\n foo;\n}"); + exp("class Foo { private foo: number }", "class Foo {\n foo;\n}"); + exp("class Foo { protected foo: number }", "class Foo {\n foo;\n}"); + exp("class Foo { declare foo: number }", "class Foo {\n}"); + exp("class Foo { declare public foo: number }", "class Foo {\n}"); + exp("class Foo { public declare foo: number }", "class Foo {\n}"); + exp("class Foo { override foo: number }", "class Foo {\n foo;\n}"); + exp( + "class Foo { override public foo: number }", + "class Foo {\n foo;\n}", + ); + exp( + "class Foo { public override foo: number }", + "class Foo {\n foo;\n}", + ); + exp( + "class Foo { declare override public foo: number }", + "class Foo {\n}", + ); + exp("class Foo { declare foo = 123 }", "class Foo {\n}"); + + exp( + "class Foo { public static foo: number }", + "class Foo {\n static foo;\n}", + ); + exp( + "class Foo { private static foo: number }", + "class Foo {\n static foo;\n}", + ); + exp( + "class Foo { protected static foo: number }", + "class Foo {\n static foo;\n}", + ); + exp("class Foo { declare static foo: number }", "class Foo {\n}"); + exp("class Foo { declare public static foo: number }", "class Foo {\n}"); + exp("class Foo { public declare static foo: number }", "class Foo {\n}"); + exp("class Foo { public static declare foo: number }", "class Foo {\n}"); + exp( + "class Foo { override static foo: number }", + "class Foo {\n static foo;\n}", + ); + exp( + "class Foo { override public static foo: number }", + "class Foo {\n static foo;\n}", + ); + exp( + "class Foo { public override static foo: number }", + "class Foo {\n static foo;\n}", + ); + exp( + "class Foo { public static override foo: number }", + "class Foo {\n static foo;\n}", + ); + exp( + "class Foo { declare override public static foo: number }", + "class Foo {\n}", + ); + exp("class Foo { declare static foo = 123 }", "class Foo {\n}"); + exp("class Foo { static declare foo = 123 }", "class Foo {\n}"); + + exp("let x: abstract new () => void = Foo", "let x = Foo"); + exp("let x: abstract new <T>() => Foo<T>", "let x"); + }); + + it("types", () => { + exp("x as 1 < 1", "x < 1"); + exp("x as 1n < 1", "x < 1"); + exp("x as -1 < 1", "x < 1"); + exp("x as -1n < 1", "x < 1"); + exp("x as '' < 1", "x < 1"); + exp("x as `` < 1", "x < 1"); + exp("x as any < 1", "x < 1"); + exp("x as bigint < 1", "x < 1"); + exp("x as false < 1", "x < 1"); + exp("x as never < 1", "x < 1"); + exp("x as null < 1", "x < 1"); + exp("x as number < 1", "x < 1"); + exp("x as object < 1", "x < 1"); + exp("x as string < 1", "x < 1"); + exp("x as symbol < 1", "x < 1"); + exp("x as this < 1", "x < 1"); + exp("x as true < 1", "x < 1"); + exp("x as undefined < 1", "x < 1"); + exp("x as unique symbol < 1", "x < 1"); + exp("x as unknown < 1", "x < 1"); + exp("x as void < 1", "x < 1"); + }); + it("class constructor", () => { const fixtures = [ [ |