Skip to content

Commit 7c6271b

Browse files
committed
fix(jsx): correct source location when react-jsx and whitespace before jsx
fixes #61533 the code seemed to be using `node.pos` (`node.getFullStart()`) instead of `node.getStart()`, which caused the source location to be off. now baselines match babel's output (which seems correct). not sure about using `getTokenPosOfNode()` (used by `getStart()`), but didn't find any better way to do things internally.
1 parent c1592ad commit 7c6271b

19 files changed

Lines changed: 46 additions & 44 deletions

src/compiler/transformers/jsx.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
createExpressionForJsxFragment,
88
createExpressionFromEntityName,
99
createJsxFactoryExpression,
10+
createRange,
1011
Debug,
1112
emptyArray,
1213
Expression,
@@ -20,6 +21,7 @@ import {
2021
getLineAndCharacterOfPosition,
2122
getOriginalNode,
2223
getSemanticJsxChildren,
24+
getTokenPosOfNode,
2325
Identifier,
2426
idText,
2527
ImportSpecifier,
@@ -283,12 +285,12 @@ export function transformJsx(context: TransformationContext): (x: SourceFile | B
283285

284286
function visitJsxElement(node: JsxElement, isChild: boolean) {
285287
const tagTransform = shouldUseCreateElement(node.openingElement) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX;
286-
return tagTransform(node.openingElement, node.children, isChild, /*location*/ node);
288+
return tagTransform(node.openingElement, node.children, isChild, /*location*/ createRange(getTokenPosOfNode(node, currentSourceFile), node.end));
287289
}
288290

289291
function visitJsxSelfClosingElement(node: JsxSelfClosingElement, isChild: boolean) {
290292
const tagTransform = shouldUseCreateElement(node) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX;
291-
return tagTransform(node, /*children*/ undefined, isChild, /*location*/ node);
293+
return tagTransform(node, /*children*/ undefined, isChild, /*location*/ createRange(getTokenPosOfNode(node, currentSourceFile), node.end));
292294
}
293295

294296
function visitJsxFragment(node: JsxFragment, isChild: boolean) {

tests/baselines/reference/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=commonjs,moduledetection=auto).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var Component = /** @class */ (function () {
3131
function Component() {
3232
}
3333
Component.prototype.render = function () {
34-
return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
34+
return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
3535
};
3636
return Component;
3737
}());

tests/baselines/reference/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=commonjs,moduledetection=force).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var Component = /** @class */ (function () {
3131
function Component() {
3232
}
3333
Component.prototype.render = function () {
34-
return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
34+
return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
3535
};
3636
return Component;
3737
}());

tests/baselines/reference/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=commonjs,moduledetection=legacy).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ var Component = /** @class */ (function () {
2828
function Component() {
2929
}
3030
Component.prototype.render = function () {
31-
return (0, _a.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
31+
return (0, _a.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
3232
};
3333
return Component;
3434
}());

tests/baselines/reference/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=system,moduledetection=auto).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ System.register(["react/jsx-dev-runtime"], function (exports_1, context_1) {
3939
function Component() {
4040
}
4141
Component.prototype.render = function () {
42-
return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
42+
return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
4343
};
4444
return Component;
4545
}());

tests/baselines/reference/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=system,moduledetection=force).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ System.register(["react/jsx-dev-runtime"], function (exports_1, context_1) {
3939
function Component() {
4040
}
4141
Component.prototype.render = function () {
42-
return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
42+
return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
4343
};
4444
return Component;
4545
}());

tests/baselines/reference/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=system,moduledetection=legacy).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ var Component = /** @class */ (function () {
2828
function Component() {
2929
}
3030
Component.prototype.render = function () {
31-
return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
31+
return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
3232
};
3333
return Component;
3434
}());

tests/baselines/reference/jsxEmptyExpressionNotCountedAsChild(jsx=react-jsxdev).js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
2525
var jsx_dev_runtime_1 = require("react/jsx-dev-runtime");
2626
var _jsxFileName = "jsxEmptyExpressionNotCountedAsChild.tsx";
2727
function Wrapper(props) {
28-
return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 11 }, this);
28+
return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 12 }, this);
2929
}
30-
var element = ((0, jsx_dev_runtime_1.jsxDEV)(Wrapper, { children: (0, jsx_dev_runtime_1.jsxDEV)("div", { children: "Hello" }, void 0, false, { fileName: _jsxFileName, lineNumber: 15, columnNumber: 6 }, this) }, void 0, false, { fileName: _jsxFileName, lineNumber: 12, columnNumber: 18 }, this));
30+
var element = ((0, jsx_dev_runtime_1.jsxDEV)(Wrapper, { children: (0, jsx_dev_runtime_1.jsxDEV)("div", { children: "Hello" }, void 0, false, { fileName: _jsxFileName, lineNumber: 15, columnNumber: 6 }, this) }, void 0, false, { fileName: _jsxFileName, lineNumber: 13, columnNumber: 5 }, this));
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
//// [tests/cases/conformance/jsx/jsxs/jsxJsxsCjsTransformChildren.tsx] ////
22

33
//// [jsxJsxsCjsTransformChildren.tsx]
4-
/// <reference path="/.lib/react16.d.ts" />
5-
const a = <div>text</div>;
6-
7-
export {};
4+
/// <reference path="/.lib/react16.d.ts" />
5+
const a = <div>text</div>;
6+
7+
export {};
88

99

1010
//// [jsxJsxsCjsTransformChildren.js]
@@ -13,4 +13,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
1313
var jsx_dev_runtime_1 = require("react/jsx-dev-runtime");
1414
var _jsxFileName = "jsxJsxsCjsTransformChildren.tsx";
1515
/// <reference path="/.lib/react16.d.ts" />
16-
var a = (0, jsx_dev_runtime_1.jsxDEV)("div", { children: "text" }, void 0, false, { fileName: _jsxFileName, lineNumber: 2, columnNumber: 10 }, this);
16+
var a = (0, jsx_dev_runtime_1.jsxDEV)("div", { children: "text" }, void 0, false, { fileName: _jsxFileName, lineNumber: 2, columnNumber: 11 }, this);

tests/baselines/reference/jsxJsxsCjsTransformKeyProp(jsx=react-jsxdev).js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ var jsx_dev_runtime_1 = require("react/jsx-dev-runtime");
2828
var _jsxFileName = "jsxJsxsCjsTransformKeyProp.tsx";
2929
/// <reference path="/.lib/react16.d.ts" />
3030
var props = { answer: 42 };
31-
var a = (0, jsx_dev_runtime_1.jsxDEV)("div", __assign({}, props, { children: "text" }), "foo", false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 10 }, this);
31+
var a = (0, jsx_dev_runtime_1.jsxDEV)("div", __assign({}, props, { children: "text" }), "foo", false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 11 }, this);
3232
var b = (0, react_1.createElement)("div", __assign({}, props, { key: "bar" }), "text");

0 commit comments

Comments
 (0)