Skip to content

Commit

Permalink
Handle case with TS decorators and export default anonymous class (#3578
Browse files Browse the repository at this point in the history
)

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
  • Loading branch information
Jarred-Sumner and Jarred-Sumner authored Jul 9, 2023
1 parent aa8b832 commit 59570fe
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 2 deletions.
12 changes: 11 additions & 1 deletion src/js_parser.zig
Original file line number Diff line number Diff line change
Expand Up @@ -18146,10 +18146,20 @@ fn NewParser_(
data.default_name = createDefaultName(p, stmt.loc) catch unreachable;
}

// We only inject a name into classes when there is a decorator
if (class.class.has_decorators) {
if (class.class.class_name == null or
class.class.class_name.?.ref == null)
{
class.class.class_name = data.default_name;
}
}

// This is to handle TS decorators, mostly.
var class_stmts = p.lowerClass(.{ .stmt = s2 });
std.debug.assert(class_stmts[0].data == .s_class);

if (class_stmts.len > 1) {
std.debug.assert(class_stmts[0].data == .s_class);
data.value.stmt = class_stmts[0];
stmts.append(stmt.*) catch {};
stmts.appendSlice(class_stmts[1..]) catch {};
Expand Down
10 changes: 10 additions & 0 deletions test/transpiler/decorator-export-default-class-fixture-anon.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
function decorator(target: any, propertyKey: any) {
target[propertyKey + "decorated"] = true;
}

export default class {
@decorator
method() {
return 42;
}
}
7 changes: 6 additions & 1 deletion test/transpiler/decorators.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// @ts-nocheck
import { test, expect, describe } from "bun:test";
import DecoratedClass from "./decorator-export-default-class-fixture";
import DecoratedAnonClass from "./decorator-export-default-class-fixture-anon";

test("decorator order of evaluation", () => {
let counter = 0;
Expand Down Expand Up @@ -990,6 +991,10 @@ describe("constructor statements", () => {
});
});

test("export default class works", () => {
test("export default class Named works", () => {
expect(new DecoratedClass()["methoddecorated"]).toBe(true);
});

test("export default class works (anonymous name)", () => {
expect(new DecoratedAnonClass()["methoddecorated"]).toBe(true);
});
5 changes: 5 additions & 0 deletions test/transpiler/export-default-with-static-initializer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export default class {
static {
this.boop = "boop";
}
}
6 changes: 6 additions & 0 deletions test/transpiler/export-default.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import WithStatic from "./export-default-with-static-initializer";
import { test, expect } from "bun:test";

test("static initializer", () => {
expect(WithStatic.boop).toBe("boop");
});

0 comments on commit 59570fe

Please sign in to comment.