From cdeff2fbb1f55b3b15a495520415f1b4f0f0b5cb Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 3 Nov 2015 10:49:24 +0000 Subject: [PATCH] simplify parentheses logic and properly parenthesise unaries - fixes #2711 --- .../babel-generator/src/node/parentheses.js | 36 +++++++------------ .../fixtures/types/UnaryExpression/actual.js | 2 ++ .../types/UnaryExpression/expected.js | 2 ++ 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index 3b6d1d6e1c..4f488956e7 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -154,7 +154,15 @@ export function ClassExpression(node: Object, parent: Object): boolean { } export function UnaryLike(node: Object, parent: Object): boolean { - return t.isMemberExpression(parent) && parent.object === node; + if (t.isMemberExpression(parent, { object: node })) { + return true; + } + + if (t.isCallExpression(parent, { callee: node }) || t.isNewExpression(parent, { callee: node })) { + return true; + } + + return false; } export function FunctionExpression(node: Object, parent: Object): boolean { @@ -172,17 +180,7 @@ export function ArrowFunctionExpression(node: Object, parent: Object): boolean { return true; } - // (function test() {}).name; - if (t.isMemberExpression(parent) && parent.object === node) { - return true; - } - - // (function () {})(); - if (t.isCallExpression(parent) && parent.callee === node) { - return true; - } - - return false; + return UnaryLike(node, parent); } export function ConditionalExpression(node: Object, parent: Object): boolean { @@ -194,21 +192,11 @@ export function ConditionalExpression(node: Object, parent: Object): boolean { return true; } - if (t.isCallExpression(parent) || t.isNewExpression(parent)) { - if (parent.callee === node) { - return true; - } - } - - if (t.isConditionalExpression(parent) && parent.test === node) { + if (t.isConditionalExpression(parent, { test: node })) { return true; } - if (t.isMemberExpression(parent) && parent.object === node) { - return true; - } - - return false; + return UnaryLike(node, parent); } export function AssignmentExpression(node: Object): boolean { diff --git a/packages/babel-generator/test/fixtures/types/UnaryExpression/actual.js b/packages/babel-generator/test/fixtures/types/UnaryExpression/actual.js index 9f318cdb1f..58154c99cf 100644 --- a/packages/babel-generator/test/fixtures/types/UnaryExpression/actual.js +++ b/packages/babel-generator/test/fixtures/types/UnaryExpression/actual.js @@ -3,3 +3,5 @@ delete delete i; !!i; + ++i; - --i; +typeof a(); +(typeof a)(); diff --git a/packages/babel-generator/test/fixtures/types/UnaryExpression/expected.js b/packages/babel-generator/test/fixtures/types/UnaryExpression/expected.js index 9f318cdb1f..58154c99cf 100644 --- a/packages/babel-generator/test/fixtures/types/UnaryExpression/expected.js +++ b/packages/babel-generator/test/fixtures/types/UnaryExpression/expected.js @@ -3,3 +3,5 @@ delete delete i; !!i; + ++i; - --i; +typeof a(); +(typeof a)();