Skip to content

Commit d0c8841

Browse files
Copilotjakebailey
andauthored
Port TS#61534: correct source location when react-jsx and whitespace before jsx (#2807)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com>
1 parent 473b341 commit d0c8841

File tree

33 files changed

+66
-63
lines changed

33 files changed

+66
-63
lines changed

internal/transformers/jsxtransforms/jsx.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,23 +294,26 @@ func (tx *JSXTransformer) visitJsxElement(element *ast.JsxElement) *ast.Node {
294294
if tx.shouldUseCreateElement(element.AsNode()) {
295295
tagTransform = (*JSXTransformer).visitJsxOpeningLikeElementCreateElement
296296
}
297-
return tagTransform(tx, element.OpeningElement, element.Children, element.AsNode())
297+
location := core.NewTextRange(scanner.SkipTrivia(tx.currentSourceFile.Text(), element.Pos()), element.End())
298+
return tagTransform(tx, element.OpeningElement, element.Children, location)
298299
}
299300

300301
func (tx *JSXTransformer) visitJsxSelfClosingElement(element *ast.JsxSelfClosingElement) *ast.Node {
301302
tagTransform := (*JSXTransformer).visitJsxOpeningLikeElementJSX
302303
if tx.shouldUseCreateElement(element.AsNode()) {
303304
tagTransform = (*JSXTransformer).visitJsxOpeningLikeElementCreateElement
304305
}
305-
return tagTransform(tx, element.AsNode(), nil, element.AsNode())
306+
location := core.NewTextRange(scanner.SkipTrivia(tx.currentSourceFile.Text(), element.Pos()), element.End())
307+
return tagTransform(tx, element.AsNode(), nil, location)
306308
}
307309

308310
func (tx *JSXTransformer) visitJsxFragment(fragment *ast.JsxFragment) *ast.Node {
309311
tagTransform := (*JSXTransformer).visitJsxOpeningFragmentJSX
310312
if len(tx.importSpecifier) == 0 {
311313
tagTransform = (*JSXTransformer).visitJsxOpeningFragmentCreateElement
312314
}
313-
return tagTransform(tx, fragment.OpeningFragment.AsJsxOpeningFragment(), fragment.Children, fragment.AsNode())
315+
location := core.NewTextRange(scanner.SkipTrivia(tx.currentSourceFile.Text(), fragment.Pos()), fragment.End())
316+
return tagTransform(tx, fragment.OpeningFragment.AsJsxOpeningFragment(), fragment.Children, location)
314317
}
315318

316319
func (tx *JSXTransformer) convertJsxChildrenToChildrenPropObject(children []*ast.JsxChild) *ast.Node {
@@ -370,7 +373,7 @@ func (tx *JSXTransformer) getTagName(node *ast.Node) *ast.Node {
370373
}
371374
}
372375

373-
func (tx *JSXTransformer) visitJsxOpeningLikeElementJSX(element *ast.Node, children *ast.NodeList, location *ast.Node) *ast.Node {
376+
func (tx *JSXTransformer) visitJsxOpeningLikeElementJSX(element *ast.Node, children *ast.NodeList, location core.TextRange) *ast.Node {
374377
tagName := tx.getTagName(element)
375378
var childrenProp *ast.Node
376379
if children != nil && len(children.Nodes) > 0 {
@@ -558,7 +561,7 @@ func (tx *JSXTransformer) visitJsxOpeningLikeElementOrFragmentJSX(
558561
object *ast.Expression,
559562
keyAttr *ast.Node,
560563
children *ast.NodeList,
561-
location *ast.Node,
564+
location core.TextRange,
562565
) *ast.Node {
563566
var nonWhitespaceChildren []*ast.Node
564567
if children != nil {
@@ -599,7 +602,7 @@ func (tx *JSXTransformer) visitJsxOpeningLikeElementOrFragmentJSX(
599602
}
600603

601604
element := tx.Factory().NewCallExpression(tx.getJsxFactoryCallee(isStaticChildren), nil, nil, tx.Factory().NewNodeList(args), ast.NodeFlagsNone)
602-
element.Loc = location.Loc
605+
element.Loc = location
603606

604607
if tx.inJsxChild {
605608
tx.EmitContext().AddEmitFlags(element, printer.EFStartOnNewLine)
@@ -608,7 +611,7 @@ func (tx *JSXTransformer) visitJsxOpeningLikeElementOrFragmentJSX(
608611
return element
609612
}
610613

611-
func (tx *JSXTransformer) visitJsxOpeningFragmentJSX(fragment *ast.JsxOpeningFragment, children *ast.NodeList, location *ast.Node) *ast.Node {
614+
func (tx *JSXTransformer) visitJsxOpeningFragmentJSX(fragment *ast.JsxOpeningFragment, children *ast.NodeList, location core.TextRange) *ast.Node {
612615
var childrenProps *ast.Expression
613616
if children != nil && len(children.Nodes) > 0 {
614617
result := tx.convertJsxChildrenToChildrenPropObject(children.Nodes)
@@ -676,7 +679,7 @@ func (tx *JSXTransformer) createJsxFragmentFactoryExpression(parent *ast.Node) *
676679
return tx.createJsxPsuedoFactoryExpression(parent, e, "Fragment")
677680
}
678681

679-
func (tx *JSXTransformer) visitJsxOpeningLikeElementCreateElement(element *ast.Node, children *ast.NodeList, location *ast.Node) *ast.Node {
682+
func (tx *JSXTransformer) visitJsxOpeningLikeElementCreateElement(element *ast.Node, children *ast.NodeList, location core.TextRange) *ast.Node {
680683
tagName := tx.getTagName(element)
681684
attrs := element.Attributes().Properties()
682685
var objectProperties *ast.Expression
@@ -722,15 +725,15 @@ func (tx *JSXTransformer) visitJsxOpeningLikeElementCreateElement(element *ast.N
722725
tx.Factory().NewNodeList(args),
723726
ast.NodeFlagsNone,
724727
)
725-
result.Loc = location.Loc
728+
result.Loc = location
726729

727730
if tx.inJsxChild {
728731
tx.EmitContext().AddEmitFlags(result, printer.EFStartOnNewLine)
729732
}
730733
return result
731734
}
732735

733-
func (tx *JSXTransformer) visitJsxOpeningFragmentCreateElement(fragment *ast.JsxOpeningFragment, children *ast.NodeList, location *ast.Node) *ast.Node {
736+
func (tx *JSXTransformer) visitJsxOpeningFragmentCreateElement(fragment *ast.JsxOpeningFragment, children *ast.NodeList, location core.TextRange) *ast.Node {
734737
tagName := tx.createJsxFragmentFactoryExpression(fragment.AsNode())
735738
callee := tx.createJsxFactoryExpression(fragment.AsNode())
736739

@@ -763,7 +766,7 @@ func (tx *JSXTransformer) visitJsxOpeningFragmentCreateElement(fragment *ast.Jsx
763766
tx.Factory().NewNodeList(args),
764767
ast.NodeFlagsNone,
765768
)
766-
result.Loc = location.Loc
769+
result.Loc = location
767770

768771
if tx.inJsxChild {
769772
tx.EmitContext().AddEmitFlags(result, printer.EFStartOnNewLine)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ const jsx_dev_runtime_1 = require("react/jsx-dev-runtime");
2929
const _jsxFileName = "/.src/commentsOnJSXExpressionsArePreserved.tsx";
3030
class Component {
3131
render() {
32-
return jsx_dev_runtime_1.jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
32+
return jsx_dev_runtime_1.jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
3333
}
3434
}

testdata/baselines/reference/submodule/compiler/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=commonjs,moduledetection=auto).js.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
class Component {
1010
render() {
1111
- return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
12-
+ return jsx_dev_runtime_1.jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
12+
+ return jsx_dev_runtime_1.jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
1313
}
1414
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ const jsx_dev_runtime_1 = require("react/jsx-dev-runtime");
2929
const _jsxFileName = "/.src/commentsOnJSXExpressionsArePreserved.tsx";
3030
class Component {
3131
render() {
32-
return jsx_dev_runtime_1.jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
32+
return jsx_dev_runtime_1.jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
3333
}
3434
}

testdata/baselines/reference/submodule/compiler/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=commonjs,moduledetection=force).js.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
class Component {
1010
render() {
1111
- return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
12-
+ return jsx_dev_runtime_1.jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
12+
+ return jsx_dev_runtime_1.jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
1313
}
1414
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ class Component {
2727
const _jsxFileName = "/.src/commentsOnJSXExpressionsArePreserved.tsx";
2828
class Component {
2929
render() {
30-
return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
30+
return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
3131
}
3232
}

testdata/baselines/reference/submodule/compiler/commentsOnJSXExpressionsArePreserved(jsx=react-jsxdev,module=commonjs,moduledetection=legacy).js.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
class Component {
1010
render() {
1111
- return (0, _a.jsxDEV)("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
12-
+ return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 15 }, this);
12+
+ return _jsxDEV("div", { children: null /* preserved */ }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 16 }, this);
1313
}
1414
}

testdata/baselines/reference/submodule/compiler/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
const jsx_dev_runtime_1 = require("react/jsx-dev-runtime");
2626
const _jsxFileName = "/.src/jsxEmptyExpressionNotCountedAsChild.tsx";
2727
function Wrapper(props) {
28-
return jsx_dev_runtime_1.jsxDEV("div", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 11 }, this);
28+
return jsx_dev_runtime_1.jsxDEV("div", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 12 }, this);
2929
}
30-
const element = (jsx_dev_runtime_1.jsxDEV(Wrapper, { children: 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+
const element = (jsx_dev_runtime_1.jsxDEV(Wrapper, { children: 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));

testdata/baselines/reference/submodule/compiler/jsxEmptyExpressionNotCountedAsChild(jsx=react-jsxdev).js.diff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
+const _jsxFileName = "/.src/jsxEmptyExpressionNotCountedAsChild.tsx";
99
function Wrapper(props) {
1010
- return (0, jsx_dev_runtime_1.jsxDEV)("div", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 12 }, this);
11-
+ return jsx_dev_runtime_1.jsxDEV("div", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 11 }, this);
11+
+ return jsx_dev_runtime_1.jsxDEV("div", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 12 }, this);
1212
}
1313
-const 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));
14-
+const element = (jsx_dev_runtime_1.jsxDEV(Wrapper, { children: 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));
14+
+const element = (jsx_dev_runtime_1.jsxDEV(Wrapper, { children: 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));

testdata/baselines/reference/submodule/compiler/jsxNamespaceElementChildrenAttributeIgnoredWhenReactJsx(jsx=react-jsxdev).js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3636
Object.defineProperty(exports, "__esModule", { value: true });
3737
const jsx_dev_runtime_1 = require("/jsx/jsx-dev-runtime");
3838
const _jsxFileName = "/test.tsx";
39-
const Title = (props) => jsx_dev_runtime_1.jsxDEV("h1", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 1, columnNumber: 47 }, this);
40-
jsx_dev_runtime_1.jsxDEV(Title, { children: "Hello, world!" }, void 0, false, { fileName: _jsxFileName, lineNumber: 1, columnNumber: 74 }, this);
41-
const Wrong = (props) => jsx_dev_runtime_1.jsxDEV("h1", { children: props.offspring }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 48 }, this);
42-
jsx_dev_runtime_1.jsxDEV(Wrong, { children: "Byebye, world!" }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 76 }, this);
39+
const Title = (props) => jsx_dev_runtime_1.jsxDEV("h1", { children: props.children }, void 0, false, { fileName: _jsxFileName, lineNumber: 1, columnNumber: 48 }, this);
40+
jsx_dev_runtime_1.jsxDEV(Title, { children: "Hello, world!" }, void 0, false, { fileName: _jsxFileName, lineNumber: 3, columnNumber: 1 }, this);
41+
const Wrong = (props) => jsx_dev_runtime_1.jsxDEV("h1", { children: props.offspring }, void 0, false, { fileName: _jsxFileName, lineNumber: 5, columnNumber: 49 }, this);
42+
jsx_dev_runtime_1.jsxDEV(Wrong, { children: "Byebye, world!" }, void 0, false, { fileName: _jsxFileName, lineNumber: 7, columnNumber: 1 }, this);
4343
//// [jsx-runtime.js]
4444
"use strict";
4545
Object.defineProperty(exports, "__esModule", { value: true });

0 commit comments

Comments
 (0)