From d92309f0dbd16c6baa3d1178ab8f2f0f4839f224 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 5 Jun 2017 22:53:24 -0400 Subject: [PATCH] PR comments --- packages/babel-generator/src/generators/expressions.js | 10 +++++++++- .../babel-plugin-transform-optional-chaining/README.md | 4 ++++ .../src/index.js | 5 +---- packages/babel-types/src/definitions/core.js | 8 ++++++++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index 68afd50ea7..0f1a9d1651 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -51,11 +51,16 @@ export function NewExpression(node: Object, parent: Object) { this.word("new"); this.space(); this.print(node.callee, node); - if (node.arguments.length === 0 && this.format.minified && + if (this.format.minified && + node.arguments.length === 0 && + !node.optional && !t.isCallExpression(parent, { callee: node }) && !t.isMemberExpression(parent) && !t.isNewExpression(parent)) return; + if (node.optional) { + this.token("?."); + } this.token("("); this.printList(node.arguments, node); this.token(")"); @@ -89,6 +94,9 @@ function commaSeparatorNewline() { export function CallExpression(node: Object) { this.print(node.callee, node); + if (node.optional) { + this.token("?."); + } this.token("("); const isPrettyCall = node._prettyCall; diff --git a/packages/babel-plugin-transform-optional-chaining/README.md b/packages/babel-plugin-transform-optional-chaining/README.md index 5c03a95117..849b6d98a4 100644 --- a/packages/babel-plugin-transform-optional-chaining/README.md +++ b/packages/babel-plugin-transform-optional-chaining/README.md @@ -43,6 +43,8 @@ const baz = obj?.foo?.bar?.baz(); // 42 const safe = obj?.qux?.baz(); // undefined const safe2 = obj?.foo.bar.qux?.(); // undefined +const willThrow = obj?.foo.bar.qux(); // Error: not a function + // Top function can be called directly, too. function test() { return 42; @@ -69,6 +71,8 @@ const baz = new obj?.foo?.bar?.baz(); // baz instance const safe = new obj?.qux?.baz(); // undefined const safe2 = new obj?.foo.bar.qux?.(); // undefined +const willThrow = new obj?.foo.bar.qux(); // Error: not a constructor + // Top classes can be called directly, too. class Test { } diff --git a/packages/babel-plugin-transform-optional-chaining/src/index.js b/packages/babel-plugin-transform-optional-chaining/src/index.js index f32eb713ec..d48492ff9e 100644 --- a/packages/babel-plugin-transform-optional-chaining/src/index.js +++ b/packages/babel-plugin-transform-optional-chaining/src/index.js @@ -6,14 +6,11 @@ export default function ({ types: t }) { const optionals = [path.node]; const nil = scope.buildUndefinedNode(); - let objectPath = path.get(key); - while (objectPath.isMemberExpression()) { + for (let objectPath = path.get(key); objectPath.isMemberExpression(); objectPath = objectPath.get("object")) { const { node } = objectPath; if (node.optional) { optionals.push(node); } - - objectPath = objectPath.get("object"); } for (let i = optionals.length - 1; i >= 0; i--) { diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index 8cbecc3d6e..d72feba5e3 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -119,6 +119,10 @@ defineType("CallExpression", { arguments: { validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression", "SpreadElement"))), }, + optional: { + validate: assertOneOf(true, false), + optional: true, + }, }, aliases: ["Expression"], }); @@ -454,6 +458,10 @@ defineType("NewExpression", { arguments: { validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression", "SpreadElement"))), }, + optional: { + validate: assertOneOf(true, false), + optional: true, + }, }, });