diff --git a/src/codegen/stdlib/json.ts b/src/codegen/stdlib/json.ts index 4101fff3..992e0f11 100644 --- a/src/codegen/stdlib/json.ts +++ b/src/codegen/stdlib/json.ts @@ -1,4 +1,4 @@ -import { Expression, MethodCallNode, ObjectNode } from "../../ast/types.js"; +import { Expression, MethodCallNode, ObjectNode, TypeAssertionNode } from "../../ast/types.js"; interface ExprBase { type: string; @@ -500,7 +500,17 @@ export class JsonGenerator { return this.ctx.emitError("JSON.stringify() requires 1 argument", expr.loc); } - const arg = expr.args[0]; + if (expr.args[0].type === "type_assertion") { + return this.generateStringifyArg( + (expr.args[0] as unknown as TypeAssertionNode).expression, + expr, + params, + ); + } + return this.generateStringifyArg(expr.args[0], expr, params); + } + + private generateStringifyArg(arg: Expression, expr: MethodCallNode, params: string[]): string { const spaces = this.getSpaces(expr); if (this.ctx.isStringExpression(arg)) { diff --git a/tests/fixtures/builtins/json-stringify-mixed-vars.ts b/tests/fixtures/builtins/json-stringify-mixed-vars.ts new file mode 100644 index 00000000..ba8d7388 --- /dev/null +++ b/tests/fixtures/builtins/json-stringify-mixed-vars.ts @@ -0,0 +1,8 @@ +// @test-description: json stringify inline object with mixed string and number variable values +const name = "hello"; +const count = 42; +const ts = 1234567890; +const result = JSON.stringify({ name: name, count: count, ts: ts }); +if (result.includes("hello") && result.includes("42") && result.includes("1234567890")) { + console.log("TEST_PASSED"); +} diff --git a/tests/fixtures/builtins/json-stringify-type-assertion.ts b/tests/fixtures/builtins/json-stringify-type-assertion.ts new file mode 100644 index 00000000..94b1a1ad --- /dev/null +++ b/tests/fixtures/builtins/json-stringify-type-assertion.ts @@ -0,0 +1,8 @@ +// @test-description: json stringify inline object with type assertion does not crash +const name = "hello"; +const count = 42; +const ts = 1234567890; +const result = JSON.stringify({ name: name, count: count, ts: ts } as any); +if (result.includes("hello") && result.includes("42") && result.includes("1234567890")) { + console.log("TEST_PASSED"); +}