diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index d8fbaf2a4952..5be44e2d0254 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -10,9 +10,7 @@ import type { Format } from "./printer"; */ class Generator extends Printer { - constructor(ast, opts, code) { - opts = opts || {}; - + constructor(ast, opts = {}, code) { const tokens = ast.tokens || []; const format = normalizeOptions(code, opts, tokens); const map = opts.sourceMaps ? new SourceMap(opts, code) : null; diff --git a/packages/babel-generator/src/node/parentheses.js b/packages/babel-generator/src/node/parentheses.js index b469ef1703a9..0175a6312dd8 100644 --- a/packages/babel-generator/src/node/parentheses.js +++ b/packages/babel-generator/src/node/parentheses.js @@ -34,12 +34,8 @@ export function NullableTypeAnnotation(node: Object, parent: Object): boolean { export { NullableTypeAnnotation as FunctionTypeAnnotation }; export function UpdateExpression(node: Object, parent: Object): boolean { - if (t.isMemberExpression(parent) && parent.object === node) { - // (foo++).test() - return true; - } - - return false; + // (foo++).test() + return t.isMemberExpression(parent) && parent.object === node; } export function ObjectExpression(node: Object, parent: Object, printStack: Array): boolean { @@ -51,15 +47,11 @@ export function DoExpression(node: Object, parent: Object, printStack: Array nodePos) { - return true; - } - - // Logical expressions with the same precedence don't need parens. - if (parentPos === nodePos && parent.right === node && !t.isLogicalExpression(parent)) { + if ( + // Logical expressions with the same precedence don't need parens. + (parentPos === nodePos && parent.right === node && !t.isLogicalExpression(parent)) || + parentPos > nodePos + ) { return true; } } @@ -84,55 +75,27 @@ export function Binary(node: Object, parent: Object): boolean { } export function BinaryExpression(node: Object, parent: Object): boolean { - if (node.operator === "in") { - // let i = (1 in []); - if (t.isVariableDeclarator(parent)) { - return true; - } - - // for ((1 in []);;); - if (t.isFor(parent)) { - return true; - } - } - - return false; + // let i = (1 in []); + // for ((1 in []);;); + return node.operator === "in" && (t.isVariableDeclarator(parent) || t.isFor(parent)); } export function SequenceExpression(node: Object, parent: Object): boolean { - if (t.isForStatement(parent)) { + + if ( // Although parentheses wouldn"t hurt around sequence // expressions in the head of for loops, traditional style // dictates that e.g. i++, j++ should not be wrapped with // parentheses. - return false; - } - - if (t.isExpressionStatement(parent) && parent.expression === node) { - return false; - } - - if (t.isReturnStatement(parent)) { - return false; - } - - if (t.isThrowStatement(parent)) { - return false; - } - - if (t.isSwitchStatement(parent) && parent.discriminant === node) { - return false; - } - - if (t.isWhileStatement(parent) && parent.test === node) { - return false; - } - - if (t.isIfStatement(parent) && parent.test === node) { - return false; - } - - if (t.isForInStatement(parent) && parent.right === node) { + t.isForStatement(parent) || + t.isThrowStatement(parent) || + t.isReturnStatement(parent) || + (t.isIfStatement(parent) && parent.test === node) || + (t.isWhileStatement(parent) && parent.test === node) || + (t.isForInStatement(parent) && parent.right === node) || + (t.isSwitchStatement(parent) && parent.discriminant === node) || + (t.isExpressionStatement(parent) && parent.expression === node) + ) { return false; } @@ -158,15 +121,9 @@ export function ClassExpression(node: Object, parent: Object, printStack: Array< } export function UnaryLike(node: Object, parent: Object): boolean { - if (t.isMemberExpression(parent, { object: node })) { - return true; - } - - if (t.isCallExpression(parent, { callee: node }) || t.isNewExpression(parent, { callee: node })) { - return true; - } - - return false; + return t.isMemberExpression(parent, { object: node }) || + t.isCallExpression(parent, { callee: node }) || + t.isNewExpression(parent, { callee: node }); } export function FunctionExpression(node: Object, parent: Object, printStack: Array): boolean { @@ -189,19 +146,12 @@ export function ArrowFunctionExpression(node: Object, parent: Object): boolean { } export function ConditionalExpression(node: Object, parent: Object): boolean { - if (t.isUnaryLike(parent)) { - return true; - } - - if (t.isBinary(parent)) { - return true; - } - - if (t.isConditionalExpression(parent, { test: node })) { - return true; - } - - if (t.isAwaitExpression(parent)) { + if ( + t.isUnaryLike(parent) || + t.isBinary(parent) || + t.isConditionalExpression(parent, { test: node }) || + t.isAwaitExpression(parent) + ) { return true; } @@ -227,28 +177,23 @@ function isFirstInStatement(printStack: Array, { i--; let parent = printStack[i]; while (i > 0) { - if (t.isExpressionStatement(parent, { expression: node })) { - return true; - } - - if (t.isTaggedTemplateExpression(parent)) { - return true; - } - - if (considerDefaultExports && t.isExportDefaultDeclaration(parent, { declaration: node })) { - return true; - } - - if (considerArrow && t.isArrowFunctionExpression(parent, { body: node })) { + if ( + t.isExpressionStatement(parent, { expression: node }) || + t.isTaggedTemplateExpression(parent) || + considerDefaultExports && t.isExportDefaultDeclaration(parent, { declaration: node }) || + considerArrow && t.isArrowFunctionExpression(parent, { body: node }) + ) { return true; } - if ((t.isCallExpression(parent, { callee: node })) || - (t.isSequenceExpression(parent) && parent.expressions[0] === node) || - (t.isMemberExpression(parent, { object: node })) || - (t.isConditional(parent, { test: node })) || - (t.isBinary(parent, { left: node })) || - (t.isAssignmentExpression(parent, { left: node }))) { + if ( + t.isCallExpression(parent, { callee: node }) || + (t.isSequenceExpression(parent) && parent.expressions[0] === node) || + t.isMemberExpression(parent, { object: node }) || + t.isConditional(parent, { test: node }) || + t.isBinary(parent, { left: node }) || + t.isAssignmentExpression(parent, { left: node }) + ) { node = parent; i--; parent = printStack[i]; diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index 7a7331e06c96..1941b94acee3 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -332,9 +332,11 @@ export default class Printer { this._maybeAddAuxComment(this._insideAux && !oldInAux); let needsParens = n.needsParens(node, parent, this._printStack); - if (this.format.retainFunctionParens && - node.type === "FunctionExpression" && - node.extra && node.extra.parenthesized) { + if ( + this.format.retainFunctionParens && + node.type === "FunctionExpression" && + node.extra && node.extra.parenthesized + ) { needsParens = true; } if (needsParens) this.token("(");