diff --git a/packages/babel-plugin-transform-react-jsx-source/src/index.js b/packages/babel-plugin-transform-react-jsx-source/src/index.js index 9c0f99ed41..6b25c93a8f 100644 --- a/packages/babel-plugin-transform-react-jsx-source/src/index.js +++ b/packages/babel-plugin-transform-react-jsx-source/src/index.js @@ -1,7 +1,7 @@ /** - * This adds {fileName, lineNumber} annotations to React component definitions - * and to jsx tag literals. + * This adds {fileName, lineNumber, columnNumber} annotations to JSX tags. * + * NOTE: lineNumber and columnNumber are both 1-based. * * == JSX Literals == * @@ -10,7 +10,7 @@ * becomes: * * var __jsxFileName = 'this/file.js'; - * + * */ import { declare } from "@babel/helper-plugin-utils"; import { types as t } from "@babel/core"; @@ -21,9 +21,13 @@ const FILE_NAME_VAR = "_jsxFileName"; export default declare(api => { api.assertVersion(7); - function makeTrace(fileNameIdentifier, lineNumber) { + function makeTrace(fileNameIdentifier, lineNumber, column0Based) { const fileLineLiteral = lineNumber != null ? t.numericLiteral(lineNumber) : t.nullLiteral(); + const fileColumnLiteral = + column0Based != null + ? t.numericLiteral(column0Based + 1) + : t.nullLiteral(); const fileNameProperty = t.objectProperty( t.identifier("fileName"), fileNameIdentifier, @@ -32,7 +36,15 @@ export default declare(api => { t.identifier("lineNumber"), fileLineLiteral, ); - return t.objectExpression([fileNameProperty, lineNumberProperty]); + const columnNumberProperty = t.objectProperty( + t.identifier("columnNumber"), + fileColumnLiteral, + ); + return t.objectExpression([ + fileNameProperty, + lineNumberProperty, + columnNumberProperty, + ]); } const visitor = { @@ -69,7 +81,11 @@ export default declare(api => { state.fileNameIdentifier = fileNameIdentifier; } - const trace = makeTrace(state.fileNameIdentifier, location.start.line); + const trace = makeTrace( + state.fileNameIdentifier, + location.start.line, + location.start.column, + ); attributes.push(t.jsxAttribute(id, t.jsxExpressionContainer(trace))); }, }; diff --git a/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/basic-sample/exec.js b/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/basic-sample/exec.js index e44c3e5e7e..c3bb778238 100644 --- a/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/basic-sample/exec.js +++ b/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/basic-sample/exec.js @@ -7,7 +7,8 @@ var expected = multiline([ 'var _jsxFileName = "/fake/path/mock.js";', 'var x = ;', ]); diff --git a/packages/babel-preset-react/test/fixtures/preset-options/development-windows/exec.js b/packages/babel-preset-react/test/fixtures/preset-options/development-windows/exec.js index 3b7eb0d8ed..bdbfc12d5f 100644 --- a/packages/babel-preset-react/test/fixtures/preset-options/development-windows/exec.js +++ b/packages/babel-preset-react/test/fixtures/preset-options/development-windows/exec.js @@ -9,7 +9,8 @@ const expected = multiline([ ' bar: "baz",', ' __source: {', ' fileName: _jsxFileName,', - ' lineNumber: 1', + ' lineNumber: 1,', + ' columnNumber: 1', ' },', ' __self: this', '});', diff --git a/packages/babel-preset-react/test/fixtures/preset-options/development/exec.js b/packages/babel-preset-react/test/fixtures/preset-options/development/exec.js index 5ceb5a4a01..9dbbc3deb5 100644 --- a/packages/babel-preset-react/test/fixtures/preset-options/development/exec.js +++ b/packages/babel-preset-react/test/fixtures/preset-options/development/exec.js @@ -9,7 +9,8 @@ const expected = multiline([ ' bar: "baz",', ' __source: {', ' fileName: _jsxFileName,', - ' lineNumber: 1', + ' lineNumber: 1,', + ' columnNumber: 1', ' },', ' __self: this', '});',