Skip to content

Commit 5ac8497

Browse files
Copilotjakebailey
andauthored
Fix JSX emit to preserve string delimiters (#2327)
Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jakebailey <[email protected]>
1 parent 40ef382 commit 5ac8497

File tree

11 files changed

+17
-71
lines changed

11 files changed

+17
-71
lines changed

internal/transformers/jsxtransforms/jsx.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,8 @@ func (tx *JSXTransformer) transformJsxAttributeInitializer(node *ast.Node) *ast.
529529
// Need to be escaped to be handled correctly in a normal string
530530
res := tx.Factory().NewStringLiteral(decodeEntities(node.Text()))
531531
res.Loc = node.Loc
532+
// Preserve the original quote style (single vs double quotes)
533+
res.AsStringLiteral().TokenFlags = node.AsStringLiteral().TokenFlags
532534
return res
533535
}
534536
if node.Kind == ast.KindJsxExpression {

testdata/baselines/reference/submodule/compiler/jsxMultilineAttributeValuesReact.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ foo: 23\n
1515

1616
//// [jsxMultilineAttributeValuesReact.js]
1717
const a = React.createElement("input", { value: "\nfoo: 23\n" });
18-
const b = React.createElement("input", { value: "\nfoo: 23\n" });
19-
const c = React.createElement("input", { value: "\nfoo: 23\\n\n" });
18+
const b = React.createElement("input", { value: '\nfoo: 23\n' });
19+
const c = React.createElement("input", { value: '\nfoo: 23\\n\n' });

testdata/baselines/reference/submodule/compiler/jsxMultilineAttributeValuesReact.js.diff

Lines changed: 0 additions & 10 deletions
This file was deleted.

testdata/baselines/reference/submodule/conformance/tsxReactEmit1.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,16 @@ var whitespace3 = <div>
4747
var p;
4848
var selfClosed1 = React.createElement("div", null);
4949
var selfClosed2 = React.createElement("div", { x: "1" });
50-
var selfClosed3 = React.createElement("div", { x: "1" });
51-
var selfClosed4 = React.createElement("div", { x: "1", y: "0" });
52-
var selfClosed5 = React.createElement("div", { x: 0, y: "0" });
53-
var selfClosed6 = React.createElement("div", { x: "1", y: "0" });
54-
var selfClosed7 = React.createElement("div", { x: p, y: "p", b: true });
50+
var selfClosed3 = React.createElement("div", { x: '1' });
51+
var selfClosed4 = React.createElement("div", { x: "1", y: '0' });
52+
var selfClosed5 = React.createElement("div", { x: 0, y: '0' });
53+
var selfClosed6 = React.createElement("div", { x: "1", y: '0' });
54+
var selfClosed7 = React.createElement("div", { x: p, y: 'p', b: true });
5555
var openClosed1 = React.createElement("div", null);
56-
var openClosed2 = React.createElement("div", { n: "m" }, "foo");
57-
var openClosed3 = React.createElement("div", { n: "m" }, p);
58-
var openClosed4 = React.createElement("div", { n: "m" }, p < p);
59-
var openClosed5 = React.createElement("div", { n: "m", b: true }, p > p);
56+
var openClosed2 = React.createElement("div", { n: 'm' }, "foo");
57+
var openClosed3 = React.createElement("div", { n: 'm' }, p);
58+
var openClosed4 = React.createElement("div", { n: 'm' }, p < p);
59+
var openClosed5 = React.createElement("div", { n: 'm', b: true }, p > p);
6060
class SomeClass {
6161
f() {
6262
var rewrites1 = React.createElement("div", null, () => this);

testdata/baselines/reference/submodule/conformance/tsxReactEmit1.js.diff

Lines changed: 0 additions & 28 deletions
This file was deleted.

testdata/baselines/reference/submodule/conformance/tsxReactEmit5.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ const test_1 = require("./test");
2727
// Should emit test_1.React.createElement
2828
// and React.__spread
2929
var foo;
30-
var spread1 = test_1.React.createElement("div", Object.assign({ x: "" }, foo, { y: "" }));
30+
var spread1 = test_1.React.createElement("div", Object.assign({ x: '' }, foo, { y: '' }));

testdata/baselines/reference/submodule/conformance/tsxReactEmit5.js.diff

Lines changed: 0 additions & 8 deletions
This file was deleted.

testdata/baselines/reference/submodule/conformance/tsxReactEmit6.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ var M;
3434
// Should emit M.React.createElement
3535
// and M.React.__spread
3636
var foo;
37-
var spread1 = React.createElement("div", Object.assign({ x: "" }, foo, { y: "" }));
37+
var spread1 = React.createElement("div", Object.assign({ x: '' }, foo, { y: '' }));
3838
// Quotes
3939
var x = React.createElement("div", null, "This \"quote\" thing");
4040
})(M || (M = {}));

testdata/baselines/reference/submodule/conformance/tsxReactEmit6.js.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// and M.React.__spread
66
var foo;
77
- var spread1 = M.React.createElement("div", Object.assign({ x: '' }, foo, { y: '' }));
8-
+ var spread1 = React.createElement("div", Object.assign({ x: "" }, foo, { y: "" }));
8+
+ var spread1 = React.createElement("div", Object.assign({ x: '' }, foo, { y: '' }));
99
// Quotes
1010
- var x = M.React.createElement("div", null, "This \"quote\" thing");
1111
+ var x = React.createElement("div", null, "This \"quote\" thing");

testdata/baselines/reference/submodule/conformance/tsxReactEmitEntities.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ React.createElement("div", { attr: "{\u2026}\\" });
3535
// Does not happen for a string literal that happens to be inside an attribute (and escapes then work)
3636
React.createElement("div", { attr: "&#0123;&hellip;&#x7D;\"" });
3737
// Preserves single quotes
38-
React.createElement("div", { attr: "\"" });
38+
React.createElement("div", { attr: '"' });
3939
// https://github.com/microsoft/TypeScript/issues/35732
4040
React.createElement("div", null, "\uD83D\uDC08\uD83D\uDC15\uD83D\uDC07\uD83D\uDC11");

0 commit comments

Comments
 (0)