From 180eda3211faa855654757bc44aeaf3961a8be05 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 22 Jan 2018 14:03:43 -0800 Subject: [PATCH] Remove old optional chain features (#6345) --- .../src/index.js | 35 ++++------ .../test/fixtures/execute/assignment-left.js | 16 ----- .../test/fixtures/execute/delete.js | 22 ------ .../test/fixtures/execute/new.js | 67 ------------------- .../test/fixtures/execute/update.js | 16 ----- .../fixtures/general/assignement/input.js | 7 -- .../fixtures/general/assignement/output.js | 6 -- .../test/fixtures/general/delete/input.js | 3 - .../test/fixtures/general/delete/output.js | 4 -- .../lhs-assignment-read-and-update/input.js | 1 + .../options.json | 3 + .../fixtures/general/lhs-assignment/input.js | 1 + .../general/lhs-assignment/options.json | 3 + .../test/fixtures/general/lhs-update/input.js | 1 + .../fixtures/general/lhs-update/options.json | 3 + .../test/fixtures/general/new/input.js | 16 ----- .../test/fixtures/general/new/output.js | 14 ---- 17 files changed, 25 insertions(+), 193 deletions(-) delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/assignment-left.js delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/delete.js delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/new.js delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/update.js delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignement/input.js delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignement/output.js delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/input.js delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-update/input.js create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-update/options.json delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/new/input.js delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/new/output.js diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index cc0998e704..ff5da3baef 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -10,11 +10,7 @@ export default function(api, options) { const nil = scope.buildUndefinedNode(); let objectPath = path; - while ( - objectPath.isMemberExpression() || - objectPath.isCallExpression() || - objectPath.isNewExpression() - ) { + while (objectPath.isMemberExpression() || objectPath.isCallExpression()) { const { node } = objectPath; if (node.optional) { optionals.push(node); @@ -32,8 +28,7 @@ export default function(api, options) { node.optional = false; const isCall = t.isCallExpression(node); - const replaceKey = - isCall || t.isNewExpression(node) ? "callee" : "object"; + const replaceKey = isCall ? "callee" : "object"; const chain = node[replaceKey]; let ref; @@ -102,24 +97,20 @@ export default function(api, options) { const { parentPath } = path; if (path.key == "left" && parentPath.isAssignmentExpression()) { - return false; + throw path.buildCodeFrameError( + "Illegal optional chain in assignment expression", + ); } + if (path.key == "argument" && parentPath.isUpdateExpression()) { + throw path.buildCodeFrameError( + "Illegal optional chain in update expression", + ); + } + if (path.key == "object" && parentPath.isMemberExpression()) { return false; } - if ( - path.key == "callee" && - (parentPath.isCallExpression() || parentPath.isNewExpression()) - ) { - return false; - } - if (path.key == "argument" && parentPath.isUpdateExpression()) { - return false; - } - if ( - path.key == "argument" && - parentPath.isUnaryExpression({ operator: "delete" }) - ) { + if (path.key == "callee" && parentPath.isCallExpression()) { return false; } @@ -131,7 +122,7 @@ export default function(api, options) { inherits: syntaxOptionalChaining, visitor: { - "MemberExpression|NewExpression|CallExpression"(path) { + "MemberExpression|CallExpression"(path) { if (!path.node.optional) { return; } diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/assignment-left.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/assignment-left.js deleted file mode 100644 index e9ae376fef..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/assignment-left.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -const obj = { - a: { - b: 0, - }, -}; - -obj?.a.b = 1; -assert.equal(obj.a.b, 1); - -obj?.a?.b = 2; -assert.equal(obj.a.b, 2); - -obj?.b?.b = 3; -assert.equal(obj.b, undefined); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/delete.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/delete.js deleted file mode 100644 index a397021233..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/delete.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; - -const obj = { - a: { - b: 0, - }, -}; - -let test = delete obj?.a?.b; -assert.equal(obj.a.b, undefined); -assert.equal(test, true); - -test = delete obj?.a.b; -assert.equal(obj.a.b, undefined); -assert.equal(test, true); - -test = delete obj?.b?.b; -assert.equal(obj.b, undefined); -assert.equal(test, undefined); - -delete obj?.a; -assert.equal(obj.a, undefined); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/new.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/new.js deleted file mode 100644 index 184524f49e..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/new.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; - -let calls = 0; -const obj = { - a: { - b: class { - constructor(val) { - assert.equal(val, 1); - assert(this instanceof obj.a.b); - calls++; - } - }, - }, - c: class { - constructor(val) { - assert.equal(val, 1); - assert(this instanceof obj.c); - calls++; - } - }, -}; - -let ab = new obj?.a?.b(1); -assert(ab instanceof obj.a.b); - -ab = new obj?.a.b(1); -assert(ab instanceof obj.a.b); - -ab = new obj?.a?.b?.(1); -assert(ab instanceof obj.a.b); - -ab = new obj?.a.b?.(1); -assert(ab instanceof obj.a.b); - -ab = new obj?.b?.b(1); -assert.equal(ab, undefined); - -ab = new obj?.b?.b?.(1); -assert.equal(ab, undefined); - -let c = new obj?.c(1); -assert(c instanceof obj.c); - -c = new obj?.c?.(1); -assert(c instanceof obj.c); - -c = new obj?.d?.(1); -assert.equal(c, undefined); - -new obj?.a.b(1); -assert.equal(calls, 7); - -new obj?.a?.b(1); -assert.equal(calls, 8); - -new obj?.a?.b?.(1); -assert.equal(calls, 9); - -new obj?.a.b?.(1); -assert.equal(calls, 10); - -new obj?.c?.(1); -assert.equal(calls, 11); - -new obj?.b?.b(1); -new obj?.b?.b?.(1); -new obj?.d?.(1); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/update.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/update.js deleted file mode 100644 index 320a8c75e0..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/execute/update.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -const obj = { - a: { - b: 0, - }, -}; - -obj?.a.b++; -assert.equal(obj.a.b, 1); - -obj?.a?.b++; -assert.equal(obj.a.b, 2); - -obj?.b?.b++; -assert.equal(obj.b, undefined); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignement/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignement/input.js deleted file mode 100644 index b7d9cee953..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignement/input.js +++ /dev/null @@ -1,7 +0,0 @@ -a?.b = 42 - -a?.b?.c?.d = 42 - -a?.b?.c?.d++ - -a?.b?.c?.d += 1 diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignement/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignement/output.js deleted file mode 100644 index 10681564b6..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/assignement/output.js +++ /dev/null @@ -1,6 +0,0 @@ -var _a, _a2, _a2$b, _a2$b$c, _a3, _a3$b, _a3$b$c, _a4, _a4$b, _a4$b$c; - -(_a = a) === null || _a === void 0 ? void 0 : _a.b = 42; -(_a2 = a) === null || _a2 === void 0 ? void 0 : (_a2$b = _a2.b) === null || _a2$b === void 0 ? void 0 : (_a2$b$c = _a2$b.c) === null || _a2$b$c === void 0 ? void 0 : _a2$b$c.d = 42; -(_a3 = a) === null || _a3 === void 0 ? void 0 : (_a3$b = _a3.b) === null || _a3$b === void 0 ? void 0 : (_a3$b$c = _a3$b.c) === null || _a3$b$c === void 0 ? void 0 : _a3$b$c.d++; -(_a4 = a) === null || _a4 === void 0 ? void 0 : (_a4$b = _a4.b) === null || _a4$b === void 0 ? void 0 : (_a4$b$c = _a4$b.c) === null || _a4$b$c === void 0 ? void 0 : _a4$b$c.d += 1; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/input.js deleted file mode 100644 index e75af35f7f..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/input.js +++ /dev/null @@ -1,3 +0,0 @@ -delete a?.b - -delete a?.b?.c?.d diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/output.js deleted file mode 100644 index cd7d766944..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/delete/output.js +++ /dev/null @@ -1,4 +0,0 @@ -var _a, _a2, _a2$b, _a2$b$c; - -(_a = a) === null || _a === void 0 ? void 0 : delete _a.b; -(_a2 = a) === null || _a2 === void 0 ? void 0 : (_a2$b = _a2.b) === null || _a2$b === void 0 ? void 0 : (_a2$b$c = _a2$b.c) === null || _a2$b$c === void 0 ? void 0 : delete _a2$b$c.d; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/input.js new file mode 100644 index 0000000000..86f4ccc69b --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/input.js @@ -0,0 +1 @@ +a?.b += 1 diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/options.json new file mode 100644 index 0000000000..5ef1ad8077 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment-read-and-update/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Illegal optional chain in assignment expression" +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment/input.js new file mode 100644 index 0000000000..bf7a81758e --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment/input.js @@ -0,0 +1 @@ +a?.b = 42 diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment/options.json new file mode 100644 index 0000000000..5ef1ad8077 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-assignment/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Illegal optional chain in assignment expression" +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-update/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-update/input.js new file mode 100644 index 0000000000..5a451b8587 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-update/input.js @@ -0,0 +1 @@ +a?.b++ diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-update/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-update/options.json new file mode 100644 index 0000000000..3bea483d47 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/lhs-update/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Illegal optional chain in update expression" +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/new/input.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/new/input.js deleted file mode 100644 index a42e650ea4..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/new/input.js +++ /dev/null @@ -1,16 +0,0 @@ -new a?.b -new a?.b?.c?.d - -new a?.b() -new a?.b?.c?.d() - -new b?.(b) -new a?.b?.(a.b, true) - -new b?.().c -new b?.()?.c - -new a.b?.().c -new a.b?.()?.c -new a?.b?.().c -new a?.b?.()?.c diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/new/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/new/output.js deleted file mode 100644 index f24c7bf1b5..0000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/general/new/output.js +++ /dev/null @@ -1,14 +0,0 @@ -var _a, _a2, _a2$b, _a2$b$c, _a3, _a4, _a4$b, _a4$b$c, _b, _a5, _a5$b, _b2, _b3, _ref, _a$b, _a$b2, _ref2, _a6, _a6$b, _a7, _a7$b, _ref3; - -(_a = a) === null || _a === void 0 ? void 0 : new _a.b(); -(_a2 = a) === null || _a2 === void 0 ? void 0 : (_a2$b = _a2.b) === null || _a2$b === void 0 ? void 0 : (_a2$b$c = _a2$b.c) === null || _a2$b$c === void 0 ? void 0 : new _a2$b$c.d(); -(_a3 = a) === null || _a3 === void 0 ? void 0 : new _a3.b(); -(_a4 = a) === null || _a4 === void 0 ? void 0 : (_a4$b = _a4.b) === null || _a4$b === void 0 ? void 0 : (_a4$b$c = _a4$b.c) === null || _a4$b$c === void 0 ? void 0 : new _a4$b$c.d(); -(_b = b) === null || _b === void 0 ? void 0 : new _b(b); -(_a5 = a) === null || _a5 === void 0 ? void 0 : (_a5$b = _a5.b) === null || _a5$b === void 0 ? void 0 : new _a5$b(a.b, true); -(_b2 = b) === null || _b2 === void 0 ? void 0 : new _b2().c; -(_b3 = b) === null || _b3 === void 0 ? void 0 : (_ref = new _b3()) === null || _ref === void 0 ? void 0 : _ref.c; -(_a$b = a.b) === null || _a$b === void 0 ? void 0 : new _a$b().c; -(_a$b2 = a.b) === null || _a$b2 === void 0 ? void 0 : (_ref2 = new _a$b2()) === null || _ref2 === void 0 ? void 0 : _ref2.c; -(_a6 = a) === null || _a6 === void 0 ? void 0 : (_a6$b = _a6.b) === null || _a6$b === void 0 ? void 0 : new _a6$b().c; -(_a7 = a) === null || _a7 === void 0 ? void 0 : (_a7$b = _a7.b) === null || _a7$b === void 0 ? void 0 : (_ref3 = new _a7$b()) === null || _ref3 === void 0 ? void 0 : _ref3.c;