diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index 3aa3679bb0..9c42733ca9 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -91,6 +91,10 @@ export function Decorator(node: Object) { this.newline(); } +function commaSeparatorNewline() { + this.push(",\n"); +} + export function CallExpression(node: Object) { this.print(node.callee, node); if (node.loc) this.printAuxAfterComment(); @@ -101,7 +105,7 @@ export function CallExpression(node: Object) { let separator; if (isPrettyCall) { - separator = ",\n"; + separator = commaSeparatorNewline; this.newline(); this.indent(); } diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index 2c52a5a6e1..ed461d8640 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -127,8 +127,12 @@ export function InterfaceDeclaration(node: Object) { this._interfaceish(node); } +function andSeparator() { + this.push(" & "); +} + export function IntersectionTypeAnnotation(node: Object) { - this.printJoin(node.types, node, { separator: " & " }); + this.printJoin(node.types, node, { separator: andSeparator }); } export function MixedTypeAnnotation() { @@ -277,8 +281,12 @@ export function QualifiedTypeIdentifier(node: Object) { this.print(node.id, node); } +function orSeparator() { + this.push(" | "); +} + export function UnionTypeAnnotation(node: Object) { - this.printJoin(node.types, node, { separator: " | " }); + this.printJoin(node.types, node, { separator: orSeparator }); } export function TypeCastExpression(node: Object) { diff --git a/packages/babel-generator/src/generators/jsx.js b/packages/babel-generator/src/generators/jsx.js index 7a926bb512..1850e0abf4 100644 --- a/packages/babel-generator/src/generators/jsx.js +++ b/packages/babel-generator/src/generators/jsx.js @@ -52,12 +52,16 @@ export function JSXElement(node: Object) { this.print(node.closingElement, node); } +function spaceSeparator() { + this.push(" "); +} + export function JSXOpeningElement(node: Object) { this.push("<"); this.print(node.name, node); if (node.attributes.length > 0) { this.push(" "); - this.printJoin(node.attributes, node, { separator: " " }); + this.printJoin(node.attributes, node, { separator: spaceSeparator }); } this.push(node.selfClosing ? " />" : ">"); } diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index c4d4e95faa..caea594d93 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -1,4 +1,3 @@ -import repeat from "lodash/repeat"; import * as t from "babel-types"; const NON_ALPHABETIC_UNARY_OPERATORS = t.UPDATE_OPERATORS.concat(t.NUMBER_UNARY_OPERATORS).concat(["!"]); @@ -205,6 +204,16 @@ export function DebuggerStatement() { this.semicolon(); } +function variableDeclarationIdent() { + // "let " or "var " indentation. + this.push(",\n "); +} + +function constDeclarationIdent() { + // "const " indentation. + this.push(",\n "); +} + export function VariableDeclaration(node: Object, parent: Object) { this.push(node.kind + " "); @@ -231,14 +240,14 @@ export function VariableDeclaration(node: Object, parent: Object) { // bar = "foo"; // - let sep; + let separator; if (!this.format.compact && !this.format.concise && hasInits && !this.format.retainLines) { - sep = `,\n${repeat(" ", node.kind.length + 1)}`; + separator = node.kind === "const" ? constDeclarationIdent : variableDeclarationIdent; } // - this.printList(node.declarations, node, { separator: sep }); + this.printList(node.declarations, node, { separator }); if (t.isFor(parent)) { // don't give semicolons to these nodes since they'll be inserted in the parent generator diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index c46a6bc9c9..e3772e8987 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -125,7 +125,7 @@ export default class Printer extends Buffer { } if (opts.separator && i < len - 1) { - this.push(opts.separator); + opts.separator.call(this); } } }; @@ -187,8 +187,7 @@ export default class Printer extends Buffer { printList(items, parent, opts = {}) { if (opts.separator == null) { - opts.separator = ","; - if (!this.format.compact) opts.separator += " "; + opts.separator = commaSeparator; } return this.printJoin(items, parent, opts); @@ -316,6 +315,11 @@ export default class Printer extends Buffer { } } +function commaSeparator() { + this.push(","); + this.space(); +} + for (let generator of [ require("./generators/template-literals"), require("./generators/expressions"),