From 2a496890ffcb5409eac42782ebb5ee4192d5367f Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Sat, 3 Jun 2017 02:07:40 -0400 Subject: [PATCH] Use a better nested syntax This way, it quickly returns from the conditions. The first nil will now exit, instead of checking every nil. This also allows conditionalChaining inside a container to still operate the container. --- .../babel-plugin-transform-optional-chaining/src/index.js | 6 +++--- .../test/fixtures/general/assignement/expected.js | 2 +- .../test/fixtures/general/containers/actual.js | 6 ++++++ .../test/fixtures/general/containers/expected.js | 8 ++++++++ .../test/fixtures/general/delete/expected.js | 2 +- .../test/fixtures/general/member-access/expected.js | 2 +- .../test/fixtures/general/new/expected.js | 4 ++-- 7 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 packages/babel-plugin-transform-optional-chaining/test/fixtures/general/containers/actual.js create mode 100644 packages/babel-plugin-transform-optional-chaining/test/fixtures/general/containers/expected.js diff --git a/packages/babel-plugin-transform-optional-chaining/src/index.js b/packages/babel-plugin-transform-optional-chaining/src/index.js index 287f14963d..9bde485b52 100644 --- a/packages/babel-plugin-transform-optional-chaining/src/index.js +++ b/packages/babel-plugin-transform-optional-chaining/src/index.js @@ -47,11 +47,11 @@ export default function ({ types: t }) { node.object = ref; let parent = path; - let expression; - do { + let expression = path; + while (parent.listKey === undefined) { expression = parent; parent = parent.parentPath; - } while (!parent.container); + } const replace = parent.isExpression() ? parent : expression; replace.replaceWith(t.conditionalExpression( diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/assignement/expected.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/assignement/expected.js index c8ee711d7d..86ba0f57ef 100644 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/assignement/expected.js +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/assignement/expected.js @@ -2,4 +2,4 @@ var _a, _a$b$c, _a$b, _a2; (_a = a) == null ? void 0 : _a.b = 42; -(((_a2 = a) == null ? void 0 : _a$b = _a2.b) == null ? void 0 : _a$b$c = _a$b.c) == null ? void 0 : _a$b$c.d = 42; \ No newline at end of file +(_a2 = a) == null ? void 0 : (_a$b = _a2.b) == null ? void 0 : (_a$b$c = _a$b.c) == null ? void 0 : _a$b$c.d = 42; \ No newline at end of file diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/containers/actual.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/containers/actual.js new file mode 100644 index 0000000000..d699b16fa1 --- /dev/null +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/containers/actual.js @@ -0,0 +1,6 @@ +var street = user.address?.street +street = user.address?.street + +test(a?.b, 1); + +(1, a?.b, 2); diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/containers/expected.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/containers/expected.js new file mode 100644 index 0000000000..811e1603a0 --- /dev/null +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/containers/expected.js @@ -0,0 +1,8 @@ +var _user$address, _user$address2, _a, _a2; + +var street = (_user$address = user.address) == null ? void 0 : _user$address.street; +(_user$address2 = user.address) == null ? void 0 : street = _user$address2.street; + +test((_a = a) == null ? void 0 : _a.b, 1); + +1, (_a2 = a) == null ? void 0 : _a2.b, 2; diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete/expected.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete/expected.js index 1e690c7d45..49afe9cd6e 100644 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete/expected.js +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/delete/expected.js @@ -2,4 +2,4 @@ var _a, _a$b$c, _a$b, _a2; (_a = a) == null ? void 0 : delete _a.b; -(((_a2 = a) == null ? void 0 : _a$b = _a2.b) == null ? void 0 : _a$b$c = _a$b.c) == null ? void 0 : delete _a$b$c.d; \ No newline at end of file +(_a2 = a) == null ? void 0 : (_a$b = _a2.b) == null ? void 0 : (_a$b$c = _a$b.c) == null ? void 0 : delete _a$b$c.d; \ No newline at end of file diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/member-access/expected.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/member-access/expected.js index 1c779cf856..a8a381af7a 100644 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/member-access/expected.js +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/member-access/expected.js @@ -2,4 +2,4 @@ var _foo, _a$b$c, _a; (_foo = foo) == null ? void 0 : _foo.bar; -(_a$b$c = (_a = a) == null ? void 0 : _a.b.c) == null ? void 0 : _a$b$c.d.e; \ No newline at end of file +(_a = a) == null ? void 0 : (_a$b$c = _a.b.c) == null ? void 0 : _a$b$c.d.e; \ No newline at end of file diff --git a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/new/expected.js b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/new/expected.js index 80b39699a2..1d6d1ad2d5 100644 --- a/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/new/expected.js +++ b/packages/babel-plugin-transform-optional-chaining/test/fixtures/general/new/expected.js @@ -1,10 +1,10 @@ var _a, _a$b$c, _a$b, _a2, _a3, _a$b$c2, _a$b2, _a4, _b, _a5, _a5$b; (_a = a) == null ? void 0 : new _a.b(); -(((_a2 = a) == null ? void 0 : _a$b = _a2.b) == null ? void 0 : _a$b$c = _a$b.c) == null ? void 0 : new _a$b$c.d(); +(_a2 = a) == null ? void 0 : (_a$b = _a2.b) == null ? void 0 : (_a$b$c = _a$b.c) == null ? void 0 : new _a$b$c.d(); (_a3 = a) == null ? void 0 : new _a3.b(); -(((_a4 = a) == null ? void 0 : _a$b2 = _a4.b) == null ? void 0 : _a$b$c2 = _a$b2.c) == null ? void 0 : new _a$b$c2.d(); +(_a4 = a) == null ? void 0 : (_a$b2 = _a4.b) == null ? void 0 : (_a$b$c2 = _a$b2.c) == null ? void 0 : new _a$b$c2.d(); (_b = b) == null ? void 0 : new _b(b); (_a5 = a) == null ? void 0 : (_a5$b = _a5.b) == null ? void 0 : new _a5$b(a.b, true); \ No newline at end of file