aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-26 19:17:59 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-26 19:18:35 -0800
commit7169bbbb9c9a24bfd7b7926d5f45dfe4ef3ff759 (patch)
tree19262c21e6741c92123dbf0f1730f5d72b03dd40
parent6d0660613548869feb97a299f3aee7b718025802 (diff)
downloadbun-7169bbbb9c9a24bfd7b7926d5f45dfe4ef3ff759.tar.gz
bun-7169bbbb9c9a24bfd7b7926d5f45dfe4ef3ff759.tar.zst
bun-7169bbbb9c9a24bfd7b7926d5f45dfe4ef3ff759.zip
Fixes #1907
-rw-r--r--src/js_parser.zig22
-rw-r--r--test/bun.js/transpiler.test.js91
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 = [
[