diff --git a/packages/babel-plugin-transform-optional-chaining/src/index.js b/packages/babel-plugin-transform-optional-chaining/src/index.js index 204ade516e..73058c520d 100644 --- a/packages/babel-plugin-transform-optional-chaining/src/index.js +++ b/packages/babel-plugin-transform-optional-chaining/src/index.js @@ -22,6 +22,7 @@ export default function ({ types: t }) { return { visitor: { + MemberExpression(path, state) { if (!isNodeOptional(path.node)) { return; @@ -36,12 +37,25 @@ export default function ({ types: t }) { path.scope.push({ id }); } - const remplacement = createCondition( - state.optionalTemp, - object, - property, - t.identifier("undefined") - ); + let remplacement; + + if (t.isCallExpression(path.parent)) { + + remplacement = createCondition( + state.optionalTemp, + object, + property, + t.callExpression(t.identifier("Function"), []) + ); + } else { + + remplacement = createCondition( + state.optionalTemp, + object, + property, + t.identifier("undefined") + ); + } path.replaceWith(remplacement); }, diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/function-call/actual.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/function-call/actual.js new file mode 100644 index 0000000000..62587bbd25 --- /dev/null +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/function-call/actual.js @@ -0,0 +1 @@ +foo?.bar() diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/function-call/expected.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/function-call/expected.js new file mode 100644 index 0000000000..b20ea71dac --- /dev/null +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/function-call/expected.js @@ -0,0 +1,3 @@ +var _temp; + +((_temp = foo) != null ? _temp.bar : Function())(); \ No newline at end of file