Skip to content

Commit 6c49566

Browse files
Fix last character of JSX text nodes being cut off (#1694)
1 parent c0aa663 commit 6c49566

21 files changed

+39
-80
lines changed

internal/transformers/jsxtransforms/jsx.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -794,15 +794,15 @@ func fixupWhitespaceAndDecodeEntities(text string) string {
794794
// Last non-whitespace character on this line.
795795
lastNonWhitespace := -1
796796
// These initial values are special because the first line is:
797-
// firstNonWhitespace = 0 to indicate that we want leading whitsepace,
797+
// firstNonWhitespace = 0 to indicate that we want leading whitespace,
798798
// but lastNonWhitespace = -1 as a special flag to indicate that we *don't* include the line if it's all whitespace.
799799
for i := 0; i < len(text); i++ {
800800
c, size := utf8.DecodeRuneInString(text[i:])
801801
if stringutil.IsLineBreak(c) {
802802
// If we've seen any non-whitespace characters on this line, add the 'trim' of the line.
803803
// (lastNonWhitespace === -1 is a special flag to detect whether the first line is all whitespace.)
804804
if firstNonWhitespace != -1 && lastNonWhitespace != -1 {
805-
addLineOfJsxText(acc, text[firstNonWhitespace:lastNonWhitespace], initial)
805+
addLineOfJsxText(acc, text[firstNonWhitespace:lastNonWhitespace+1], initial)
806806
initial = false
807807
}
808808

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ let Foo = {
1818
Bar() { }
1919
};
2020
let Baz = () => { };
21-
let x = React.createElement(Foo.Bar, null, "Hell let y = ", React.createElement(Baz, null, "Hello"));
21+
let x = React.createElement(Foo.Bar, null, "Hello let y = ", React.createElement(Baz, null, "Hello"));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
-let x = React.createElement(Foo.Bar, null,
88
- "Hello let y = ",
99
- React.createElement(Baz, null, "Hello"));
10-
+let x = React.createElement(Foo.Bar, null, "Hell let y = ", React.createElement(Baz, null, "Hello"));
10+
+let x = React.createElement(Foo.Bar, null, "Hello let y = ", React.createElement(Baz, null, "Hello"));

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ function Blah(props) {
9292
// Incompatible child.
9393
var a = React.createElement(Blah, null, x => x);
9494
// Blah components don't accept text as child elements
95-
var a = React.createElement(Blah, null, "Hello unexpected text");
95+
var a = React.createElement(Blah, null, "Hello unexpected text!");
9696
// Blah components don't accept multiple children.
9797
var a = React.createElement(Blah, null, x => "" + x, x => "" + x);
9898
function Blah2(props) {
@@ -101,7 +101,7 @@ function Blah2(props) {
101101
// Incompatible child.
102102
var a = React.createElement(Blah2, null, x => x);
103103
// Blah2 components don't accept text as child elements
104-
var a = React.createElement(Blah2, null, "Hello unexpected text");
104+
var a = React.createElement(Blah2, null, "Hello unexpected text!");
105105
// Blah2 components don't accept multiple children of the wrong type.
106106
var a = React.createElement(Blah2, null, x => x, x => x);
107107
function Blah3(props) {
@@ -110,6 +110,6 @@ function Blah3(props) {
110110
// Incompatible child.
111111
var a = React.createElement(Blah3, null, x => x);
112112
// Blah3 components don't accept text as child elements
113-
var a = React.createElement(Blah3, null, "Hello unexpected text");
113+
var a = React.createElement(Blah3, null, "Hello unexpected text!");
114114
// Blah3 components don't accept multiple children of the wrong type.
115115
var a = React.createElement(Blah3, null, x => x, x => x);

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@
99
function Blah(props) {
1010
return React.createElement(React.Fragment, null);
1111
}
12-
// Incompatible child.
13-
var a = React.createElement(Blah, null, x => x);
12+
@@= skipped -9, +9 lines =@@
1413
// Blah components don't accept text as child elements
15-
-var a = React.createElement(Blah, null, "Hello unexpected text!");
16-
+var a = React.createElement(Blah, null, "Hello unexpected text");
14+
var a = React.createElement(Blah, null, "Hello unexpected text!");
1715
// Blah components don't accept multiple children.
1816
-var a = React.createElement(Blah, null,
1917
- x => "" + x,
@@ -22,11 +20,9 @@
2220
function Blah2(props) {
2321
return React.createElement(React.Fragment, null);
2422
}
25-
// Incompatible child.
26-
var a = React.createElement(Blah2, null, x => x);
23+
@@= skipped -11, +9 lines =@@
2724
// Blah2 components don't accept text as child elements
28-
-var a = React.createElement(Blah2, null, "Hello unexpected text!");
29-
+var a = React.createElement(Blah2, null, "Hello unexpected text");
25+
var a = React.createElement(Blah2, null, "Hello unexpected text!");
3026
// Blah2 components don't accept multiple children of the wrong type.
3127
-var a = React.createElement(Blah2, null,
3228
- x => x,
@@ -35,11 +31,9 @@
3531
function Blah3(props) {
3632
return React.createElement(React.Fragment, null);
3733
}
38-
// Incompatible child.
39-
var a = React.createElement(Blah3, null, x => x);
34+
@@= skipped -11, +9 lines =@@
4035
// Blah3 components don't accept text as child elements
41-
-var a = React.createElement(Blah3, null, "Hello unexpected text!");
42-
+var a = React.createElement(Blah3, null, "Hello unexpected text");
36+
var a = React.createElement(Blah3, null, "Hello unexpected text!");
4337
// Blah3 components don't accept multiple children of the wrong type.
4438
-var a = React.createElement(Blah3, null,
4539
- x => x,

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ const react_1 = __importDefault(require("react"));
125125
* @type {React.SFC}
126126
*/
127127
const TabbedShowLayout = () => {
128-
return (react_1.default.createElement("div", { className: "", key: "" }, "o"));
128+
return (react_1.default.createElement("div", { className: "", key: "" }, "ok"));
129129
};
130130
TabbedShowLayout.defaultProps = {
131131
tabs: "default value"
@@ -142,7 +142,7 @@ const react_1 = __importDefault(require("react"));
142142
* @type {{defaultProps: {tabs: string}} & ((props?: {elem: string}) => JSX.Element)}
143143
*/
144144
const TabbedShowLayout = () => {
145-
return (react_1.default.createElement("div", { className: "", key: "" }, "o"));
145+
return (react_1.default.createElement("div", { className: "", key: "" }, "ok"));
146146
};
147147
TabbedShowLayout.defaultProps = {
148148
tabs: "default value"
@@ -156,7 +156,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
156156
Object.defineProperty(exports, "__esModule", { value: true });
157157
const react_1 = __importDefault(require("react"));
158158
const TabbedShowLayout = (/** @type {{className: string}}*/ prop) => {
159-
return (react_1.default.createElement("div", { className: prop.className, key: "" }, "o"));
159+
return (react_1.default.createElement("div", { className: prop.className, key: "" }, "ok"));
160160
};
161161
TabbedShowLayout.defaultProps = {
162162
tabs: "default value"

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

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@
2020
/**
2121
* @type {React.SFC}
2222
*/
23-
const TabbedShowLayout = () => {
24-
- return (react_1.default.createElement("div", { className: "", key: "" }, "ok"));
25-
+ return (react_1.default.createElement("div", { className: "", key: "" }, "o"));
26-
};
27-
TabbedShowLayout.defaultProps = {
28-
tabs: "default value"
2923
@@= skipped -17, +17 lines =@@
3024
return (mod && mod.__esModule) ? mod : { "default": mod };
3125
};
@@ -35,24 +29,15 @@
3529
/**
3630
* @type {{defaultProps: {tabs: string}} & ((props?: {elem: string}) => JSX.Element)}
3731
*/
38-
const TabbedShowLayout = () => {
39-
- return (react_1.default.createElement("div", { className: "", key: "" }, "ok"));
40-
+ return (react_1.default.createElement("div", { className: "", key: "" }, "o"));
41-
};
42-
TabbedShowLayout.defaultProps = {
43-
tabs: "default value"
4432
@@= skipped -17, +17 lines =@@
4533
return (mod && mod.__esModule) ? mod : { "default": mod };
4634
};
4735
Object.defineProperty(exports, "__esModule", { value: true });
4836
-var react_1 = __importDefault(require("react"));
4937
+const react_1 = __importDefault(require("react"));
5038
const TabbedShowLayout = (/** @type {{className: string}}*/ prop) => {
51-
- return (react_1.default.createElement("div", { className: prop.className, key: "" }, "ok"));
52-
+ return (react_1.default.createElement("div", { className: prop.className, key: "" }, "o"));
39+
return (react_1.default.createElement("div", { className: prop.className, key: "" }, "ok"));
5340
};
54-
TabbedShowLayout.defaultProps = {
55-
tabs: "default value"
5641
@@= skipped -14, +14 lines =@@
5742
return (mod && mod.__esModule) ? mod : { "default": mod };
5843
};

testdata/baselines/reference/submodule/conformance/jsxJsxsCjsTransformCustomImport(jsx=react-jsx).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ export {};
1515
Object.defineProperty(exports, "__esModule", { value: true });
1616
const jsx_runtime_1 = require("preact/jsx-runtime");
1717
/// <reference path="react16.d.ts" />
18-
const a = jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [jsx_runtime_1.jsx("p", {}), "tex", jsx_runtime_1.jsx("div", { className: "foo" })] });
18+
const a = jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [jsx_runtime_1.jsx("p", {}), "text", jsx_runtime_1.jsx("div", { className: "foo" })] });

testdata/baselines/reference/submodule/conformance/jsxJsxsCjsTransformCustomImport(jsx=react-jsx).js.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
+const jsx_runtime_1 = require("preact/jsx-runtime");
99
/// <reference path="react16.d.ts" />
1010
-const a = (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("p", {}), "text", (0, jsx_runtime_1.jsx)("div", { className: "foo" })] });
11-
+const a = jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [jsx_runtime_1.jsx("p", {}), "tex", jsx_runtime_1.jsx("div", { className: "foo" })] });
11+
+const a = jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [jsx_runtime_1.jsx("p", {}), "text", jsx_runtime_1.jsx("div", { className: "foo" })] });

testdata/baselines/reference/submodule/conformance/jsxJsxsCjsTransformCustomImport(jsx=react-jsxdev).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
1616
const jsx_dev_runtime_1 = require("preact/jsx-dev-runtime");
1717
const _jsxFileName = "jsxJsxsCjsTransformCustomImport.tsx";
1818
/// <reference path="react16.d.ts" />
19-
const a = jsx_dev_runtime_1.jsxDEV(jsx_dev_runtime_1.Fragment, { children: [jsx_dev_runtime_1.jsxDEV("p", {}, void 0, false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 3 }, this), "tex", jsx_dev_runtime_1.jsxDEV("div", { className: "foo" }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 3 }, this)] }, void 0, true, { fileName: _jsxFileName, lineNumber: 2, columnNumber: 10 }, this);
19+
const a = jsx_dev_runtime_1.jsxDEV(jsx_dev_runtime_1.Fragment, { children: [jsx_dev_runtime_1.jsxDEV("p", {}, void 0, false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 3 }, this), "text", jsx_dev_runtime_1.jsxDEV("div", { className: "foo" }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 3 }, this)] }, void 0, true, { fileName: _jsxFileName, lineNumber: 2, columnNumber: 10 }, this);

0 commit comments

Comments
 (0)