Fix React whitespace emit #4376

This commit is contained in:
Ryan Cavanaugh
2015-08-20 11:38:03 -07:00
parent 5035559c59
commit f659c9098c
8 changed files with 133 additions and 9 deletions

View File

@@ -6463,7 +6463,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
function trimReactWhitespace(node: JsxText): string {
let result: string = undefined;
let text = getTextOfNode(node);
let text = getTextOfNode(node, true);
let firstNonWhitespace = 0;
let lastNonWhitespace = -1;
@@ -6498,7 +6498,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
switch (compilerOptions.jsx) {
case JsxEmit.React:
let text = trimReactWhitespace(node);
if (text.length === 0) {
if (text === undefined || text.length === 0) {
return undefined;
}
else {

View File

@@ -69,6 +69,6 @@ var SomeClass = (function () {
};
return SomeClass;
})();
var whitespace1 = React.createElement("div", null);
var whitespace2 = React.createElement("div", null, p);
var whitespace1 = React.createElement("div", null, " ");
var whitespace2 = React.createElement("div", null, " ", p, " ");
var whitespace3 = React.createElement("div", null, p);

View File

@@ -8,4 +8,4 @@ declare var Foo, Bar, baz;
<Foo> <Bar> q </Bar> <Bar/> s <Bar/><Bar/></Foo>;
//// [tsxReactEmit3.js]
React.createElement(Foo, null, React.createElement(Bar, null, "q "), React.createElement(Bar, null), "s ", React.createElement(Bar, null), React.createElement(Bar, null));
React.createElement(Foo, null, " ", React.createElement(Bar, null, " q "), " ", React.createElement(Bar, null), " s ", React.createElement(Bar, null), React.createElement(Bar, null));

View File

@@ -57,17 +57,17 @@ var p = 0;
// WHITESPACE, DO NOT RUN 'FORMAT DOCUMENT' ON IT
var p = 0;
// Emit " "
React.createElement("div", null);
React.createElement("div", null, " ");
// Emit " ", p, " "
React.createElement("div", null, p);
React.createElement("div", null, " ", p, " ");
// Emit only p
React.createElement("div", null, p);
// Emit only p
React.createElement("div", null, p);
// Emit " 3"
React.createElement("div", null, "3");
React.createElement("div", null, " 3");
// Emit " 3 "
React.createElement("div", null, "3 ");
React.createElement("div", null, " 3 ");
// Emit "3"
React.createElement("div", null, "3");
// Emit no args

View File

@@ -0,0 +1,25 @@
//// [tsxReactEmitWhitespace2.tsx]
declare module JSX {
interface Element { }
interface IntrinsicElements {
[s: string]: any;
}
}
declare var React: any;
// Emit ' word' in the last string
<div>word <code>code</code> word</div>;
// Same here
<div><code>code</code> word</div>;
// And here
<div><code /> word</div>;
//// [tsxReactEmitWhitespace2.js]
// Emit ' word' in the last string
React.createElement("div", null, "word ", React.createElement("code", null, "code"), " word");
// Same here
React.createElement("div", null, React.createElement("code", null, "code"), " word");
// And here
React.createElement("div", null, React.createElement("code", null), " word");

View File

@@ -0,0 +1,38 @@
=== tests/cases/conformance/jsx/tsxReactEmitWhitespace2.tsx ===
declare module JSX {
>JSX : Symbol(JSX, Decl(tsxReactEmitWhitespace2.tsx, 0, 0))
interface Element { }
>Element : Symbol(Element, Decl(tsxReactEmitWhitespace2.tsx, 0, 20))
interface IntrinsicElements {
>IntrinsicElements : Symbol(IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
[s: string]: any;
>s : Symbol(s, Decl(tsxReactEmitWhitespace2.tsx, 3, 3))
}
}
declare var React: any;
>React : Symbol(React, Decl(tsxReactEmitWhitespace2.tsx, 6, 11))
// Emit ' word' in the last string
<div>word <code>code</code> word</div>;
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
// Same here
<div><code>code</code> word</div>;
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
// And here
<div><code /> word</div>;
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
>code : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace2.tsx, 1, 22))

View File

@@ -0,0 +1,44 @@
=== tests/cases/conformance/jsx/tsxReactEmitWhitespace2.tsx ===
declare module JSX {
>JSX : any
interface Element { }
>Element : Element
interface IntrinsicElements {
>IntrinsicElements : IntrinsicElements
[s: string]: any;
>s : string
}
}
declare var React: any;
>React : any
// Emit ' word' in the last string
<div>word <code>code</code> word</div>;
><div>word <code>code</code> word</div> : JSX.Element
>div : any
><code>code</code> : JSX.Element
>code : any
>code : any
>div : any
// Same here
<div><code>code</code> word</div>;
><div><code>code</code> word</div> : JSX.Element
>div : any
><code>code</code> : JSX.Element
>code : any
>code : any
>div : any
// And here
<div><code /> word</div>;
><div><code /> word</div> : JSX.Element
>div : any
><code /> : JSX.Element
>code : any
>div : any

View File

@@ -0,0 +1,17 @@
//@filename: file.tsx
//@jsx: react
declare module JSX {
interface Element { }
interface IntrinsicElements {
[s: string]: any;
}
}
declare var React: any;
// Emit ' word' in the last string
<div>word <code>code</code> word</div>;
// Same here
<div><code>code</code> word</div>;
// And here
<div><code /> word</div>;