Skip to content

Commit fe90a2f

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 fe90a2f

File tree

22 files changed

+42
-40
lines changed

22 files changed

+42
-40
lines changed

src/compiler/transformers/jsx.ts

Lines changed: 5 additions & 3 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,17 +285,17 @@ 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) {
295297
const tagTransform = currentFileState.importSpecifier === undefined ? visitJsxOpeningFragmentCreateElement : visitJsxOpeningFragmentJSX;
296-
return tagTransform(node.openingFragment, node.children, isChild, /*location*/ node);
298+
return tagTransform(node.openingFragment, node.children, isChild, /*location*/ createRange(getTokenPosOfNode(node, currentSourceFile), node.end));
297299
}
298300

299301
function convertJsxChildrenToChildrenPropObject(children: readonly JsxChild[]) {

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));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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/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
var jsx_dev_runtime_1 = require("preact/jsx-dev-runtime");
1717
var _jsxFileName = "jsxJsxsCjsTransformCustomImport.tsx";
1818
/// <reference path="/.lib/react16.d.ts" />
19-
var a = (0, jsx_dev_runtime_1.jsxDEV)(jsx_dev_runtime_1.Fragment, { children: [(0, jsx_dev_runtime_1.jsxDEV)("p", {}, void 0, false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 3 }, this), "text", (0, 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+
var a = (0, jsx_dev_runtime_1.jsxDEV)(jsx_dev_runtime_1.Fragment, { children: [(0, jsx_dev_runtime_1.jsxDEV)("p", {}, void 0, false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 3 }, this), "text", (0, 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: 11 }, this);

0 commit comments

Comments
 (0)