Skip to content

Commit dec947a

Browse files
committed
Merge pull request #4380 from RyanCavanaugh/fix4376_2
Fix React whitespace emit
2 parents f9c3ade + 27dabe4 commit dec947a

8 files changed

+134
-10
lines changed

src/compiler/emitter.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -6514,7 +6514,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
65146514

65156515
function trimReactWhitespaceAndApplyEntities(node: JsxText): string {
65166516
let result: string = undefined;
6517-
let text = getTextOfNode(node);
6517+
let text = getTextOfNode(node, /*includeTrivia*/ true);
65186518
let firstNonWhitespace = 0;
65196519
let lastNonWhitespace = -1;
65206520

@@ -6570,7 +6570,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
65706570
}
65716571
case JsxEmit.Preserve:
65726572
default:
6573-
return getTextOfNode(node, true);
6573+
return getTextOfNode(node, /*includeTrivia*/ true);
65746574
}
65756575
}
65766576

@@ -6584,7 +6584,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
65846584

65856585
case JsxEmit.Preserve:
65866586
default: // Emit JSX-preserve as default when no --jsx flag is specified
6587-
writer.writeLiteral(getTextOfNode(node, true));
6587+
writer.writeLiteral(getTextOfNode(node, /*includeTrivia*/ true));
65886588
break;
65896589
}
65906590
}

tests/baselines/reference/tsxReactEmit1.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,6 @@ var SomeClass = (function () {
6969
};
7070
return SomeClass;
7171
})();
72-
var whitespace1 = React.createElement("div", null);
73-
var whitespace2 = React.createElement("div", null, p);
72+
var whitespace1 = React.createElement("div", null, " ");
73+
var whitespace2 = React.createElement("div", null, " ", p, " ");
7474
var whitespace3 = React.createElement("div", null, p);

tests/baselines/reference/tsxReactEmit3.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ declare var Foo, Bar, baz;
88
<Foo> <Bar> q </Bar> <Bar/> s <Bar/><Bar/></Foo>;
99

1010
//// [tsxReactEmit3.js]
11-
React.createElement(Foo, null, React.createElement(Bar, null, "q "), React.createElement(Bar, null), "s ", React.createElement(Bar, null), React.createElement(Bar, null));
11+
React.createElement(Foo, null, " ", React.createElement(Bar, null, " q "), " ", React.createElement(Bar, null), " s ", React.createElement(Bar, null), React.createElement(Bar, null));

tests/baselines/reference/tsxReactEmitWhitespace.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,17 @@ var p = 0;
5757
// WHITESPACE, DO NOT RUN 'FORMAT DOCUMENT' ON IT
5858
var p = 0;
5959
// Emit " "
60-
React.createElement("div", null);
60+
React.createElement("div", null, " ");
6161
// Emit " ", p, " "
62-
React.createElement("div", null, p);
62+
React.createElement("div", null, " ", p, " ");
6363
// Emit only p
6464
React.createElement("div", null, p);
6565
// Emit only p
6666
React.createElement("div", null, p);
6767
// Emit " 3"
68-
React.createElement("div", null, "3");
68+
React.createElement("div", null, " 3");
6969
// Emit " 3 "
70-
React.createElement("div", null, "3 ");
70+
React.createElement("div", null, " 3 ");
7171
// Emit "3"
7272
React.createElement("div", null, "3");
7373
// Emit no args
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//// [tsxReactEmitWhitespace2.tsx]
2+
declare module JSX {
3+
interface Element { }
4+
interface IntrinsicElements {
5+
[s: string]: any;
6+
}
7+
}
8+
declare var React: any;
9+
10+
// Emit ' word' in the last string
11+
<div>word <code>code</code> word</div>;
12+
// Same here
13+
<div><code>code</code> word</div>;
14+
// And here
15+
<div><code /> word</div>;
16+
17+
18+
19+
//// [tsxReactEmitWhitespace2.js]
20+
// Emit ' word' in the last string
21+
React.createElement("div", null, "word ", React.createElement("code", null, "code"), " word");
22+
// Same here
23+
React.createElement("div", null, React.createElement("code", null, "code"), " word");
24+
// And here
25+
React.createElement("div", null, React.createElement("code", null), " word");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
=== tests/cases/conformance/jsx/tsxReactEmitWhitespace2.tsx ===
2+
declare module JSX {
3+
>JSX : Symbol(JSX, Decl(tsxReactEmitWhitespace2.tsx, 0, 0))
4+
5+
interface Element { }
6+
>Element : Symbol(Element, Decl(tsxReactEmitWhitespace2.tsx, 0, 20))
7+
8+
interface IntrinsicElements {
9+
>IntrinsicElements : Symbol(IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
10+
11+
[s: string]: any;
12+
>s : Symbol(s, Decl(tsxReactEmitWhitespace2.tsx, 3, 3))
13+
}
14+
}
15+
declare var React: any;
16+
>React : Symbol(React, Decl(tsxReactEmitWhitespace2.tsx, 6, 11))
17+
18+
// Emit ' word' in the last string
19+
<div>word <code>code</code> word</div>;
20+
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
21+
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
22+
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
23+
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
24+
25+
// Same here
26+
<div><code>code</code> word</div>;
27+
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
28+
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
29+
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
30+
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
31+
32+
// And here
33+
<div><code /> word</div>;
34+
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
35+
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
36+
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
37+
38+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
=== tests/cases/conformance/jsx/tsxReactEmitWhitespace2.tsx ===
2+
declare module JSX {
3+
>JSX : any
4+
5+
interface Element { }
6+
>Element : Element
7+
8+
interface IntrinsicElements {
9+
>IntrinsicElements : IntrinsicElements
10+
11+
[s: string]: any;
12+
>s : string
13+
}
14+
}
15+
declare var React: any;
16+
>React : any
17+
18+
// Emit ' word' in the last string
19+
<div>word <code>code</code> word</div>;
20+
><div>word <code>code</code> word</div> : JSX.Element
21+
>div : any
22+
><code>code</code> : JSX.Element
23+
>code : any
24+
>code : any
25+
>div : any
26+
27+
// Same here
28+
<div><code>code</code> word</div>;
29+
><div><code>code</code> word</div> : JSX.Element
30+
>div : any
31+
><code>code</code> : JSX.Element
32+
>code : any
33+
>code : any
34+
>div : any
35+
36+
// And here
37+
<div><code /> word</div>;
38+
><div><code /> word</div> : JSX.Element
39+
>div : any
40+
><code /> : JSX.Element
41+
>code : any
42+
>div : any
43+
44+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//@filename: file.tsx
2+
//@jsx: react
3+
declare module JSX {
4+
interface Element { }
5+
interface IntrinsicElements {
6+
[s: string]: any;
7+
}
8+
}
9+
declare var React: any;
10+
11+
// Emit ' word' in the last string
12+
<div>word <code>code</code> word</div>;
13+
// Same here
14+
<div><code>code</code> word</div>;
15+
// And here
16+
<div><code /> word</div>;
17+

0 commit comments

Comments
 (0)