diff --git a/packages/babel-generator/package.json b/packages/babel-generator/package.json index b74448c7f2..fdafee3b9d 100644 --- a/packages/babel-generator/package.json +++ b/packages/babel-generator/package.json @@ -9,6 +9,7 @@ "main": "lib/index.js", "dependencies": { "babel-messages": "^5.8.22", + "babel-runtime": "^5.8.20", "babel-types": "^5.8.22", "detect-indent": "^3.0.1", "is-integer": "^1.0.4", @@ -16,5 +17,8 @@ "repeating": "^1.1.3", "source-map": "^0.4.4", "trim-right": "^1.0.1" + }, + "devDependencies": { + "babel-helper-fixtures": "^1.0.0" } } diff --git a/packages/babel-generator/src/buffer.js b/packages/babel-generator/src/buffer.js index abd69f8006..7d521f9ef1 100644 --- a/packages/babel-generator/src/buffer.js +++ b/packages/babel-generator/src/buffer.js @@ -23,6 +23,19 @@ export default class Buffer { _indent: number; format: Object; + /** + * Description + */ + + catchUp(node) { + // catch up to this nodes newline if we're behind + if (node.loc && this.format.retainLines && this.buf) { + while (this.position.line < node.loc.start.line) { + this._push("\n"); + } + } + } + /** * Get the current trimmed buffer. */ diff --git a/packages/babel-generator/src/generators/base.js b/packages/babel-generator/src/generators/base.js index 67fe2f580e..f1ee541a26 100644 --- a/packages/babel-generator/src/generators/base.js +++ b/packages/babel-generator/src/generators/base.js @@ -1,26 +1,36 @@ /* @flow */ -import type NodePrinter from "../node/printer"; - -export function File(node: Object, print: NodePrinter) { - print.plain(node.program); +export function File(node: Object) { + this.print(node.program, node); } -export function Program(node: Object, print: NodePrinter) { - print.sequence(node.body); +export function Program(node: Object) { + this.printInnerComments(node, false); + this.printSequence(node.directives, node); + this.printSequence(node.body, node); } -export function BlockStatement(node: Object, print: NodePrinter) { +export function BlockStatement(node: Object) { this.push("{"); + this.printInnerComments(node); if (node.body.length) { this.newline(); - print.sequence(node.body, { indent: true }); + this.printSequence(node.directives, node, { indent: true }); + this.printSequence(node.body, node, { indent: true }); if (!this.format.retainLines) this.removeLast("\n"); this.rightBrace(); } else { - print.printInnerComments(); this.push("}"); } } export function Noop() {} + +export function Directive(node: Object) { + this.print(node.value, node); + this.semicolon(); +} + +export function DirectiveLiteral(node: Object) { + this.push(this._stringLiteral(node.value)); +} diff --git a/packages/babel-generator/src/generators/classes.js b/packages/babel-generator/src/generators/classes.js index 6222fa7924..f692bc10a4 100644 --- a/packages/babel-generator/src/generators/classes.js +++ b/packages/babel-generator/src/generators/classes.js @@ -1,72 +1,70 @@ /* @flow */ -import type NodePrinter from "../node/printer"; - -export function ClassDeclaration(node: Object, print: NodePrinter) { - print.list(node.decorators, { separator: "" }); +export function ClassDeclaration(node: Object) { + this.printJoin(node.decorators, node, { separator: "" }); this.push("class"); if (node.id) { this.push(" "); - print.plain(node.id); + this.print(node.id, node); } - print.plain(node.typeParameters); + this.print(node.typeParameters, node); if (node.superClass) { this.push(" extends "); - print.plain(node.superClass); - print.plain(node.superTypeParameters); + this.print(node.superClass, node); + this.print(node.superTypeParameters, node); } if (node.implements) { this.push(" implements "); - print.join(node.implements, { separator: ", " }); + this.printJoin(node.implements, node, { separator: ", " }); } this.space(); - print.plain(node.body); + this.print(node.body, node); } export { ClassDeclaration as ClassExpression }; -export function ClassBody(node: Object, print: NodePrinter) { +export function ClassBody(node: Object) { this.push("{"); + this.printInnerComments(node); if (node.body.length === 0) { - print.printInnerComments(); this.push("}"); } else { this.newline(); this.indent(); - print.sequence(node.body); + this.printSequence(node.body, node); this.dedent(); this.rightBrace(); } } -export function ClassProperty(node: Object, print: NodePrinter) { - print.list(node.decorators, { separator: "" }); +export function ClassProperty(node: Object) { + this.printJoin(node.decorators, node, { separator: "" }); if (node.static) this.push("static "); - print.plain(node.key); - print.plain(node.typeAnnotation); + this.print(node.key, node); + this.print(node.typeAnnotation, node); if (node.value) { this.space(); this.push("="); this.space(); - print.plain(node.value); + this.print(node.value, node); } this.semicolon(); } -export function MethodDefinition(node: Object, print: NodePrinter) { - print.list(node.decorators, { separator: "" }); +export function MethodDefinition(node: Object) { + this.printJoin(node.decorators, node, { separator: "" }); if (node.static) { this.push("static "); } - this._method(node, print); + this._method(node); } diff --git a/packages/babel-generator/src/generators/comprehensions.js b/packages/babel-generator/src/generators/comprehensions.js deleted file mode 100644 index 4128805dd4..0000000000 --- a/packages/babel-generator/src/generators/comprehensions.js +++ /dev/null @@ -1,31 +0,0 @@ -/* @flow */ - -import type NodePrinter from "../node/printer"; - -export function ComprehensionBlock(node: Object, print: NodePrinter) { - this.keyword("for"); - this.push("("); - print.plain(node.left); - this.push(" of "); - print.plain(node.right); - this.push(")"); -} - -export function ComprehensionExpression(node: Object, print: NodePrinter) { - this.push(node.generator ? "(" : "["); - - print.join(node.blocks, { separator: " " }); - this.space(); - - if (node.filter) { - this.keyword("if"); - this.push("("); - print.plain(node.filter); - this.push(")"); - this.space(); - } - - print.plain(node.body); - - this.push(node.generator ? ")" : "]"); -} diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index 2df40bc43d..ea51bacc65 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -1,13 +1,12 @@ /* @flow */ -import type NodePrinter from "../node/printer"; import isInteger from "is-integer"; import isNumber from "lodash/lang/isNumber"; import * as t from "babel-types"; const SCIENTIFIC_NOTATION = /e/i; -export function UnaryExpression(node: Object, print: NodePrinter) { +export function UnaryExpression(node: Object) { let needsSpace = /[a-z]$/.test(node.operator); let arg = node.argument; @@ -21,53 +20,53 @@ export function UnaryExpression(node: Object, print: NodePrinter) { this.push(node.operator); if (needsSpace) this.push(" "); - print.plain(node.argument); + this.print(node.argument, node); } -export function DoExpression(node: Object, print: NodePrinter) { +export function DoExpression(node: Object) { this.push("do"); this.space(); - print.plain(node.body); + this.print(node.body, node); } -export function ParenthesizedExpression(node: Object, print: NodePrinter) { +export function ParenthesizedExpression(node: Object) { this.push("("); - print.plain(node.expression); + this.print(node.expression, node); this.push(")"); } -export function UpdateExpression(node: Object, print: NodePrinter) { +export function UpdateExpression(node: Object) { if (node.prefix) { this.push(node.operator); - print.plain(node.argument); + this.print(node.argument, node); } else { - print.plain(node.argument); + this.print(node.argument, node); this.push(node.operator); } } -export function ConditionalExpression(node: Object, print: NodePrinter) { - print.plain(node.test); +export function ConditionalExpression(node: Object) { + this.print(node.test, node); this.space(); this.push("?"); this.space(); - print.plain(node.consequent); + this.print(node.consequent, node); this.space(); this.push(":"); this.space(); - print.plain(node.alternate); + this.print(node.alternate, node); } -export function NewExpression(node: Object, print: NodePrinter) { +export function NewExpression(node: Object) { this.push("new "); - print.plain(node.callee); + this.print(node.callee, node); this.push("("); - print.list(node.arguments); + this.printList(node.arguments, node); this.push(")"); } -export function SequenceExpression(node: Object, print: NodePrinter) { - print.list(node.expressions); +export function SequenceExpression(node: Object) { + this.printList(node.expressions, node); } export function ThisExpression() { @@ -78,14 +77,14 @@ export function Super() { this.push("super"); } -export function Decorator(node: Object, print: NodePrinter) { +export function Decorator(node: Object) { this.push("@"); - print.plain(node.expression); + this.print(node.expression, node); this.newline(); } -export function CallExpression(node: Object, print: NodePrinter) { - print.plain(node.callee); +export function CallExpression(node: Object) { + this.print(node.callee, node); this.push("("); @@ -98,7 +97,7 @@ export function CallExpression(node: Object, print: NodePrinter) { this.indent(); } - print.list(node.arguments, { separator }); + this.printList(node.arguments, node, { separator }); if (isPrettyCall) { this.newline(); @@ -109,7 +108,7 @@ export function CallExpression(node: Object, print: NodePrinter) { } function buildYieldAwait(keyword) { - return function (node: Object, print: NodePrinter) { + return function (node: Object) { this.push(keyword); if (node.delegate || node.all) { @@ -119,7 +118,7 @@ function buildYieldAwait(keyword) { if (node.argument) { this.push(" "); let terminatorState = this.startTerminatorless(); - print.plain(node.argument); + this.print(node.argument, node); this.endTerminatorless(terminatorState); } }; @@ -132,19 +131,19 @@ export function EmptyStatement() { this.semicolon(); } -export function ExpressionStatement(node: Object, print: NodePrinter) { - print.plain(node.expression); +export function ExpressionStatement(node: Object) { + this.print(node.expression, node); this.semicolon(); } -export function AssignmentPattern(node: Object, print: NodePrinter) { - print.plain(node.left); +export function AssignmentPattern(node: Object) { + this.print(node.left, node); this.push(" = "); - print.plain(node.right); + this.print(node.right, node); } -export function AssignmentExpression(node: Object, print: NodePrinter) { - print.plain(node.left); +export function AssignmentExpression(node: Object) { + this.print(node.left, node); let spaces = !this.format.compact || node.operator === "in" || node.operator === "instanceof"; spaces = true; // todo: https://github.com/babel/babel/issues/1835 @@ -162,13 +161,13 @@ export function AssignmentExpression(node: Object, print: NodePrinter) { if (spaces) this.push(" "); - print.plain(node.right); + this.print(node.right, node); } -export function BindExpression(node: Object, print: NodePrinter) { - print.plain(node.object); +export function BindExpression(node: Object) { + this.print(node.object, node); this.push("::"); - print.plain(node.callee); + this.print(node.callee, node); } export { @@ -176,9 +175,8 @@ export { AssignmentExpression as LogicalExpression }; -export function MemberExpression(node: Object, print: NodePrinter) { - let obj = node.object; - print.plain(obj); +export function MemberExpression(node: Object) { + this.print(node.object, node); if (!node.computed && t.isMemberExpression(node.property)) { throw new TypeError("Got a MemberExpression for MemberExpression property"); @@ -191,7 +189,7 @@ export function MemberExpression(node: Object, print: NodePrinter) { if (computed) { this.push("["); - print.plain(node.property); + this.print(node.property, node); this.push("]"); } else { if (t.isLiteral(node.object)) { @@ -202,12 +200,12 @@ export function MemberExpression(node: Object, print: NodePrinter) { } this.push("."); - print.plain(node.property); + this.print(node.property, node); } } -export function MetaProperty(node: Object, print: NodePrinter) { - print.plain(node.meta); +export function MetaProperty(node: Object) { + this.print(node.meta, node); this.push("."); - print.plain(node.property); + this.print(node.property, node); } diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index 190d6887b7..a487c3a4e0 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -1,14 +1,13 @@ /* @flow */ -import type NodePrinter from "../node/printer"; import * as t from "babel-types"; export function AnyTypeAnnotation() { this.push("any"); } -export function ArrayTypeAnnotation(node: Object, print: NodePrinter) { - print.plain(node.elementType); +export function ArrayTypeAnnotation(node: Object) { + this.print(node.elementType, node); this.push("["); this.push("]"); } @@ -21,36 +20,36 @@ export function BooleanLiteralTypeAnnotation(node: Object) { this.push(node.value ? "true" : "false"); } -export function DeclareClass(node: Object, print: NodePrinter) { +export function DeclareClass(node: Object) { this.push("declare class "); - this._interfaceish(node, print); + this._interfaceish(node); } -export function DeclareFunction(node: Object, print: NodePrinter) { +export function DeclareFunction(node: Object) { this.push("declare function "); - print.plain(node.id); - print.plain(node.id.typeAnnotation.typeAnnotation); + this.print(node.id, node); + this.print(node.id.typeAnnotation.typeAnnotation, node); this.semicolon(); } -export function DeclareModule(node: Object, print: NodePrinter) { +export function DeclareModule(node: Object) { this.push("declare module "); - print.plain(node.id); + this.print(node.id, node); this.space(); - print.plain(node.body); + this.print(node.body, node); } -export function DeclareVariable(node: Object, print: NodePrinter) { - this.push("declare let "); - print.plain(node.id); - print.plain(node.id.typeAnnotation); +export function DeclareVariable(node: Object) { + this.push("declare var "); + this.print(node.id, node); + this.print(node.id.typeAnnotation, node); this.semicolon(); } -export function FunctionTypeAnnotation(node: Object, print: NodePrinter, parent: Object) { - print.plain(node.typeParameters); +export function FunctionTypeAnnotation(node: Object, parent: Object) { + this.print(node.typeParameters, node); this.push("("); - print.list(node.params); + this.printList(node.params, node); if (node.rest) { if (node.params.length) { @@ -58,7 +57,7 @@ export function FunctionTypeAnnotation(node: Object, print: NodePrinter, parent: this.space(); } this.push("..."); - print.plain(node.rest); + this.print(node.rest, node); } this.push(")"); @@ -72,51 +71,51 @@ export function FunctionTypeAnnotation(node: Object, print: NodePrinter, parent: } this.space(); - print.plain(node.returnType); + this.print(node.returnType, node); } -export function FunctionTypeParam(node: Object, print: NodePrinter) { - print.plain(node.name); +export function FunctionTypeParam(node: Object) { + this.print(node.name, node); if (node.optional) this.push("?"); this.push(":"); this.space(); - print.plain(node.typeAnnotation); + this.print(node.typeAnnotation, node); } -export function InterfaceExtends(node: Object, print: NodePrinter) { - print.plain(node.id); - print.plain(node.typeParameters); +export function InterfaceExtends(node: Object) { + this.print(node.id, node); + this.print(node.typeParameters, node); } export { InterfaceExtends as ClassImplements, InterfaceExtends as GenericTypeAnnotation }; -export function _interfaceish(node: Object, print: NodePrinter) { - print.plain(node.id); - print.plain(node.typeParameters); +export function _interfaceish(node: Object) { + this.print(node.id, node); + this.print(node.typeParameters, node); if (node.extends.length) { this.push(" extends "); - print.join(node.extends, { separator: ", " }); + this.printJoin(node.extends, node, { separator: ", " }); } this.space(); - print.plain(node.body); + this.print(node.body, node); } -export function InterfaceDeclaration(node: Object, print: NodePrinter) { +export function InterfaceDeclaration(node: Object) { this.push("interface "); - this._interfaceish(node, print); + this._interfaceish(node); } -export function IntersectionTypeAnnotation(node: Object, print: NodePrinter) { - print.join(node.types, { separator: " & " }); +export function IntersectionTypeAnnotation(node: Object) { + this.printJoin(node.types, node, { separator: " & " }); } export function MixedTypeAnnotation() { this.push("mixed"); } -export function NullableTypeAnnotation(node: Object, print: NodePrinter) { +export function NullableTypeAnnotation(node: Object) { this.push("?"); - print.plain(node.typeAnnotation); + this.print(node.typeAnnotation, node); } export { NumberLiteral as NumberLiteralTypeAnnotation } from "./types"; @@ -133,41 +132,41 @@ export function StringTypeAnnotation() { this.push("string"); } -export function TupleTypeAnnotation(node: Object, print: NodePrinter) { +export function TupleTypeAnnotation(node: Object) { this.push("["); - print.join(node.types, { separator: ", " }); + this.printJoin(node.types, node, { separator: ", " }); this.push("]"); } -export function TypeofTypeAnnotation(node: Object, print: NodePrinter) { +export function TypeofTypeAnnotation(node: Object) { this.push("typeof "); - print.plain(node.argument); + this.print(node.argument, node); } -export function TypeAlias(node: Object, print: NodePrinter) { +export function TypeAlias(node: Object) { this.push("type "); - print.plain(node.id); - print.plain(node.typeParameters); + this.print(node.id, node); + this.print(node.typeParameters, node); this.space(); this.push("="); this.space(); - print.plain(node.right); + this.print(node.right, node); this.semicolon(); } -export function TypeAnnotation(node: Object, print: NodePrinter) { +export function TypeAnnotation(node: Object) { this.push(":"); this.space(); if (node.optional) this.push("?"); - print.plain(node.typeAnnotation); + this.print(node.typeAnnotation, node); } -export function TypeParameterInstantiation(node: Object, print: NodePrinter) { +export function TypeParameterInstantiation(node: Object) { this.push("<"); - print.join(node.params, { + this.printJoin(node.params, node, { separator: ", ", - iterator(node: Object) { - print.plain(node.typeAnnotation); + iterator: (node: Object) => { + this.print(node.typeAnnotation, node); } }); this.push(">"); @@ -175,14 +174,14 @@ export function TypeParameterInstantiation(node: Object, print: NodePrinter) { export { TypeParameterInstantiation as TypeParameterDeclaration }; -export function ObjectTypeAnnotation(node: Object, print: NodePrinter) { +export function ObjectTypeAnnotation(node: Object) { this.push("{"); let props = node.properties.concat(node.callProperties, node.indexers); if (props.length) { this.space(); - print.list(props, { + this.printJoin(props, node, { separator: false, indent: true, iterator: () => { @@ -199,49 +198,49 @@ export function ObjectTypeAnnotation(node: Object, print: NodePrinter) { this.push("}"); } -export function ObjectTypeCallProperty(node: Object, print: NodePrinter) { +export function ObjectTypeCallProperty(node: Object) { if (node.static) this.push("static "); - print.plain(node.value); + this.print(node.value, node); } -export function ObjectTypeIndexer(node: Object, print: NodePrinter) { +export function ObjectTypeIndexer(node: Object) { if (node.static) this.push("static "); this.push("["); - print.plain(node.id); + this.print(node.id, node); this.push(":"); this.space(); - print.plain(node.key); + this.print(node.key, node); this.push("]"); this.push(":"); this.space(); - print.plain(node.value); + this.print(node.value, node); } -export function ObjectTypeProperty(node: Object, print: NodePrinter) { +export function ObjectTypeProperty(node: Object) { if (node.static) this.push("static "); - print.plain(node.key); + this.print(node.key, node); if (node.optional) this.push("?"); if (!t.isFunctionTypeAnnotation(node.value)) { this.push(":"); this.space(); } - print.plain(node.value); + this.print(node.value, node); } -export function QualifiedTypeIdentifier(node: Object, print: NodePrinter) { - print.plain(node.qualification); +export function QualifiedTypeIdentifier(node: Object) { + this.print(node.qualification, node); this.push("."); - print.plain(node.id); + this.print(node.id, node); } -export function UnionTypeAnnotation(node: Object, print: NodePrinter) { - print.join(node.types, { separator: " | " }); +export function UnionTypeAnnotation(node: Object) { + this.printJoin(node.types, node, { separator: " | " }); } -export function TypeCastExpression(node: Object, print: NodePrinter) { +export function TypeCastExpression(node: Object) { this.push("("); - print.plain(node.expression); - print.plain(node.typeAnnotation); + this.print(node.expression, node); + this.print(node.typeAnnotation, node); this.push(")"); } diff --git a/packages/babel-generator/src/generators/jsx.js b/packages/babel-generator/src/generators/jsx.js index 54b881ca46..310a26209f 100644 --- a/packages/babel-generator/src/generators/jsx.js +++ b/packages/babel-generator/src/generators/jsx.js @@ -1,12 +1,10 @@ /* @flow */ -import type NodePrinter from "../node/printer"; - -export function JSXAttribute(node: Object, print: NodePrinter) { - print.plain(node.name); +export function JSXAttribute(node: Object) { + this.print(node.name, node); if (node.value) { this.push("="); - print.plain(node.value); + this.print(node.value, node); } } @@ -14,27 +12,27 @@ export function JSXIdentifier(node: Object) { this.push(node.name); } -export function JSXNamespacedName(node: Object, print: NodePrinter) { - print.plain(node.namespace); +export function JSXNamespacedName(node: Object) { + this.print(node.namespace, node); this.push(":"); - print.plain(node.name); + this.print(node.name, node); } -export function JSXMemberExpression(node: Object, print: NodePrinter) { - print.plain(node.object); +export function JSXMemberExpression(node: Object) { + this.print(node.object, node); this.push("."); - print.plain(node.property); + this.print(node.property, node); } -export function JSXSpreadAttribute(node: Object, print: NodePrinter) { +export function JSXSpreadAttribute(node: Object) { this.push("{..."); - print.plain(node.argument); + this.print(node.argument, node); this.push("}"); } -export function JSXExpressionContainer(node: Object, print: NodePrinter) { +export function JSXExpressionContainer(node: Object) { this.push("{"); - print.plain(node.expression); + this.print(node.expression, node); this.push("}"); } @@ -42,33 +40,33 @@ export function JSXText(node: Object) { this.push(node.value, true); } -export function JSXElement(node: Object, print: NodePrinter) { +export function JSXElement(node: Object) { let open = node.openingElement; - print.plain(open); + this.print(open, node); if (open.selfClosing) return; this.indent(); for (let child of (node.children: Array)) { - print.plain(child); + this.print(child, node); } this.dedent(); - print.plain(node.closingElement); + this.print(node.closingElement, node); } -export function JSXOpeningElement(node: Object, print: NodePrinter) { +export function JSXOpeningElement(node: Object) { this.push("<"); - print.plain(node.name); + this.print(node.name, node); if (node.attributes.length > 0) { this.push(" "); - print.join(node.attributes, { separator: " " }); + this.printJoin(node.attributes, node, { separator: " " }); } this.push(node.selfClosing ? " />" : ">"); } -export function JSXClosingElement(node: Object, print: NodePrinter) { +export function JSXClosingElement(node: Object) { this.push(""); } diff --git a/packages/babel-generator/src/generators/methods.js b/packages/babel-generator/src/generators/methods.js index 65c23a6312..a78d7ce927 100644 --- a/packages/babel-generator/src/generators/methods.js +++ b/packages/babel-generator/src/generators/methods.js @@ -1,25 +1,24 @@ /* @flow */ -import type NodePrinter from "../node/printer"; import * as t from "babel-types"; -export function _params(node: Object, print: NodePrinter) { - print.plain(node.typeParameters); +export function _params(node: Object) { + this.print(node.typeParameters, node); this.push("("); - print.list(node.params, { + this.printList(node.params, node, { iterator: (node) =>{ if (node.optional) this.push("?"); - print.plain(node.typeAnnotation); + this.print(node.typeAnnotation, node); } }); this.push(")"); if (node.returnType) { - print.plain(node.returnType); + this.print(node.returnType, node); } } -export function _method(node: Object, print: NodePrinter) { +export function _method(node: Object) { let value = node.value; let kind = node.kind; let key = node.key; @@ -38,43 +37,43 @@ export function _method(node: Object, print: NodePrinter) { if (node.computed) { this.push("["); - print.plain(key); + this.print(key, node); this.push("]"); } else { - print.plain(key); + this.print(key, node); } - this._params(value, print); + this._params(value); this.space(); - print.plain(value.body); + this.print(value.body, value); } -export function FunctionExpression(node: Object, print: NodePrinter) { +export function FunctionExpression(node: Object) { if (node.async) this.push("async "); this.push("function"); if (node.generator) this.push("*"); if (node.id) { this.push(" "); - print.plain(node.id); + this.print(node.id, node); } else { this.space(); } - this._params(node, print); + this._params(node); this.space(); - print.plain(node.body); + this.print(node.body, node); } export { FunctionExpression as FunctionDeclaration }; -export function ArrowFunctionExpression(node: Object, print: NodePrinter) { +export function ArrowFunctionExpression(node: Object) { if (node.async) this.push("async "); if (node.params.length === 1 && t.isIdentifier(node.params[0])) { - print.plain(node.params[0]); + this.print(node.params[0], node); } else { - this._params(node, print); + this._params(node); } this.push(" => "); @@ -85,7 +84,7 @@ export function ArrowFunctionExpression(node: Object, print: NodePrinter) { this.push("("); } - print.plain(node.body); + this.print(node.body, node); if (bodyNeedsParens) { this.push(")"); diff --git a/packages/babel-generator/src/generators/modules.js b/packages/babel-generator/src/generators/modules.js index 7cd2106d50..860b720c87 100644 --- a/packages/babel-generator/src/generators/modules.js +++ b/packages/babel-generator/src/generators/modules.js @@ -1,62 +1,61 @@ /* @flow */ -import type NodePrinter from "../node/printer"; import * as t from "babel-types"; -export function ImportSpecifier(node: Object, print: NodePrinter) { - print.plain(node.imported); +export function ImportSpecifier(node: Object) { + this.print(node.imported, node); if (node.local && node.local.name !== node.imported.name) { this.push(" as "); - print.plain(node.local); + this.print(node.local, node); } } -export function ImportDefaultSpecifier(node: Object, print: NodePrinter) { - print.plain(node.local); +export function ImportDefaultSpecifier(node: Object) { + this.print(node.local, node); } -export function ExportDefaultSpecifier(node: Object, print: NodePrinter) { - print.plain(node.exported); +export function ExportDefaultSpecifier(node: Object) { + this.print(node.exported, node); } -export function ExportSpecifier(node: Object, print: NodePrinter) { - print.plain(node.local); +export function ExportSpecifier(node: Object) { + this.print(node.local, node); if (node.exported && node.local.name !== node.exported.name) { this.push(" as "); - print.plain(node.exported); + this.print(node.exported, node); } } -export function ExportNamespaceSpecifier(node: Object, print: NodePrinter) { +export function ExportNamespaceSpecifier(node: Object) { this.push("* as "); - print.plain(node.exported); + this.print(node.exported, node); } -export function ExportAllDeclaration(node: Object, print: NodePrinter) { +export function ExportAllDeclaration(node: Object) { this.push("export *"); if (node.exported) { this.push(" as "); - print.plain(node.exported); + this.print(node.exported, node); } this.push(" from "); - print.plain(node.source); + this.print(node.source, node); this.semicolon(); } -export function ExportNamedDeclaration(node: Object, print: NodePrinter) { +export function ExportNamedDeclaration() { this.push("export "); - ExportDeclaration.call(this, node, print); + ExportDeclaration.apply(this, arguments); } -export function ExportDefaultDeclaration(node: Object, print: NodePrinter) { +export function ExportDefaultDeclaration() { this.push("export default "); - ExportDeclaration.call(this, node, print); + ExportDeclaration.apply(this, arguments); } -function ExportDeclaration(node: Object, print: NodePrinter) { +function ExportDeclaration(node: Object) { if (node.declaration) { let declar = node.declaration; - print.plain(declar); + this.print(declar, node); if (t.isStatement(declar) || t.isFunction(declar) || t.isClass(declar)) return; } else { if (node.exportKind === "type") { @@ -69,7 +68,7 @@ function ExportDeclaration(node: Object, print: NodePrinter) { let hasSpecial = false; if (t.isExportDefaultSpecifier(first) || t.isExportNamespaceSpecifier(first)) { hasSpecial = true; - print.plain(specifiers.shift()); + this.print(specifiers.shift(), node); if (specifiers.length) { this.push(", "); } @@ -79,7 +78,7 @@ function ExportDeclaration(node: Object, print: NodePrinter) { this.push("{"); if (specifiers.length) { this.space(); - print.join(specifiers, { separator: ", " }); + this.printJoin(specifiers, node, { separator: ", " }); this.space(); } this.push("}"); @@ -87,14 +86,14 @@ function ExportDeclaration(node: Object, print: NodePrinter) { if (node.source) { this.push(" from "); - print.plain(node.source); + this.print(node.source, node); } } this.ensureSemicolon(); } -export function ImportDeclaration(node: Object, print: NodePrinter) { +export function ImportDeclaration(node: Object) { this.push("import "); if (node.importKind === "type" || node.importKind === "typeof") { @@ -105,7 +104,7 @@ export function ImportDeclaration(node: Object, print: NodePrinter) { if (specifiers && specifiers.length) { let first = specifiers[0]; if (t.isImportDefaultSpecifier(first) || t.isImportNamespaceSpecifier(first)) { - print.plain(specifiers.shift()); + this.print(specifiers.shift(), node); if (specifiers.length) { this.push(", "); } @@ -114,7 +113,7 @@ export function ImportDeclaration(node: Object, print: NodePrinter) { if (specifiers.length) { this.push("{"); this.space(); - print.join(specifiers, { separator: ", " }); + this.printJoin(specifiers, node, { separator: ", " }); this.space(); this.push("}"); } @@ -122,11 +121,11 @@ export function ImportDeclaration(node: Object, print: NodePrinter) { this.push(" from "); } - print.plain(node.source); + this.print(node.source, node); this.semicolon(); } -export function ImportNamespaceSpecifier(node: Object, print: NodePrinter) { +export function ImportNamespaceSpecifier(node: Object) { this.push("* as "); - print.plain(node.local); + this.print(node.local, node); } diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index 75ec354998..508a00ab59 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -1,97 +1,96 @@ /* @flow */ -import type NodePrinter from "../node/printer"; import repeating from "repeating"; import * as t from "babel-types"; -export function WithStatement(node: Object, print: NodePrinter) { +export function WithStatement(node: Object) { this.keyword("with"); this.push("("); - print.plain(node.object); + this.print(node.object, node); this.push(")"); - print.block(node.body); + this.printBlock(node); } -export function IfStatement(node: Object, print: NodePrinter) { +export function IfStatement(node: Object) { this.keyword("if"); this.push("("); - print.plain(node.test); + this.print(node.test, node); this.push(")"); this.space(); - print.indentOnComments(node.consequent); + this.printAndIndentOnComments(node.consequent, node); if (node.alternate) { if (this.isLast("}")) this.space(); this.push("else "); - print.indentOnComments(node.alternate); + this.printAndIndentOnComments(node.alternate, node); } } -export function ForStatement(node: Object, print: NodePrinter) { +export function ForStatement(node: Object) { this.keyword("for"); this.push("("); - print.plain(node.init); + this.print(node.init, node); this.push(";"); if (node.test) { this.space(); - print.plain(node.test); + this.print(node.test, node); } this.push(";"); if (node.update) { this.space(); - print.plain(node.update); + this.print(node.update, node); } this.push(")"); - print.block(node.body); + this.printBlock(node); } -export function WhileStatement(node: Object, print: NodePrinter) { +export function WhileStatement(node: Object) { this.keyword("while"); this.push("("); - print.plain(node.test); + this.print(node.test, node); this.push(")"); - print.block(node.body); + this.printBlock(node); } let buildForXStatement = function (op) { - return function (node: Object, print: NodePrinter) { + return function (node: Object) { this.keyword("for"); this.push("("); - print.plain(node.left); + this.print(node.left, node); this.push(` ${op} `); - print.plain(node.right); + this.print(node.right, node); this.push(")"); - print.block(node.body); + this.printBlock(node); }; }; export let ForInStatement = buildForXStatement("in"); export let ForOfStatement = buildForXStatement("of"); -export function DoWhileStatement(node: Object, print: NodePrinter) { +export function DoWhileStatement(node: Object) { this.push("do "); - print.plain(node.body); + this.print(node.body, node); this.space(); this.keyword("while"); this.push("("); - print.plain(node.test); + this.print(node.test, node); this.push(");"); } function buildLabelStatement(prefix, key = "label") { - return function (node: Object, print: NodePrinter) { + return function (node: Object) { this.push(prefix); let label = node[key]; if (label) { this.push(" "); let terminatorState = this.startTerminatorless(); - print.plain(label); + this.print(label, node); this.endTerminatorless(terminatorState); } @@ -104,50 +103,50 @@ export let ReturnStatement = buildLabelStatement("return", "argument"); export let BreakStatement = buildLabelStatement("break"); export let ThrowStatement = buildLabelStatement("throw", "argument"); -export function LabeledStatement(node: Object, print: NodePrinter) { - print.plain(node.label); +export function LabeledStatement(node: Object) { + this.print(node.label, node); this.push(": "); - print.plain(node.body); + this.print(node.body, node); } -export function TryStatement(node: Object, print: NodePrinter) { +export function TryStatement(node: Object) { this.keyword("try"); - print.plain(node.block); + this.print(node.block, node); this.space(); // Esprima bug puts the catch clause in a `handlers` array. // see https://code.google.com/p/esprima/issues/detail?id=433 // We run into this from regenerator generated ast. if (node.handlers) { - print.plain(node.handlers[0]); + this.print(node.handlers[0], node); } else { - print.plain(node.handler); + this.print(node.handler, node); } if (node.finalizer) { this.space(); this.push("finally "); - print.plain(node.finalizer); + this.print(node.finalizer, node); } } -export function CatchClause(node: Object, print: NodePrinter) { +export function CatchClause(node: Object) { this.keyword("catch"); this.push("("); - print.plain(node.param); + this.print(node.param, node); this.push(") "); - print.plain(node.body); + this.print(node.body, node); } -export function SwitchStatement(node: Object, print: NodePrinter) { +export function SwitchStatement(node: Object) { this.keyword("switch"); this.push("("); - print.plain(node.discriminant); + this.print(node.discriminant, node); this.push(")"); this.space(); this.push("{"); - print.sequence(node.cases, { + this.printSequence(node.cases, node, { indent: true, addNewlines(leading, cas) { if (!leading && node.cases[node.cases.length - 1] === cas) return -1; @@ -157,10 +156,10 @@ export function SwitchStatement(node: Object, print: NodePrinter) { this.push("}"); } -export function SwitchCase(node: Object, print: NodePrinter) { +export function SwitchCase(node: Object) { if (node.test) { this.push("case "); - print.plain(node.test); + this.print(node.test, node); this.push(":"); } else { this.push("default:"); @@ -168,7 +167,7 @@ export function SwitchCase(node: Object, print: NodePrinter) { if (node.consequent.length) { this.newline(); - print.sequence(node.consequent, { indent: true }); + this.printSequence(node.consequent, node, { indent: true }); } } @@ -176,7 +175,7 @@ export function DebuggerStatement() { this.push("debugger;"); } -export function VariableDeclaration(node: Object, print: NodePrinter, parent: Object) { +export function VariableDeclaration(node: Object, parent: Object) { this.push(node.kind + " "); let hasInits = false; @@ -209,7 +208,7 @@ export function VariableDeclaration(node: Object, print: NodePrinter, parent: Ob // - print.list(node.declarations, { separator: sep }); + this.printList(node.declarations, node, { separator: sep }); if (t.isFor(parent)) { // don't give semicolons to these nodes since they'll be inserted in the parent generator @@ -219,13 +218,13 @@ export function VariableDeclaration(node: Object, print: NodePrinter, parent: Ob this.semicolon(); } -export function VariableDeclarator(node: Object, print: NodePrinter) { - print.plain(node.id); - print.plain(node.id.typeAnnotation); +export function VariableDeclarator(node: Object) { + this.print(node.id, node); + this.print(node.id.typeAnnotation, node); if (node.init) { this.space(); this.push("="); this.space(); - print.plain(node.init); + this.print(node.init, node); } } diff --git a/packages/babel-generator/src/generators/template-literals.js b/packages/babel-generator/src/generators/template-literals.js index d10f0d461e..ed644eedb0 100644 --- a/packages/babel-generator/src/generators/template-literals.js +++ b/packages/babel-generator/src/generators/template-literals.js @@ -1,28 +1,25 @@ /* @flow */ -import type NodePrinter from "../node/printer"; - -export function TaggedTemplateExpression(node: Object, print: NodePrinter) { - print.plain(node.tag); - print.plain(node.quasi); +export function TaggedTemplateExpression(node: Object) { + this.print(node.tag, node); + this.print(node.quasi, node); } export function TemplateElement(node: Object) { this._push(node.value.raw); } -export function TemplateLiteral(node: Object, print: NodePrinter) { +export function TemplateLiteral(node: Object) { this.push("`"); let quasis = node.quasis; - let len = quasis.length; - for (let i = 0; i < len; i++) { - print.plain(quasis[i]); + for (let i = 0; i < quasis.length; i++) { + this.print(quasis[i], node); - if (i + 1 < len) { + if (i + 1 < quasis.length) { this.push("${ "); - print.plain(node.expressions[i]); + this.print(node.expressions[i], node); this.push(" }"); } } diff --git a/packages/babel-generator/src/generators/types.js b/packages/babel-generator/src/generators/types.js index 4310509baa..a4c6881e07 100644 --- a/packages/babel-generator/src/generators/types.js +++ b/packages/babel-generator/src/generators/types.js @@ -2,29 +2,32 @@ /* eslint quotes: 0 */ -import type NodePrinter from "../node/printer"; import * as t from "babel-types"; export function Identifier(node: Object) { this.push(node.name); } -export function RestElement(node: Object, print: NodePrinter) { +export function RestElement(node: Object) { this.push("..."); - print.plain(node.argument); + this.print(node.argument, node); } -export { RestElement as SpreadElement, RestElement as SpreadProperty }; +export { + RestElement as SpreadElement, + RestElement as SpreadProperty, + RestElement as RestProperty, +}; -export function ObjectExpression(node: Object, print: NodePrinter) { +export function ObjectExpression(node: Object) { let props = node.properties; this.push("{"); - print.printInnerComments(); + this.printInnerComments(node); if (props.length) { this.space(); - print.list(props, { indent: true }); + this.printList(props, node, { indent: true }); this.space(); } @@ -33,24 +36,24 @@ export function ObjectExpression(node: Object, print: NodePrinter) { export { ObjectExpression as ObjectPattern }; -export function Property(node: Object, print: NodePrinter) { - print.list(node.decorators, { separator: "" }); +export function Property(node: Object) { + this.printJoin(node.decorators, node, { separator: "" }); if (node.method || node.kind === "get" || node.kind === "set") { - this._method(node, print); + this._method(node); } else { if (node.computed) { this.push("["); - print.plain(node.key); + this.print(node.key, node); this.push("]"); } else { // print `({ foo: foo = 5 } = {})` as `({ foo = 5 } = {});` if (t.isAssignmentPattern(node.value) && t.isIdentifier(node.key) && node.key.name === node.value.left.name) { - print.plain(node.value); + this.print(node.value, node); return; } - print.plain(node.key); + this.print(node.key, node); // shorthand! if (node.shorthand && @@ -63,22 +66,22 @@ export function Property(node: Object, print: NodePrinter) { this.push(":"); this.space(); - print.plain(node.value); + this.print(node.value, node); } } -export function ArrayExpression(node: Object, print: NodePrinter) { +export function ArrayExpression(node: Object) { let elems = node.elements; let len = elems.length; this.push("["); - print.printInnerComments(); + this.printInnerComments(node); for (let i = 0; i < elems.length; i++) { let elem = elems[i]; if (elem) { if (i > 0) this.space(); - print.plain(elem); + this.print(elem, node); if (i < len - 1) this.push(","); } else { // If the array expression ends with a hole, that hole diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index d6b14dbf0e..a9a9a1783f 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -2,36 +2,37 @@ import detectIndent from "detect-indent"; import Whitespace from "./whitespace"; -import NodePrinter from "./node/printer"; -import repeating from "repeating"; import SourceMap from "./source-map"; import Position from "./position"; import * as messages from "babel-messages"; -import Buffer from "./buffer"; -import extend from "lodash/object/extend"; -import each from "lodash/collection/each"; -import n from "./node"; -import * as t from "babel-types"; +import Printer from "./printer"; /** * Babel's code generator, turns an ast into code, maintaining sourcemaps, * user preferences, and valid output. */ -class CodeGenerator { +export class CodeGenerator extends Printer { constructor(ast, opts, code) { opts = opts || {}; - this.comments = ast.comments || []; - this.tokens = ast.tokens || []; - this.format = CodeGenerator.normalizeOptions(code, opts, this.tokens); + let comments = ast.comments || []; + let tokens = ast.tokens || []; + let format = CodeGenerator.normalizeOptions(code, opts, tokens); + + let position = new Position; + + super(position, format); + + this.comments = comments; + this.position = position; + this.tokens = tokens; + this.format = format; this.opts = opts; this.ast = ast; - this.whitespace = new Whitespace(this.tokens); - this.position = new Position; - this.map = new SourceMap(this.position, opts, code); - this.buffer = new Buffer(this.position, this.format); + this.whitespace = new Whitespace(tokens); + this.map = new SourceMap(position, opts, code); } format: { @@ -51,7 +52,6 @@ class CodeGenerator { whitespace: Whitespace; position: Position; map: SourceMap; - buffer: Buffer; comments: Array; tokens: Array; opts: Object; @@ -143,272 +143,11 @@ class CodeGenerator { return { map: this.map.get(), - code: this.buffer.get() + code: this.get() }; } - - /** - * Build NodePrinter. - */ - - buildPrint(parent) { - return new NodePrinter(this, parent); - } - - catchUp(node) { - // catch up to this nodes newline if we're behind - if (node.loc && this.format.retainLines && this.buffer.buf) { - while (this.position.line < node.loc.start.line) { - this._push("\n"); - } - } - } - - _printNewline(leading, node, parent, opts) { - if (!opts.statement && !n.isUserWhitespacable(node, parent)) { - return; - } - - let lines = 0; - - if (node.start != null && !node._ignoreUserWhitespace) { - // user node - if (leading) { - lines = this.whitespace.getNewlinesBefore(node); - } else { - lines = this.whitespace.getNewlinesAfter(node); - } - } else { - // generated node - if (!leading) lines++; // always include at least a single line after - if (opts.addNewlines) lines += opts.addNewlines(leading, node) || 0; - - let needs = n.needsWhitespaceAfter; - if (leading) needs = n.needsWhitespaceBefore; - if (needs(node, parent)) lines++; - - // generated nodes can't add starting file whitespace - if (!this.buffer.buf) lines = 0; - } - - this.newline(lines); - } - - print(node, parent, opts = {}) { - if (!node) return; - - if (parent && parent._compact) { - node._compact = true; - } - - let oldConcise = this.format.concise; - if (node._compact) { - this.format.concise = true; - } - - if (!this[node.type]) { - throw new ReferenceError(`unknown node of type ${JSON.stringify(node.type)} with constructor ${JSON.stringify(node && node.constructor.name)}`); - } - - let needsParens = n.needsParens(node, parent); - if (needsParens) this.push("("); - - this.printLeadingComments(node, parent); - - this.catchUp(node); - - this._printNewline(true, node, parent, opts); - - if (opts.before) opts.before(); - this.map.mark(node, "start"); - - this[node.type](node, this.buildPrint(node), parent); - - if (needsParens) this.push(")"); - - this.map.mark(node, "end"); - if (opts.after) opts.after(); - - this.format.concise = oldConcise; - - this._printNewline(false, node, parent, opts); - - this.printTrailingComments(node, parent); - } - - printJoin(print, nodes: ?Array, opts = {}) { - if (!nodes || !nodes.length) return; - - let len = nodes.length; - let node, i; - - if (opts.indent) this.indent(); - - let printOpts = { - statement: opts.statement, - addNewlines: opts.addNewlines, - after: () => { - if (opts.iterator) { - opts.iterator(node, i); - } - - if (opts.separator && i < len - 1) { - this.push(opts.separator); - } - } - }; - - for (i = 0; i < nodes.length; i++) { - node = nodes[i]; - print.plain(node, printOpts); - } - - if (opts.indent) this.dedent(); - } - - printAndIndentOnComments(print, node) { - let indent = !!node.leadingComments; - if (indent) this.indent(); - print.plain(node); - if (indent) this.dedent(); - } - - printBlock(print, node) { - if (t.isEmptyStatement(node)) { - this.semicolon(); - } else { - this.push(" "); - print.plain(node); - } - } - - generateComment(comment) { - let val = comment.value; - if (comment.type === "CommentLine") { - val = `//${val}`; - } else { - val = `/*${val}*/`; - } - return val; - } - - printTrailingComments(node, parent) { - this._printComments(this.getComments("trailingComments", node, parent)); - } - - printLeadingComments(node, parent) { - this._printComments(this.getComments("leadingComments", node, parent)); - } - - getComments(key, node, parent) { - if (t.isExpressionStatement(parent)) { - return []; - } - - let comments = []; - let nodes: Array = [node]; - - if (t.isExpressionStatement(node)) { - nodes.push(node.argument); - } - - for (let node of nodes) { - comments = comments.concat(this._getComments(key, node)); - } - - return comments; - } - - _getComments(key, node) { - return (node && node[key]) || []; - } - - shouldPrintComment(comment) { - if (this.format.shouldPrintComment) { - return this.format.shouldPrintComment(comment.value); - } else { - if (comment.value.indexOf("@license") >= 0 || comment.value.indexOf("@preserve") >= 0) { - return true; - } else { - return this.format.comments; - } - } - } - - _printComments(comments) { - if (!comments || !comments.length) return; - - for (let comment of (comments: Array)) { - if (!this.shouldPrintComment(comment)) continue; - if (comment._displayed) continue; - comment._displayed = true; - - this.catchUp(comment); - - // whitespace before - this.newline(this.whitespace.getNewlinesBefore(comment)); - - let column = this.position.column; - let val = this.generateComment(comment); - - if (column && !this.isLast(["\n", " ", "[", "{"])) { - this._push(" "); - column++; - } - - // - if (comment.type === "CommentBlock" && this.format.indent.adjustMultilineComment) { - let offset = comment.loc && comment.loc.start.column; - if (offset) { - let newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g"); - val = val.replace(newlineRegex, "\n"); - } - - let indent = Math.max(this.indentSize(), column); - val = val.replace(/\n/g, `\n${repeating(" ", indent)}`); - } - - if (column === 0) { - val = this.getIndent() + val; - } - - // force a newline for line comments when retainLines is set in case the next printed node - // doesn't catch up - if ((this.format.compact || this.format.retainLines) && comment.type === "CommentLine") { - val += "\n"; - } - - // - this._push(val); - - // whitespace after - this.newline(this.whitespace.getNewlinesAfter(comment)); - } - } } -each(Buffer.prototype, function (fn, key) { - CodeGenerator.prototype[key] = function () { - return fn.apply(this.buffer, arguments); - }; -}); - -each([ - require("./generators/template-literals"), - require("./generators/comprehensions"), - require("./generators/expressions"), - require("./generators/statements"), - require("./generators/classes"), - require("./generators/methods"), - require("./generators/modules"), - require("./generators/types"), - require("./generators/flow"), - require("./generators/base"), - require("./generators/jsx") -], function (generator) { - extend(CodeGenerator.prototype, generator); -}); - export default function (ast: Object, opts: Object, code: string): Object { let gen = new CodeGenerator(ast, opts, code); return gen.generate(); diff --git a/packages/babel-generator/src/node/printer.js b/packages/babel-generator/src/node/printer.js deleted file mode 100644 index f672d167df..0000000000 --- a/packages/babel-generator/src/node/printer.js +++ /dev/null @@ -1,78 +0,0 @@ -/* @flow */ - -/** - * Printer for nodes, needs a `generator` and a `parent`. - */ - -export default class NodePrinter { - constructor(generator, parent) { - this.generator = generator; - this.parent = parent; - } - - /** - * Description - */ - - printInnerComments() { - if (!this.parent.innerComments) return; - let gen = this.generator; - gen.indent(); - gen._printComments(this.parent.innerComments); - gen.dedent(); - } - - /** - * Print a plain node. - */ - - plain(node, opts) { - return this.generator.print(node, this.parent, opts); - } - - /** - * Print a sequence of nodes as statements. - */ - - sequence(nodes, opts = {}) { - opts.statement = true; - return this.generator.printJoin(this, nodes, opts); - } - - /** - * Print a sequence of nodes as expressions. - */ - - join(nodes, opts) { - return this.generator.printJoin(this, nodes, opts); - } - - /** - * Print a list of nodes, with a customizable separator (defaults to ","). - */ - - list(items, opts = {}) { - if (opts.separator == null) { - opts.separator = ","; - if (!this.generator.format.compact) opts.separator += " "; - } - - return this.join(items, opts); - } - - /** - * Print a block-like node. - */ - - block(node) { - return this.generator.printBlock(this, node); - } - - /** - * Print node and indent comments. - */ - - indentOnComments(node) { - return this.generator.printAndIndentOnComments(this, node); - } -} diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js new file mode 100644 index 0000000000..949d1dc3eb --- /dev/null +++ b/packages/babel-generator/src/printer.js @@ -0,0 +1,280 @@ +/* @flow */ + +import repeating from "repeating"; +import Buffer from "./buffer"; +import n from "./node"; +import * as t from "babel-types"; + +export default class Printer extends Buffer { + print(node, parent, opts = {}) { + if (!node) return; + + if (parent && parent._compact) { + node._compact = true; + } + + let oldConcise = this.format.concise; + if (node._compact) { + this.format.concise = true; + } + + let printMethod = this[node.type]; + if (!printMethod) { + throw new ReferenceError(`unknown node of type ${JSON.stringify(node.type)} with constructor ${JSON.stringify(node && node.constructor.name)}`); + } + + let needsParens = n.needsParens(node, parent); + if (needsParens) this.push("("); + + this.printLeadingComments(node, parent); + + this.catchUp(node); + + this._printNewline(true, node, parent, opts); + + if (opts.before) opts.before(); + this.map.mark(node, "start"); + + // + this._print(node, parent); + + if (needsParens) this.push(")"); + + this.map.mark(node, "end"); + if (opts.after) opts.after(); + + this.format.concise = oldConcise; + + this._printNewline(false, node, parent, opts); + + this.printTrailingComments(node, parent); + } + + _print(node, parent) { + let extra = node.extra; + if (extra && extra.raw != null && extra.rawValue != null && node.value === extra.rawValue) { + this.push(""); + this._push(extra.raw); + } else { + let printMethod = this[node.type]; + printMethod.call(this, node, parent); + } + } + + printJoin(nodes: ?Array, parent: Object, opts = {}) { + if (!nodes || !nodes.length) return; + + let len = nodes.length; + let node, i; + + if (opts.indent) this.indent(); + + let printOpts = { + statement: opts.statement, + addNewlines: opts.addNewlines, + after: () => { + if (opts.iterator) { + opts.iterator(node, i); + } + + if (opts.separator && i < len - 1) { + this.push(opts.separator); + } + } + }; + + for (i = 0; i < nodes.length; i++) { + node = nodes[i]; + this.print(node, parent, printOpts); + } + + if (opts.indent) this.dedent(); + } + + printAndIndentOnComments(node, parent) { + let indent = !!node.leadingComments; + if (indent) this.indent(); + this.print(node, parent); + if (indent) this.dedent(); + } + + printBlock(parent) { + let node = parent.body; + if (t.isEmptyStatement(node)) { + this.semicolon(); + } else { + this.push(" "); + this.print(node, parent); + } + } + + generateComment(comment) { + let val = comment.value; + if (comment.type === "CommentLine") { + val = `//${val}`; + } else { + val = `/*${val}*/`; + } + return val; + } + + printTrailingComments(node, parent) { + this._printComments(this.getComments("trailingComments", node, parent)); + } + + printLeadingComments(node, parent) { + this._printComments(this.getComments("leadingComments", node, parent)); + } + + printInnerComments(node, indent = true) { + if (!node.innerComments) return; + if (indent) this.indent(); + this._printComments(node.innerComments); + if (indent) this.dedent(); + } + + printSequence(nodes, parent, opts = {}) { + opts.statement = true; + return this.printJoin(nodes, parent, opts); + } + + printList(items, parent, opts = {}) { + if (opts.separator == null) { + opts.separator = ","; + if (!this.format.compact) opts.separator += " "; + } + + return this.printJoin(items, parent, opts); + } + + _printNewline(leading, node, parent, opts) { + if (!opts.statement && !n.isUserWhitespacable(node, parent)) { + return; + } + + let lines = 0; + + if (node.start != null && !node._ignoreUserWhitespace) { + // user node + if (leading) { + lines = this.whitespace.getNewlinesBefore(node); + } else { + lines = this.whitespace.getNewlinesAfter(node); + } + } else { + // generated node + if (!leading) lines++; // always include at least a single line after + if (opts.addNewlines) lines += opts.addNewlines(leading, node) || 0; + + let needs = n.needsWhitespaceAfter; + if (leading) needs = n.needsWhitespaceBefore; + if (needs(node, parent)) lines++; + + // generated nodes can't add starting file whitespace + if (!this.buf) lines = 0; + } + + this.newline(lines); + } + + getComments(key, node, parent) { + if (t.isExpressionStatement(parent)) { + return []; + } + + let comments = []; + let nodes: Array = [node]; + + if (t.isExpressionStatement(node)) { + nodes.push(node.argument); + } + + for (let node of nodes) { + comments = comments.concat(this._getComments(key, node)); + } + + return comments; + } + + _getComments(key, node) { + return (node && node[key]) || []; + } + + shouldPrintComment(comment) { + if (this.format.shouldPrintComment) { + return this.format.shouldPrintComment(comment.value); + } else { + if (comment.value.indexOf("@license") >= 0 || comment.value.indexOf("@preserve") >= 0) { + return true; + } else { + return this.format.comments; + } + } + } + + _printComments(comments) { + if (!comments || !comments.length) return; + + for (let comment of (comments: Array)) { + if (!this.shouldPrintComment(comment)) continue; + if (comment._displayed) continue; + comment._displayed = true; + + this.catchUp(comment); + + // whitespace before + this.newline(this.whitespace.getNewlinesBefore(comment)); + + let column = this.position.column; + let val = this.generateComment(comment); + + if (column && !this.isLast(["\n", " ", "[", "{"])) { + this._push(" "); + column++; + } + + // + if (comment.type === "CommentBlock" && this.format.indent.adjustMultilineComment) { + let offset = comment.loc && comment.loc.start.column; + if (offset) { + let newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g"); + val = val.replace(newlineRegex, "\n"); + } + + let indent = Math.max(this.indentSize(), column); + val = val.replace(/\n/g, `\n${repeating(" ", indent)}`); + } + + if (column === 0) { + val = this.getIndent() + val; + } + + // force a newline for line comments when retainLines is set in case the next printed node + // doesn't catch up + if ((this.format.compact || this.format.retainLines) && comment.type === "CommentLine") { + val += "\n"; + } + + // + this._push(val); + + // whitespace after + this.newline(this.whitespace.getNewlinesAfter(comment)); + } + } +} + +for (let generator of [ + require("./generators/template-literals"), + require("./generators/expressions"), + require("./generators/statements"), + require("./generators/classes"), + require("./generators/methods"), + require("./generators/modules"), + require("./generators/types"), + require("./generators/flow"), + require("./generators/base"), + require("./generators/jsx") +]) { + Object.assign(Printer.prototype, generator); +} diff --git a/packages/babel-generator/test/fixtures/auto-indentation/hard-tab/actual.js b/packages/babel-generator/test/fixtures/auto-indentation/hard-tab/actual.js new file mode 100644 index 0000000000..2beaed5903 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-indentation/hard-tab/actual.js @@ -0,0 +1,6 @@ +function foo() { + bar(); + if (foo) { + bar(); + } +} diff --git a/packages/babel-generator/test/fixtures/auto-indentation/hard-tab/expected.js b/packages/babel-generator/test/fixtures/auto-indentation/hard-tab/expected.js new file mode 100644 index 0000000000..2beaed5903 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-indentation/hard-tab/expected.js @@ -0,0 +1,6 @@ +function foo() { + bar(); + if (foo) { + bar(); + } +} diff --git a/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-2/actual.js b/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-2/actual.js new file mode 100644 index 0000000000..017db5a0f8 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-2/actual.js @@ -0,0 +1,6 @@ +function foo() { + bar(); + if (foo) { + bar(); + } +} diff --git a/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-2/expected.js b/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-2/expected.js new file mode 100644 index 0000000000..017db5a0f8 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-2/expected.js @@ -0,0 +1,6 @@ +function foo() { + bar(); + if (foo) { + bar(); + } +} diff --git a/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-4/actual.js b/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-4/actual.js new file mode 100644 index 0000000000..9f080a2650 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-4/actual.js @@ -0,0 +1,6 @@ +function foo() { + bar(); + if (foo) { + bar(); + } +} diff --git a/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-4/expected.js b/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-4/expected.js new file mode 100644 index 0000000000..9f080a2650 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-indentation/soft-tab-4/expected.js @@ -0,0 +1,6 @@ +function foo() { + bar(); + if (foo) { + bar(); + } +} diff --git a/packages/babel-generator/test/fixtures/auto-string/double/actual.js b/packages/babel-generator/test/fixtures/auto-string/double/actual.js new file mode 100644 index 0000000000..5a8fcf7e29 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-string/double/actual.js @@ -0,0 +1,4 @@ +foo("foo"); +foo("foo\nlol"); +foo("foo\n\"lol"); +foo("foo\n\"'lol"); diff --git a/packages/babel-generator/test/fixtures/auto-string/double/expected.js b/packages/babel-generator/test/fixtures/auto-string/double/expected.js new file mode 100644 index 0000000000..5a8fcf7e29 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-string/double/expected.js @@ -0,0 +1,4 @@ +foo("foo"); +foo("foo\nlol"); +foo("foo\n\"lol"); +foo("foo\n\"'lol"); diff --git a/packages/babel-generator/test/fixtures/auto-string/single/actual.js b/packages/babel-generator/test/fixtures/auto-string/single/actual.js new file mode 100644 index 0000000000..1d8e7531c9 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-string/single/actual.js @@ -0,0 +1,4 @@ +foo('foo'); +foo('foo\nlol'); +foo('foo\n"lol'); +foo('foo\n"\'lol'); diff --git a/packages/babel-generator/test/fixtures/auto-string/single/expected.js b/packages/babel-generator/test/fixtures/auto-string/single/expected.js new file mode 100644 index 0000000000..1d8e7531c9 --- /dev/null +++ b/packages/babel-generator/test/fixtures/auto-string/single/expected.js @@ -0,0 +1,4 @@ +foo('foo'); +foo('foo\nlol'); +foo('foo\n"lol'); +foo('foo\n"\'lol'); diff --git a/packages/babel-generator/test/fixtures/comments/2-space-multi-comment-with-space/actual.js b/packages/babel-generator/test/fixtures/comments/2-space-multi-comment-with-space/actual.js new file mode 100644 index 0000000000..aa61a9c8fe --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/2-space-multi-comment-with-space/actual.js @@ -0,0 +1,10 @@ +function test() { + + + /* + * this is comment + */ + + + var i = 20; +} diff --git a/packages/babel-generator/test/fixtures/comments/2-space-multi-comment-with-space/expected.js b/packages/babel-generator/test/fixtures/comments/2-space-multi-comment-with-space/expected.js new file mode 100644 index 0000000000..62aee76944 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/2-space-multi-comment-with-space/expected.js @@ -0,0 +1,8 @@ +function test() { + + /* + * this is comment + */ + + var i = 20; +} diff --git a/packages/babel-generator/test/fixtures/comments/2-space-multi-comment/actual.js b/packages/babel-generator/test/fixtures/comments/2-space-multi-comment/actual.js new file mode 100644 index 0000000000..1cacd84afd --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/2-space-multi-comment/actual.js @@ -0,0 +1,6 @@ +function test() { + /* + * this is comment + */ + var i = 20; +} diff --git a/packages/babel-generator/test/fixtures/comments/2-space-multi-comment/expected.js b/packages/babel-generator/test/fixtures/comments/2-space-multi-comment/expected.js new file mode 100644 index 0000000000..1cacd84afd --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/2-space-multi-comment/expected.js @@ -0,0 +1,6 @@ +function test() { + /* + * this is comment + */ + var i = 20; +} diff --git a/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/actual.js b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/actual.js new file mode 100644 index 0000000000..5c85ac0e06 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/actual.js @@ -0,0 +1,4 @@ +{ + print("hello"); + // comment +} diff --git a/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/expected.js b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/expected.js new file mode 100644 index 0000000000..5c85ac0e06 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/expected.js @@ -0,0 +1,4 @@ +{ + print("hello"); + // comment +} diff --git a/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/options.json b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/options.json new file mode 100644 index 0000000000..97925bbcb6 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-retainlines-option/options.json @@ -0,0 +1,3 @@ +{ + "retainLines": true +} diff --git a/packages/babel-generator/test/fixtures/comments/block-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/block-line-comment/actual.js new file mode 100644 index 0000000000..ddc9499b49 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/block-line-comment/actual.js @@ -0,0 +1,4 @@ +// Leading to block +{ + print("hello"); +} diff --git a/packages/babel-generator/test/fixtures/comments/block-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/block-line-comment/expected.js new file mode 100644 index 0000000000..ddc9499b49 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/block-line-comment/expected.js @@ -0,0 +1,4 @@ +// Leading to block +{ + print("hello"); +} diff --git a/packages/babel-generator/test/fixtures/comments/comment-only-with-space/actual.js b/packages/babel-generator/test/fixtures/comments/comment-only-with-space/actual.js new file mode 100644 index 0000000000..befcf38bfa --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/comment-only-with-space/actual.js @@ -0,0 +1,7 @@ + +// from #23 + +/**/ + +/* +*/ diff --git a/packages/babel-generator/test/fixtures/comments/comment-only-with-space/expected.js b/packages/babel-generator/test/fixtures/comments/comment-only-with-space/expected.js new file mode 100644 index 0000000000..befcf38bfa --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/comment-only-with-space/expected.js @@ -0,0 +1,7 @@ + +// from #23 + +/**/ + +/* +*/ diff --git a/packages/babel-generator/test/fixtures/comments/comment-only/actual.js b/packages/babel-generator/test/fixtures/comments/comment-only/actual.js new file mode 100644 index 0000000000..acfb1b9a7b --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/comment-only/actual.js @@ -0,0 +1,4 @@ +// from #23 +/**/ +/* +*/ diff --git a/packages/babel-generator/test/fixtures/comments/comment-only/expected.js b/packages/babel-generator/test/fixtures/comments/comment-only/expected.js new file mode 100644 index 0000000000..acfb1b9a7b --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/comment-only/expected.js @@ -0,0 +1,4 @@ +// from #23 +/**/ +/* +*/ diff --git a/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/actual.js b/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/actual.js new file mode 100644 index 0000000000..7f2608b525 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/actual.js @@ -0,0 +1,5 @@ +// comment +print("hello"); + +// comment2 +print("hello2"); diff --git a/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/expected.js b/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/expected.js new file mode 100644 index 0000000000..7f2608b525 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/expected.js @@ -0,0 +1,5 @@ +// comment +print("hello"); + +// comment2 +print("hello2"); diff --git a/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/options.json b/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/options.json new file mode 100644 index 0000000000..97925bbcb6 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/comment-statement-with-retainlines-option/options.json @@ -0,0 +1,3 @@ +{ + "retainLines": true +} diff --git a/packages/babel-generator/test/fixtures/comments/computed-property-comments-2/actual.js b/packages/babel-generator/test/fixtures/comments/computed-property-comments-2/actual.js new file mode 100644 index 0000000000..0c0c0272a5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/computed-property-comments-2/actual.js @@ -0,0 +1,10 @@ +var test = { + /** + * Before bracket init + */ + ["a"]:"1", + [/* + * Inside bracket init + */ + "b"]:"2" + }, ok = 42; diff --git a/packages/babel-generator/test/fixtures/comments/computed-property-comments-2/expected.js b/packages/babel-generator/test/fixtures/comments/computed-property-comments-2/expected.js new file mode 100644 index 0000000000..1ad3a0f35f --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/computed-property-comments-2/expected.js @@ -0,0 +1,11 @@ +var test = { + /** + * Before bracket init + */ + ["a"]: "1", + [/* + * Inside bracket init + */ + "b"]: "2" +}, + ok = 42; diff --git a/packages/babel-generator/test/fixtures/comments/computed-property-comments/actual.js b/packages/babel-generator/test/fixtures/comments/computed-property-comments/actual.js new file mode 100644 index 0000000000..0c7aae7d18 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/computed-property-comments/actual.js @@ -0,0 +1,28 @@ +var test = { + /** + * Before bracket init + */ + ["a"]:"1", + + [/* + * Inside bracket init + */ + "b"]:"2", + + ["c" + /* + * After bracket key + */]:"3", + + // Before bracket, line comment + [ + "d"]:"4", + + [ + // Inside bracket, line comment + "e"]:"5", + + ["f" + // After bracket, line comment + ]:"6" +}; diff --git a/packages/babel-generator/test/fixtures/comments/computed-property-comments/expected.js b/packages/babel-generator/test/fixtures/comments/computed-property-comments/expected.js new file mode 100644 index 0000000000..c6ffd441f8 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/computed-property-comments/expected.js @@ -0,0 +1,27 @@ +var test = { + /** + * Before bracket init + */ + ["a"]: "1", + + [/* + * Inside bracket init + */ + "b"]: "2", + + ["c" + /* + * After bracket key + */]: "3", + + // Before bracket, line comment + ["d"]: "4", + + [ + // Inside bracket, line comment + "e"]: "5", + + ["f" + // After bracket, line comment + ]: "6" +}; diff --git a/packages/babel-generator/test/fixtures/comments/do-while-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/do-while-line-comment/actual.js new file mode 100644 index 0000000000..760ae4934e --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/do-while-line-comment/actual.js @@ -0,0 +1,3 @@ +do { +} // LINE +while (true); diff --git a/packages/babel-generator/test/fixtures/comments/do-while-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/do-while-line-comment/expected.js new file mode 100644 index 0000000000..dbcec4152a --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/do-while-line-comment/expected.js @@ -0,0 +1,2 @@ +do {} // LINE +while (true); diff --git a/packages/babel-generator/test/fixtures/comments/empty-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/empty-line-comment/actual.js new file mode 100644 index 0000000000..ea9f2a7244 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/empty-line-comment/actual.js @@ -0,0 +1,4 @@ +function test() { +// Leading to EmptyStatement +; // Trailing to EmptyStatement +} diff --git a/packages/babel-generator/test/fixtures/comments/empty-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/empty-line-comment/expected.js new file mode 100644 index 0000000000..118cbc17a2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/empty-line-comment/expected.js @@ -0,0 +1,4 @@ +function test() { + // Leading to EmptyStatement + ; // Trailing to EmptyStatement +} diff --git a/packages/babel-generator/test/fixtures/comments/empty/actual.js b/packages/babel-generator/test/fixtures/comments/empty/actual.js new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/empty/actual.js @@ -0,0 +1 @@ + diff --git a/packages/babel-generator/test/fixtures/comments/empty/expected.js b/packages/babel-generator/test/fixtures/comments/empty/expected.js new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/empty/expected.js @@ -0,0 +1 @@ + diff --git a/packages/babel-generator/test/fixtures/comments/function-block-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/function-block-line-comment/actual.js new file mode 100644 index 0000000000..105b25217c --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/function-block-line-comment/actual.js @@ -0,0 +1,6 @@ +!function(){}// +,42; +!{get 42(){}// +,foo:42}; +(function(){}// +) diff --git a/packages/babel-generator/test/fixtures/comments/function-block-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/function-block-line-comment/expected.js new file mode 100644 index 0000000000..d6802cba24 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/function-block-line-comment/expected.js @@ -0,0 +1,6 @@ +!function () {}, // +42; +!{ get 42() {}, // + foo: 42 }; +(function () {}); +// diff --git a/packages/babel-generator/test/fixtures/comments/if-block-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/if-block-line-comment/actual.js new file mode 100644 index 0000000000..a17714740f --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/if-block-line-comment/actual.js @@ -0,0 +1,5 @@ +if (cond) + // Leading to if-block +{ + print("hello"); +} // Trailing to if-block diff --git a/packages/babel-generator/test/fixtures/comments/if-block-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/if-block-line-comment/expected.js new file mode 100644 index 0000000000..cc93b54438 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/if-block-line-comment/expected.js @@ -0,0 +1,5 @@ +if (cond) + // Leading to if-block + { + print("hello"); + } // Trailing to if-block diff --git a/packages/babel-generator/test/fixtures/comments/if-empty-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/if-empty-line-comment/actual.js new file mode 100644 index 0000000000..524b81aa7e --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/if-empty-line-comment/actual.js @@ -0,0 +1,3 @@ +if (cond) +// Leading to EmptyStatement + ; // Trailing to EmptyStatement diff --git a/packages/babel-generator/test/fixtures/comments/if-empty-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/if-empty-line-comment/expected.js new file mode 100644 index 0000000000..bcb989f64f --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/if-empty-line-comment/expected.js @@ -0,0 +1,3 @@ +if (cond) + // Leading to EmptyStatement + ; // Trailing to EmptyStatement diff --git a/packages/babel-generator/test/fixtures/comments/if-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/if-line-comment/actual.js new file mode 100644 index 0000000000..c6ce430feb --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/if-line-comment/actual.js @@ -0,0 +1,5 @@ +function test() { +// Leading if statement + if (cond) {print("hello") } +// Trailing if-block statement +} diff --git a/packages/babel-generator/test/fixtures/comments/if-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/if-line-comment/expected.js new file mode 100644 index 0000000000..065ba70e81 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/if-line-comment/expected.js @@ -0,0 +1,7 @@ +function test() { + // Leading if statement + if (cond) { + print("hello"); + } + // Trailing if-block statement +} diff --git a/packages/babel-generator/test/fixtures/comments/object_comments/actual.js b/packages/babel-generator/test/fixtures/comments/object_comments/actual.js new file mode 100644 index 0000000000..ec76f88897 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/object_comments/actual.js @@ -0,0 +1,12 @@ +var test = { + /** + * Test 2 + */ + a:"1", + /* + * Test 1 + */ + b:"2", + // Test 3 + c:"3" +}; diff --git a/packages/babel-generator/test/fixtures/comments/object_comments/expected.js b/packages/babel-generator/test/fixtures/comments/object_comments/expected.js new file mode 100644 index 0000000000..d835befd05 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/object_comments/expected.js @@ -0,0 +1,12 @@ +var test = { + /** + * Test 2 + */ + a: "1", + /* + * Test 1 + */ + b: "2", + // Test 3 + c: "3" +}; diff --git a/packages/babel-generator/test/fixtures/comments/return-no-argument/actual.js b/packages/babel-generator/test/fixtures/comments/return-no-argument/actual.js new file mode 100644 index 0000000000..a43f15d232 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/return-no-argument/actual.js @@ -0,0 +1,3 @@ +(function() { + return; // comment +}()); diff --git a/packages/babel-generator/test/fixtures/comments/return-no-argument/expected.js b/packages/babel-generator/test/fixtures/comments/return-no-argument/expected.js new file mode 100644 index 0000000000..0dc96b3a8c --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/return-no-argument/expected.js @@ -0,0 +1,3 @@ +(function () { + return; // comment +})(); diff --git a/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-line-comment/actual.js new file mode 100644 index 0000000000..4b9cd6df29 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-line-comment/actual.js @@ -0,0 +1,49 @@ +// Copyright (C) 2012 Yusuke Suzuki +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +function test() { +} + + + +// Copyright (C) 2012 Yusuke Suzuki +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-line-comment/expected.js new file mode 100644 index 0000000000..47869b2606 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-line-comment/expected.js @@ -0,0 +1,45 @@ +// Copyright (C) 2012 Yusuke Suzuki +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +function test() {} + +// Copyright (C) 2012 Yusuke Suzuki +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-multi-comment/actual.js b/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-multi-comment/actual.js new file mode 100644 index 0000000000..1076529e0b --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-multi-comment/actual.js @@ -0,0 +1,51 @@ +/* + Copyright (C) 2012 Yusuke Suzuki + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +function test() { + +} + +/* + Copyright (C) 2012 Yusuke Suzuki + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ diff --git a/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-multi-comment/expected.js b/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-multi-comment/expected.js new file mode 100644 index 0000000000..de284d6c01 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-a-lot-of-multi-comment/expected.js @@ -0,0 +1,49 @@ +/* + Copyright (C) 2012 Yusuke Suzuki + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +function test() {} + +/* + Copyright (C) 2012 Yusuke Suzuki + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ diff --git a/packages/babel-generator/test/fixtures/comments/simple-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/simple-line-comment/actual.js new file mode 100644 index 0000000000..780a9c2b4a --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-line-comment/actual.js @@ -0,0 +1,3 @@ +// Leading +var i = 20; +// Trailing diff --git a/packages/babel-generator/test/fixtures/comments/simple-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/simple-line-comment/expected.js new file mode 100644 index 0000000000..780a9c2b4a --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-line-comment/expected.js @@ -0,0 +1,3 @@ +// Leading +var i = 20; +// Trailing diff --git a/packages/babel-generator/test/fixtures/comments/simple-multi-comment/actual.js b/packages/babel-generator/test/fixtures/comments/simple-multi-comment/actual.js new file mode 100644 index 0000000000..e0ad4c2075 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-multi-comment/actual.js @@ -0,0 +1,22 @@ +function test() { + /* + * Leading comment + */ + + /* + * + * Leading comment 2 + * + */ + + var i = 20; + /* + * Trailing comment + */ + + /* + * + * Trailing comment 2 + * + */ +} diff --git a/packages/babel-generator/test/fixtures/comments/simple-multi-comment/expected.js b/packages/babel-generator/test/fixtures/comments/simple-multi-comment/expected.js new file mode 100644 index 0000000000..e0ad4c2075 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-multi-comment/expected.js @@ -0,0 +1,22 @@ +function test() { + /* + * Leading comment + */ + + /* + * + * Leading comment 2 + * + */ + + var i = 20; + /* + * Trailing comment + */ + + /* + * + * Trailing comment 2 + * + */ +} diff --git a/packages/babel-generator/test/fixtures/comments/simple-statement-comment/actual.js b/packages/babel-generator/test/fixtures/comments/simple-statement-comment/actual.js new file mode 100644 index 0000000000..322d46769b --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-statement-comment/actual.js @@ -0,0 +1 @@ +; // Trailing diff --git a/packages/babel-generator/test/fixtures/comments/simple-statement-comment/expected.js b/packages/babel-generator/test/fixtures/comments/simple-statement-comment/expected.js new file mode 100644 index 0000000000..733f7f0c6b --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/simple-statement-comment/expected.js @@ -0,0 +1 @@ +; // Trailing diff --git a/packages/babel-generator/test/fixtures/comments/try-block-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/try-block-line-comment/actual.js new file mode 100644 index 0000000000..2ef66cdb71 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/try-block-line-comment/actual.js @@ -0,0 +1,12 @@ +try{}// +finally{} + +try{} +catch(e){}// +finally{} + +{ +try{} +catch(e){}// +finally{} +} diff --git a/packages/babel-generator/test/fixtures/comments/try-block-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/try-block-line-comment/expected.js new file mode 100644 index 0000000000..034d32569f --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/try-block-line-comment/expected.js @@ -0,0 +1,10 @@ +try {} // +finally {} + +try {} catch (e) {} // +finally {} + +{ + try {} catch (e) {} // + finally {} +} diff --git a/packages/babel-generator/test/fixtures/comments/variable-declarator-line-comment/actual.js b/packages/babel-generator/test/fixtures/comments/variable-declarator-line-comment/actual.js new file mode 100644 index 0000000000..5cc784bea2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/variable-declarator-line-comment/actual.js @@ -0,0 +1,9 @@ +function test() { + var + // Leading to VariableDeclarator + // Leading to VariableDeclarator + i = 20, + // Leading to VariableDeclarator + // Leading to VariableDeclarator + j = 20; +} diff --git a/packages/babel-generator/test/fixtures/comments/variable-declarator-line-comment/expected.js b/packages/babel-generator/test/fixtures/comments/variable-declarator-line-comment/expected.js new file mode 100644 index 0000000000..a7c1703428 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/variable-declarator-line-comment/expected.js @@ -0,0 +1,10 @@ +function test() { + var + // Leading to VariableDeclarator + // Leading to VariableDeclarator + i = 20, + + // Leading to VariableDeclarator + // Leading to VariableDeclarator + j = 20; +} diff --git a/packages/babel-generator/test/fixtures/comments/variable-declarator-multi-comment/actual.js b/packages/babel-generator/test/fixtures/comments/variable-declarator-multi-comment/actual.js new file mode 100644 index 0000000000..41dcd3d3a9 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/variable-declarator-multi-comment/actual.js @@ -0,0 +1,13 @@ +function test() { + var + /* + * Leading to VariableDeclarator + * Leading to VariableDeclarator + */ + i = 20, + /* + * Leading to VariableDeclarator + * Leading to VariableDeclarator + */ + j = 20; +} diff --git a/packages/babel-generator/test/fixtures/comments/variable-declarator-multi-comment/expected.js b/packages/babel-generator/test/fixtures/comments/variable-declarator-multi-comment/expected.js new file mode 100644 index 0000000000..84354421c2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/variable-declarator-multi-comment/expected.js @@ -0,0 +1,14 @@ +function test() { + var + /* + * Leading to VariableDeclarator + * Leading to VariableDeclarator + */ + i = 20, + + /* + * Leading to VariableDeclarator + * Leading to VariableDeclarator + */ + j = 20; +} diff --git a/packages/babel-generator/test/fixtures/comments/variable-declarator-trailing-comment/actual.js b/packages/babel-generator/test/fixtures/comments/variable-declarator-trailing-comment/actual.js new file mode 100644 index 0000000000..4ae8f0b59d --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/variable-declarator-trailing-comment/actual.js @@ -0,0 +1,16 @@ +{ + var t = 20; /* + * This is trailing comment + */ +} + +{ + var tt = 20; /* + * This is trailing comment + */ +} +{{ + var t = 20; /* + * This is trailing comment + */ +}} diff --git a/packages/babel-generator/test/fixtures/comments/variable-declarator-trailing-comment/expected.js b/packages/babel-generator/test/fixtures/comments/variable-declarator-trailing-comment/expected.js new file mode 100644 index 0000000000..7819d36b16 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/variable-declarator-trailing-comment/expected.js @@ -0,0 +1,18 @@ +{ + var t = 20; /* + * This is trailing comment + */ +} + +{ + var tt = 20; /* + * This is trailing comment + */ +} +{ + { + var t = 20; /* + * This is trailing comment + */ + } +} diff --git a/packages/babel-generator/test/fixtures/compact/options.json b/packages/babel-generator/test/fixtures/compact/options.json new file mode 100644 index 0000000000..eb4e948bfa --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/options.json @@ -0,0 +1,3 @@ +{ + "compact": true +} diff --git a/packages/babel-generator/test/fixtures/compact/single-line-comment/actual.js b/packages/babel-generator/test/fixtures/compact/single-line-comment/actual.js new file mode 100644 index 0000000000..e2589c7138 --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/single-line-comment/actual.js @@ -0,0 +1,2 @@ +// foo +bar(); diff --git a/packages/babel-generator/test/fixtures/compact/single-line-comment/expected.js b/packages/babel-generator/test/fixtures/compact/single-line-comment/expected.js new file mode 100644 index 0000000000..e2589c7138 --- /dev/null +++ b/packages/babel-generator/test/fixtures/compact/single-line-comment/expected.js @@ -0,0 +1,2 @@ +// foo +bar(); diff --git a/packages/babel-generator/test/fixtures/edgecase/bitwise-precedence/actual.js b/packages/babel-generator/test/fixtures/edgecase/bitwise-precedence/actual.js new file mode 100644 index 0000000000..7c6969bfc8 --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/bitwise-precedence/actual.js @@ -0,0 +1,3 @@ +x | y ^ z; +x | (y ^ z); +(x | y) ^ z; diff --git a/packages/babel-generator/test/fixtures/edgecase/bitwise-precedence/expected.js b/packages/babel-generator/test/fixtures/edgecase/bitwise-precedence/expected.js new file mode 100644 index 0000000000..ffcf91adde --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/bitwise-precedence/expected.js @@ -0,0 +1,3 @@ +x | y ^ z; +x | y ^ z; +(x | y) ^ z; diff --git a/packages/babel-generator/test/fixtures/edgecase/floating-point/actual.js b/packages/babel-generator/test/fixtures/edgecase/floating-point/actual.js new file mode 100644 index 0000000000..b38eebf513 --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/floating-point/actual.js @@ -0,0 +1,2 @@ +1.1.valueOf(); +(1e+300).valueOf(); diff --git a/packages/babel-generator/test/fixtures/edgecase/floating-point/expected.js b/packages/babel-generator/test/fixtures/edgecase/floating-point/expected.js new file mode 100644 index 0000000000..f0c3126dbe --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/floating-point/expected.js @@ -0,0 +1,2 @@ +1.1.valueOf(); +1e+300.valueOf(); diff --git a/packages/babel-generator/test/fixtures/edgecase/for-in-no-in/actual.js b/packages/babel-generator/test/fixtures/edgecase/for-in-no-in/actual.js new file mode 100644 index 0000000000..f84b95ae6b --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/for-in-no-in/actual.js @@ -0,0 +1,12 @@ +for (var i = (1 in []) in []); +for (var i = 1 in [] in []); +for (var i = (10 * 10 in []) in []); +for (var i = (10 + 10 in []) in []); +for (var i = 10 + (10 in []) in []); +for (var i = 10 + 10 in [] in []); +for (var i = (1 in []);;); +for ((1 in []);;); +for (1 * (1 in []);;); +for (1 * (1 + 1 in []);;); +for (1 * ((1 + 1) in []);;); +for (1 * (1 + (1 in []));;); diff --git a/packages/babel-generator/test/fixtures/edgecase/for-in-no-in/expected.js b/packages/babel-generator/test/fixtures/edgecase/for-in-no-in/expected.js new file mode 100644 index 0000000000..029b11e515 --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/for-in-no-in/expected.js @@ -0,0 +1,12 @@ +for (var i = (1 in []) in []); +for (var i = 1 in ([] in [])); +for (var i = (10 * 10 in []) in []); +for (var i = (10 + 10 in []) in []); +for (var i = 10 + (10 in []) in []); +for (var i = 10 + 10 in ([] in [])); +for (var i = (1 in []);;); +for ((1 in []);;); +for (1 * (1 in []);;); +for (1 * (1 + 1 in []);;); +for (1 * (1 + 1 in []);;); +for (1 * (1 + (1 in []));;); diff --git a/packages/babel-generator/test/fixtures/edgecase/new-precedence/actual.js b/packages/babel-generator/test/fixtures/edgecase/new-precedence/actual.js new file mode 100644 index 0000000000..7100c69c3d --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/new-precedence/actual.js @@ -0,0 +1,9 @@ +new (a().b)(); +new a().b(); +new (a()).b(); +new (a())(); +new new a(a)(); +new (new a())(a); +(new a()).test; +(new a().test); +(new (a().test)()); diff --git a/packages/babel-generator/test/fixtures/edgecase/new-precedence/expected.js b/packages/babel-generator/test/fixtures/edgecase/new-precedence/expected.js new file mode 100644 index 0000000000..646afe94da --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/new-precedence/expected.js @@ -0,0 +1,9 @@ +new (a().b)(); +new a().b(); +new (a().b)(); +new (a())(); +new new a(a)(); +new new a()(a); +new a().test; +new a().test; +new (a().test)(); diff --git a/packages/babel-generator/test/fixtures/edgecase/one-property-with-line-terminator/actual.js b/packages/babel-generator/test/fixtures/edgecase/one-property-with-line-terminator/actual.js new file mode 100644 index 0000000000..cfbda48a0d --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/one-property-with-line-terminator/actual.js @@ -0,0 +1,3 @@ +dejavu.Class.declare({ + method2: function () {} +}); diff --git a/packages/babel-generator/test/fixtures/edgecase/one-property-with-line-terminator/expected.js b/packages/babel-generator/test/fixtures/edgecase/one-property-with-line-terminator/expected.js new file mode 100644 index 0000000000..cfbda48a0d --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/one-property-with-line-terminator/expected.js @@ -0,0 +1,3 @@ +dejavu.Class.declare({ + method2: function () {} +}); diff --git a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/actual.js b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/actual.js new file mode 100644 index 0000000000..2a0e91f010 --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/actual.js @@ -0,0 +1,6 @@ +function foo(l) { + return ( + // hi + l + ); +} diff --git a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js new file mode 100644 index 0000000000..042f71356d --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js @@ -0,0 +1,4 @@ +function foo(l){ +return ( + +l);} diff --git a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/options.json b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/options.json new file mode 100644 index 0000000000..a3e2539639 --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/options.json @@ -0,0 +1,5 @@ +{ + "comments": false, + "retainLines": true, + "compact": true +} diff --git a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/actual.js b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/actual.js new file mode 100644 index 0000000000..3d4fdd63e3 --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/actual.js @@ -0,0 +1,11 @@ +function foo(l) { + return ( + l + ); +} + +function foo() { + return ( + 1 && 2 + ) || 3; +} diff --git a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/expected.js b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/expected.js new file mode 100644 index 0000000000..cc911760dc --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/expected.js @@ -0,0 +1,10 @@ +function foo(l) { + return ( + l);} + + + +function foo() { + return ( + 1 && 2 || + 3);} diff --git a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/options.json b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/options.json new file mode 100644 index 0000000000..97925bbcb6 --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-option/options.json @@ -0,0 +1,3 @@ +{ + "retainLines": true +} diff --git a/packages/babel-generator/test/fixtures/edgecase/unary-op/actual.js b/packages/babel-generator/test/fixtures/edgecase/unary-op/actual.js new file mode 100644 index 0000000000..9f318cdb1f --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/unary-op/actual.js @@ -0,0 +1,5 @@ +delete delete i; ++ +i; +!!i; ++ ++i; +- --i; diff --git a/packages/babel-generator/test/fixtures/edgecase/unary-op/expected.js b/packages/babel-generator/test/fixtures/edgecase/unary-op/expected.js new file mode 100644 index 0000000000..9f318cdb1f --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/unary-op/expected.js @@ -0,0 +1,5 @@ +delete delete i; ++ +i; +!!i; ++ ++i; +- --i; diff --git a/packages/babel-generator/test/fixtures/edgecase/variable-declaration/actual.js b/packages/babel-generator/test/fixtures/edgecase/variable-declaration/actual.js new file mode 100644 index 0000000000..31fcb452eb --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/variable-declaration/actual.js @@ -0,0 +1,4 @@ +var fact5 = function fact(n){ + if (n <= 1) return 1 + return n * fact(n - 1) +}(5) diff --git a/packages/babel-generator/test/fixtures/edgecase/variable-declaration/expected.js b/packages/babel-generator/test/fixtures/edgecase/variable-declaration/expected.js new file mode 100644 index 0000000000..0af0dd6ac0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/edgecase/variable-declaration/expected.js @@ -0,0 +1,4 @@ +var fact5 = (function fact(n) { + if (n <= 1) return 1; + return n * fact(n - 1); +})(5); diff --git a/packages/babel-generator/test/fixtures/flow/array-types/actual.js b/packages/babel-generator/test/fixtures/flow/array-types/actual.js new file mode 100644 index 0000000000..39f1c281a2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/array-types/actual.js @@ -0,0 +1,6 @@ +var a: number[]; +var a: ?number[]; +var a: (?number)[]; +var a: () => number[]; +var a: (() => number)[]; +var a: typeof A[]; diff --git a/packages/babel-generator/test/fixtures/flow/array-types/expected.js b/packages/babel-generator/test/fixtures/flow/array-types/expected.js new file mode 100644 index 0000000000..39f1c281a2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/array-types/expected.js @@ -0,0 +1,6 @@ +var a: number[]; +var a: ?number[]; +var a: (?number)[]; +var a: () => number[]; +var a: (() => number)[]; +var a: typeof A[]; diff --git a/packages/babel-generator/test/fixtures/flow/boolean-literal-types/actual.js b/packages/babel-generator/test/fixtures/flow/boolean-literal-types/actual.js new file mode 100644 index 0000000000..8573e6b69e --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/boolean-literal-types/actual.js @@ -0,0 +1,2 @@ +var foo: true; +var bar: false; diff --git a/packages/babel-generator/test/fixtures/flow/boolean-literal-types/expected.js b/packages/babel-generator/test/fixtures/flow/boolean-literal-types/expected.js new file mode 100644 index 0000000000..8573e6b69e --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/boolean-literal-types/expected.js @@ -0,0 +1,2 @@ +var foo: true; +var bar: false; diff --git a/packages/babel-generator/test/fixtures/flow/call-properties/actual.js b/packages/babel-generator/test/fixtures/flow/call-properties/actual.js new file mode 100644 index 0000000000..62f0a1b259 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/call-properties/actual.js @@ -0,0 +1,5 @@ +var a: { (): number }; +var a: { (): number; }; +var a: { (): number; y: string; (x: string): string }; +var a: { (x: T): number; }; +interface A { (): number; }; diff --git a/packages/babel-generator/test/fixtures/flow/call-properties/expected.js b/packages/babel-generator/test/fixtures/flow/call-properties/expected.js new file mode 100644 index 0000000000..11d4f2a107 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/call-properties/expected.js @@ -0,0 +1,5 @@ +var a: { (): number }; +var a: { (): number }; +var a: { y: string; (): number; (x: string): string; }; +var a: { (x: T): number }; +interface A { (): number }; diff --git a/packages/babel-generator/test/fixtures/flow/declare-module/actual.js b/packages/babel-generator/test/fixtures/flow/declare-module/actual.js new file mode 100644 index 0000000000..7612b7dc0d --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/declare-module/actual.js @@ -0,0 +1,5 @@ +declare module A {} +declare module "./a/b.js" {} +declare module A { declare var x: number; } +declare module A { declare function foo(): number; } +declare module A { declare class B { foo(): number; } } diff --git a/packages/babel-generator/test/fixtures/flow/declare-module/expected.js b/packages/babel-generator/test/fixtures/flow/declare-module/expected.js new file mode 100644 index 0000000000..0b6fbd09e0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/declare-module/expected.js @@ -0,0 +1,11 @@ +declare module A {} +declare module "./a/b.js" {} +declare module A { + declare var x: number; +} +declare module A { + declare function foo(): number; +} +declare module A { + declare class B { foo(): number } +} diff --git a/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js new file mode 100644 index 0000000000..369f608fa2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js @@ -0,0 +1,11 @@ +declare var foo +declare var foo; +declare function foo(): void +declare function foo(): void; +declare function foo(): void; +declare function foo(x: number, y: string): void; +declare class A {} +declare class A extends B { x: number } +declare class A { static foo(): number; static x : string } +declare class A { static [ indexer: number]: string } +declare class A { static () : number } diff --git a/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js new file mode 100644 index 0000000000..323cc86f70 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js @@ -0,0 +1,11 @@ +declare var foo; +declare var foo; +declare function foo(): void; +declare function foo(): void; +declare function foo(): void; +declare function foo(x: number, y: string): void; +declare class A {} +declare class A extends B { x: number } +declare class A { static foo(): number; static x: string; } +declare class A { static [indexer: number]: string } +declare class A { static (): number } diff --git a/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/actual.js b/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/actual.js new file mode 100644 index 0000000000..f55148215c --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/actual.js @@ -0,0 +1,9 @@ +interface A {}; +interface A extends B {}; +interface A extends B, C {}; +interface A { foo: () => number; }; +interface Dictionary { [index: string]: string; length: number; }; +class Foo implements Bar {} +class Foo extends Bar implements Bat, Man {} +class Foo extends class Bar implements Bat {} {} +class Foo extends class Bar implements Bat {} implements Man {} diff --git a/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/expected.js b/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/expected.js new file mode 100644 index 0000000000..90aafb539e --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/interfaces-module-and-script/expected.js @@ -0,0 +1,9 @@ +interface A {}; +interface A extends B {}; +interface A extends B, C {}; +interface A { foo(): number }; +interface Dictionary { length: number; [index: string]: string; }; +class Foo implements Bar {} +class Foo extends Bar implements Bat, Man {} +class Foo extends class Bar implements Bat {} {} +class Foo extends class Bar implements Bat {} implements Man {} diff --git a/packages/babel-generator/test/fixtures/flow/number-literal-types/actual.js b/packages/babel-generator/test/fixtures/flow/number-literal-types/actual.js new file mode 100644 index 0000000000..8aa0ffac4b --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/number-literal-types/actual.js @@ -0,0 +1,5 @@ +var a: 123; +var a: 123.0; +var a: 0x7B; +var a: 0b1111011; +var a: 0o173; diff --git a/packages/babel-generator/test/fixtures/flow/number-literal-types/expected.js b/packages/babel-generator/test/fixtures/flow/number-literal-types/expected.js new file mode 100644 index 0000000000..8aa0ffac4b --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/number-literal-types/expected.js @@ -0,0 +1,5 @@ +var a: 123; +var a: 123.0; +var a: 0x7B; +var a: 0b1111011; +var a: 0o173; diff --git a/packages/babel-generator/test/fixtures/flow/qualified-generic-type/actual.js b/packages/babel-generator/test/fixtures/flow/qualified-generic-type/actual.js new file mode 100644 index 0000000000..040a63c165 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/qualified-generic-type/actual.js @@ -0,0 +1,4 @@ +var a: A.B; +var a: A.B.C; +var a: A.B; +var a: typeof A.B; diff --git a/packages/babel-generator/test/fixtures/flow/qualified-generic-type/expected.js b/packages/babel-generator/test/fixtures/flow/qualified-generic-type/expected.js new file mode 100644 index 0000000000..040a63c165 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/qualified-generic-type/expected.js @@ -0,0 +1,4 @@ +var a: A.B; +var a: A.B.C; +var a: A.B; +var a: typeof A.B; diff --git a/packages/babel-generator/test/fixtures/flow/string-literal-types/actual.js b/packages/babel-generator/test/fixtures/flow/string-literal-types/actual.js new file mode 100644 index 0000000000..6acd7f1342 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/string-literal-types/actual.js @@ -0,0 +1,2 @@ +function createElement(tagName: "div"): HTMLDivElement {} +function createElement(tagName: 'div'): HTMLDivElement {} diff --git a/packages/babel-generator/test/fixtures/flow/string-literal-types/expected.js b/packages/babel-generator/test/fixtures/flow/string-literal-types/expected.js new file mode 100644 index 0000000000..6acd7f1342 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/string-literal-types/expected.js @@ -0,0 +1,2 @@ +function createElement(tagName: "div"): HTMLDivElement {} +function createElement(tagName: 'div'): HTMLDivElement {} diff --git a/packages/babel-generator/test/fixtures/flow/tuples/actual.js b/packages/babel-generator/test/fixtures/flow/tuples/actual.js new file mode 100644 index 0000000000..4c4291e8b2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/tuples/actual.js @@ -0,0 +1,4 @@ +var a: [] = []; +var a: [Foo] = [foo]; +var a: [number,] = [123,]; +var a: [number, string] = [123, "duck"]; diff --git a/packages/babel-generator/test/fixtures/flow/tuples/expected.js b/packages/babel-generator/test/fixtures/flow/tuples/expected.js new file mode 100644 index 0000000000..2fb1a921e0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/tuples/expected.js @@ -0,0 +1,4 @@ +var a: [] = []; +var a: [Foo] = [foo]; +var a: [number] = [123]; +var a: [number, string] = [123, "duck"]; diff --git a/packages/babel-generator/test/fixtures/flow/type-alias/actual.js b/packages/babel-generator/test/fixtures/flow/type-alias/actual.js new file mode 100644 index 0000000000..a56fa1a17b --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/type-alias/actual.js @@ -0,0 +1,3 @@ +type FBID = number; +type Foo = Bar +export type Foo = number; diff --git a/packages/babel-generator/test/fixtures/flow/type-alias/expected.js b/packages/babel-generator/test/fixtures/flow/type-alias/expected.js new file mode 100644 index 0000000000..f0a50c1904 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/type-alias/expected.js @@ -0,0 +1,3 @@ +type FBID = number; +type Foo = Bar; +export type Foo = number; diff --git a/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js b/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js new file mode 100644 index 0000000000..2acac2f2d8 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js @@ -0,0 +1,100 @@ +function foo(numVal: any) {} +function foo(numVal: number) {} +function foo(numVal: number, strVal: string) {} +function foo(numVal: number, untypedVal) {} +function foo(untypedVal, numVal: number) {} +function foo(nullableNum: ?number) {} +function foo(callback: () => void) {} +function foo(callback: () => number) {} +function foo(callback: (_: bool) => number) {} +function foo(callback: (_1: bool, _2: string) => number) {} +function foo(callback: (_1: bool, ...foo: Array) => number) {} +function foo(): number{} +function foo():() => void {} +function foo():(_:bool) => number{} +function foo():(_?:bool) => number{} +function foo(): {} {} +function foo() {} +function foo() {} +function foo() {} +a = function() {}; +a = { set fooProp(value: number) {} }; +a = { set fooProp(value: number): void {} }; +a = { get fooProp():number{} }; +a = { id(x: T): T {} }; +a = { *id(x: T): T {} }; +a = { async id(x: T): T {} }; +a = { 123(x: T): T {} }; +class Foo { + set fooProp(value: number) {} +} +class Foo { + set fooProp(value: number): void {} +} +class Foo { + get fooProp(): number {} +} +var numVal: number; +var numVal: number = otherNumVal; +var a: { numVal: number }; +var a: { numVal: number; }; +var a: { numVal: number; [indexer: string]: number }; +var a: ?{ numVal: number }; +var a: { numVal: number; strVal: string } +var a: { subObj: {strVal: string} } +var a: { subObj: ?{strVal: string} } +var a: { param1: number; param2: string } +var a: { param1: number; param2?: string } +var a: { [a: number]: string; [b: number]: string; }; +var a: { add(x: number, ...y: Array): void }; +var a: { id(x: T): T; }; +var a:Array = [1, 2, 3] +a = class Foo {} +a = class Foo extends Bar {} +class Foo {} +class Foo extends Bar {} +class Foo extends mixin(Bar) {} +class Foo { + bar():number { return 42; } +} +class Foo { + "bar"() {} +} +function foo(requiredParam, optParam?) {} +class Foo { + prop1: string; + prop2: number; +} +class Foo { + static prop1: string; + prop2: number; +} +var x: number | string = 4; +class Array { concat(items:number | string) {}; } +var x: () => number | () => string = fn; +var x: typeof Y = Y; +var x: typeof Y | number = Y; +var {x}: {x: string; } = { x: "hello" }; +var {x}: {x: string } = { x: "hello" }; +var [x]: Array = [ "hello" ]; +function foo({x}: { x: string; }) {} +function foo([x]: Array) {} +function foo(...rest: Array) {} +(function (...rest: Array) {}); +((...rest: Array) => rest); +var a: Map > +var a: Map> +var a: number[] +var a: ?string[] +var a: Promise[] +var a:(...rest:Array) => number +var identity: (x: T) => T +var identity: (x: T, ...y:T[]) => T +import type foo from "bar"; +import type { foo, bar } from "baz"; +import type { foo as bar } from "baz"; +import type from "foo"; +import type, { foo } from "bar"; +import type * as namespace from "bar"; +export type { foo }; +export type { foo } from "bar"; diff --git a/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js b/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js new file mode 100644 index 0000000000..f263cf9bd5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js @@ -0,0 +1,104 @@ +function foo(numVal: any) {} +function foo(numVal: number) {} +function foo(numVal: number, strVal: string) {} +function foo(numVal: number, untypedVal) {} +function foo(untypedVal, numVal: number) {} +function foo(nullableNum: ?number) {} +function foo(callback: () => void) {} +function foo(callback: () => number) {} +function foo(callback: (_: bool) => number) {} +function foo(callback: (_1: bool, _2: string) => number) {} +function foo(callback: (_1: bool, ...foo: Array) => number) {} +function foo(): number {} +function foo(): () => void {} +function foo(): (_: bool) => number {} +function foo(): (_?: bool) => number {} +function foo(): {} {} +function foo() {} +function foo() {} +function foo() {} +a = function () {}; +a = { set fooProp(value: number) {} }; +a = { set fooProp(value: number): void {} }; +a = { get fooProp(): number {} }; +a = { id(x: T): T {} }; +a = { *id(x: T): T {} }; +a = { async id(x: T): T {} }; +a = { 123(x: T): T {} }; +class Foo { + set fooProp(value: number) {} +} +class Foo { + set fooProp(value: number): void {} +} +class Foo { + get fooProp(): number {} +} +var numVal: number; +var numVal: number = otherNumVal; +var a: { numVal: number }; +var a: { numVal: number }; +var a: { numVal: number; [indexer: string]: number; }; +var a: ?{ numVal: number }; +var a: { numVal: number; strVal: string; }; +var a: { subObj: { strVal: string } }; +var a: { subObj: ?{ strVal: string } }; +var a: { param1: number; param2: string; }; +var a: { param1: number; param2?: string; }; +var a: { [a: number]: string; [b: number]: string; }; +var a: { add(x: number, ...y: Array): void }; +var a: { id(x: T): T }; +var a: Array = [1, 2, 3]; +a = class Foo {}; +a = class Foo extends Bar {}; +class Foo {} +class Foo extends Bar {} +class Foo extends mixin(Bar) {} +class Foo { + bar(): number { + return 42; + } +} +class Foo { + "bar"() {} +} +function foo(requiredParam, optParam?) {} +class Foo { + prop1: string; + prop2: number; +} +class Foo { + static prop1: string; + prop2: number; +} +var x: number | string = 4; +class Array { + concat(items: number | string) {} +} +var x: () => number | () => string = fn; +var x: typeof Y = Y; +var x: typeof Y | number = Y; +var { x }: { x: string } = { x: "hello" }; +var { x }: { x: string } = { x: "hello" }; +var [x]: Array = ["hello"]; +function foo({ x }: { x: string }) {} +function foo([x]: Array) {} +function foo(...rest: Array) {} +(function (...rest: Array) {}); +(...rest: Array) => rest; +var a: Map>; +var a: Map>; +var a: number[]; +var a: ?string[]; +var a: Promise[]; +var a: (...rest: Array) => number; +var identity: (x: T) => T; +var identity: (x: T, ...y: T[]) => T; +import type foo from "bar"; +import type { foo, bar } from "baz"; +import type { foo as bar } from "baz"; +import type from "foo"; +import type, { foo } from "bar"; +import type * as namespace from "bar"; +export type { foo }; +export type { foo } from "bar"; diff --git a/packages/babel-generator/test/fixtures/flow/typecasts/actual.js b/packages/babel-generator/test/fixtures/flow/typecasts/actual.js new file mode 100644 index 0000000000..aa691e87d2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/typecasts/actual.js @@ -0,0 +1,4 @@ +(xxx: number); +({ xxx: 0, yyy: "hey" }: { xxx: number; yyy: string }); +(xxx => xxx + 1: (xxx: number) => number); +((xxx: number), (yyy: string)); diff --git a/packages/babel-generator/test/fixtures/flow/typecasts/expected.js b/packages/babel-generator/test/fixtures/flow/typecasts/expected.js new file mode 100644 index 0000000000..69c9dc4b93 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/typecasts/expected.js @@ -0,0 +1,4 @@ +(xxx: number); +({ xxx: 0, yyy: "hey" }: { xxx: number; yyy: string; }); +(xxx => xxx + 1: (xxx: number) => number); +(xxx: number), (yyy: string); diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/arrow-function/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/arrow-function/actual.js new file mode 100644 index 0000000000..21333a47b5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/arrow-function/actual.js @@ -0,0 +1,11 @@ +e => { + print("hello world"); +}; +(e1, e2, e3) => { + print("hello world"); +}; +e => e; +(e1, e2, e3) => e; +(e) => { +}; +e => 20 + 20 diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/arrow-function/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/arrow-function/expected.js new file mode 100644 index 0000000000..665c99a5cb --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/arrow-function/expected.js @@ -0,0 +1,10 @@ +e => { + print("hello world"); +}; +(e1, e2, e3) => { + print("hello world"); +}; +e => e; +(e1, e2, e3) => e; +e => {}; +e => 20 + 20; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/class-declaration/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/class-declaration/actual.js new file mode 100644 index 0000000000..46e3476c79 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/class-declaration/actual.js @@ -0,0 +1,56 @@ +class Test { +} +class Derived extends Super { +} +class StaticMethods { + static n1() { + } + + static get get1() { + } + + static set set1(value) { + } + + static *gen1() { + } +} +class Methods { + n2() { + } + + get get2() { + } + + set set2(value) { + } + + *gen1() { + } +} +class ComputedStaticMethods { + static [n1]() { + } + + static get [get1]() { + } + + static set [set1](value) { + } + + static *[gen1]() { + } +} +class ComputedMethods { + [n2]() { + } + + get [get2]() { + } + + set [set2](value) { + } + + *[gen1]() { + } +} diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/class-declaration/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/class-declaration/expected.js new file mode 100644 index 0000000000..ee25d48aa9 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/class-declaration/expected.js @@ -0,0 +1,38 @@ +class Test {} +class Derived extends Super {} +class StaticMethods { + static n1() {} + + static get get1() {} + + static set set1(value) {} + + static *gen1() {} +} +class Methods { + n2() {} + + get get2() {} + + set set2(value) {} + + *gen1() {} +} +class ComputedStaticMethods { + static [n1]() {} + + static get [get1]() {} + + static set [set1](value) {} + + static *[gen1]() {} +} +class ComputedMethods { + [n2]() {} + + get [get2]() {} + + set [set2](value) {} + + *[gen1]() {} +} diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/class-expression/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/class-expression/actual.js new file mode 100644 index 0000000000..209eada40b --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/class-expression/actual.js @@ -0,0 +1,55 @@ +(class Test { }); +(class Derived extends Super { }); +(class StaticMethods { + static n1() { + } + + static get get1() { + } + + static set set1(value) { + } + + static *gen1() { + } +}); +(class Methods { + n2() { + } + + get get2() { + } + + set set2(value) { + } + + *gen1() { + } +}); +(class ComputedStaticMethods { + static [n1]() { + } + + static get [get1]() { + } + + static set [set1](value) { + } + + static *[gen1]() { + } +}); +(class ComputedMethods { + [n2]() { + } + + get [get2]() { + } + + set [set2](value) { + } + + *[gen1]() { + } +}); +(class { }); diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/class-expression/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/class-expression/expected.js new file mode 100644 index 0000000000..d49bc099bc --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/class-expression/expected.js @@ -0,0 +1,39 @@ +(class Test {}); +(class Derived extends Super {}); +(class StaticMethods { + static n1() {} + + static get get1() {} + + static set set1(value) {} + + static *gen1() {} +}); +(class Methods { + n2() {} + + get get2() {} + + set set2(value) {} + + *gen1() {} +}); +(class ComputedStaticMethods { + static [n1]() {} + + static get [get1]() {} + + static set [set1](value) {} + + static *[gen1]() {} +}); +(class ComputedMethods { + [n2]() {} + + get [get2]() {} + + set [set2](value) {} + + *[gen1]() {} +}); +(class {}); diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/computed-property/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/computed-property/actual.js new file mode 100644 index 0000000000..e5db5ac150 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/computed-property/actual.js @@ -0,0 +1,14 @@ +var object1 = { + get [Symbol.create]() { }, + set [set()](value) { } +}; +var object2 = { + *[generator()]() { } +}; +var object3 = { + *[generator()]() { } +}; +var object4 = { + [Symbol.xxx]: "hello", + [ok()]: 42 +}; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/computed-property/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/computed-property/expected.js new file mode 100644 index 0000000000..f691ac68dc --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/computed-property/expected.js @@ -0,0 +1,14 @@ +var object1 = { + get [Symbol.create]() {}, + set [set()](value) {} +}; +var object2 = { + *[generator()]() {} +}; +var object3 = { + *[generator()]() {} +}; +var object4 = { + [Symbol.xxx]: "hello", + [ok()]: 42 +}; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/default-parameter/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/default-parameter/actual.js new file mode 100644 index 0000000000..aa61f5ec66 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/default-parameter/actual.js @@ -0,0 +1,11 @@ +function a(p=20) { +} + +function b(p, q=30) { +} + +function c(p, q=30, ...r) { +} + +(p = 20) => { }; +(p = 20, ...q) => { }; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/default-parameter/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/default-parameter/expected.js new file mode 100644 index 0000000000..bc5604fa1b --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/default-parameter/expected.js @@ -0,0 +1,8 @@ +function a(p = 20) {} + +function b(p, q = 30) {} + +function c(p, q = 30, ...r) {} + +(p = 20) => {}; +(p = 20, ...q) => {}; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/destructuring-assignment/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/destructuring-assignment/actual.js new file mode 100644 index 0000000000..b9325bbae1 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/destructuring-assignment/actual.js @@ -0,0 +1,18 @@ +function t1({responseText: responseText}) { +} +function t2({responseText}) { +} +function t3([a, b]) { +} +var [i, j, k] = array; +var { + i, + j, + k +} = obj; +let {i, j, k} = obj; +const {i, j, k} = obj; +var { value } = obj; +var { + value +} = obj; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/destructuring-assignment/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/destructuring-assignment/expected.js new file mode 100644 index 0000000000..d32b4e5bae --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/destructuring-assignment/expected.js @@ -0,0 +1,15 @@ +function t1({ responseText: responseText }) {} +function t2({ responseText }) {} +function t3([a, b]) {} +var [i, j, k] = array; +var { + i, + j, + k +} = obj; +let { i, j, k } = obj; +const { i, j, k } = obj; +var { value } = obj; +var { + value +} = obj; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/export-default-declaration/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/export-default-declaration/actual.js new file mode 100644 index 0000000000..3d8267c6c7 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/export-default-declaration/actual.js @@ -0,0 +1 @@ +export default function a () { } diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/export-default-declaration/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/export-default-declaration/expected.js new file mode 100644 index 0000000000..c33f5633d7 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/export-default-declaration/expected.js @@ -0,0 +1 @@ +export default function a() {} diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/exports/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/exports/actual.js new file mode 100644 index 0000000000..d76fe5a8ad --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/exports/actual.js @@ -0,0 +1,9 @@ +export * from "OK" +export { name } from "OK" +export { a as b, c as d } from "hello" +export { a as b, c as d } +export { } +export default i = 20 +export function test() { } +export var i = 20 +export let i = 42 diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/exports/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/exports/expected.js new file mode 100644 index 0000000000..269678f691 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/exports/expected.js @@ -0,0 +1,9 @@ +export * from "OK"; +export { name } from "OK"; +export { a as b, c as d } from "hello"; +export { a as b, c as d }; +export {}; +export default i = 20; +export function test() {} +export var i = 20; +export let i = 42; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/for-of-statement/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/for-of-statement/actual.js new file mode 100644 index 0000000000..0cffaf8dc1 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/for-of-statement/actual.js @@ -0,0 +1,7 @@ +function test() { + for (var i of array) { + } + + for (let i of array) { + } +} diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/for-of-statement/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/for-of-statement/expected.js new file mode 100644 index 0000000000..be22a40333 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/for-of-statement/expected.js @@ -0,0 +1,5 @@ +function test() { + for (var i of array) {} + + for (let i of array) {} +} diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-default/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-default/actual.js new file mode 100644 index 0000000000..7fb048846d --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-default/actual.js @@ -0,0 +1,7 @@ +import foo from "foo"; +import * as foo from "foo"; +import ok, { + foo as bar, + test as testing, + logging +} from "foo"; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-default/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-default/expected.js new file mode 100644 index 0000000000..530a0ce14b --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/import-with-default/expected.js @@ -0,0 +1,3 @@ +import foo from "foo"; +import * as foo from "foo"; +import ok, { foo as bar, test as testing, logging } from "foo"; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/imports/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/imports/actual.js new file mode 100644 index 0000000000..98bbc6bbcb --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/imports/actual.js @@ -0,0 +1,8 @@ +import "foo"; +import {foo} from "foo"; +import {foo as bar} from "foo"; +import { + foo as bar, + test as testing, + logging +} from "foo"; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/imports/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/imports/expected.js new file mode 100644 index 0000000000..d4d486ece9 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/imports/expected.js @@ -0,0 +1,4 @@ +import "foo"; +import { foo } from "foo"; +import { foo as bar } from "foo"; +import { foo as bar, test as testing, logging } from "foo"; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/spread-element/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/spread-element/actual.js new file mode 100644 index 0000000000..c4cd936913 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/spread-element/actual.js @@ -0,0 +1,5 @@ +var [a, b, ...rest] = array; +const [a, b, ...rest] = array; +function a([a, b, ...rest]) { +} +([a, b, ...rest]) => { }; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/spread-element/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/spread-element/expected.js new file mode 100644 index 0000000000..bdad6cc5aa --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/spread-element/expected.js @@ -0,0 +1,4 @@ +var [a, b, ...rest] = array; +const [a, b, ...rest] = array; +function a([a, b, ...rest]) {} +([a, b, ...rest]) => {}; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/templates-escape/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/templates-escape/actual.js new file mode 100644 index 0000000000..5d8a96d54f --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/templates-escape/actual.js @@ -0,0 +1,12 @@ +var escaped = ` +\u2028 +\u2029 +`; + +var escaped = ` +\v +\b +\t +\n +\r +`; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/templates-escape/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/templates-escape/expected.js new file mode 100644 index 0000000000..5d8a96d54f --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/templates-escape/expected.js @@ -0,0 +1,12 @@ +var escaped = ` +\u2028 +\u2029 +`; + +var escaped = ` +\v +\b +\t +\n +\r +`; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/templates/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/templates/actual.js new file mode 100644 index 0000000000..153f90d596 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/templates/actual.js @@ -0,0 +1,31 @@ +var hello = `hello`; + +var hello = ` +line +terminators`; + +var tagged = tagged`hello`; +var tagged = member.call`hello`; +var tagged = new call`hello`; +var tagged = new (call`hello`()); +var tageed = member[call`hello`]; + +var middles = ` +Is the order a rabbit? +`; + +var middles = ` +Is the order ${ order }? +`; + +var middles = ` +Is the order ${ order }? +`; + +var middles = ` +1. ${ cocoa } +2. ${ chino } +3. ${ rize } +4. ${ syaro } +5. ${ chiya } +`; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/templates/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/templates/expected.js new file mode 100644 index 0000000000..93ff1e3ebb --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/templates/expected.js @@ -0,0 +1,31 @@ +var hello = `hello`; + +var hello = ` +line +terminators`; + +var tagged = tagged`hello`; +var tagged = member.call`hello`; +var tagged = new call`hello`(); +var tagged = new (call`hello`())(); +var tageed = member[call`hello`]; + +var middles = ` +Is the order a rabbit? +`; + +var middles = ` +Is the order ${ order }? +`; + +var middles = ` +Is the order ${ order }? +`; + +var middles = ` +1. ${ cocoa } +2. ${ chino } +3. ${ rize } +4. ${ syaro } +5. ${ chiya } +`; diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/yield-precedence/actual.js b/packages/babel-generator/test/fixtures/harmony-edgecase/yield-precedence/actual.js new file mode 100644 index 0000000000..c5cd08ca3a --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/yield-precedence/actual.js @@ -0,0 +1,7 @@ +function *foo () { + var a = yield wat(), b = 2; + var c = yield a = b; + yield a, yield b; + yield a = b; + return (yield 1) || (yield 2); +} diff --git a/packages/babel-generator/test/fixtures/harmony-edgecase/yield-precedence/expected.js b/packages/babel-generator/test/fixtures/harmony-edgecase/yield-precedence/expected.js new file mode 100644 index 0000000000..302ffe6c55 --- /dev/null +++ b/packages/babel-generator/test/fixtures/harmony-edgecase/yield-precedence/expected.js @@ -0,0 +1,8 @@ +function* foo() { + var a = yield wat(), + b = 2; + var c = yield a = b; + yield a, yield b; + yield a = b; + return (yield 1) || (yield 2); +} diff --git a/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/actual.js b/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/actual.js new file mode 100644 index 0000000000..d9187763fe --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/actual.js @@ -0,0 +1,4 @@ +var foo = arr.map(v => ({ + x: v.bar, + y: v.bar*2 +})); diff --git a/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/expected.js b/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/expected.js new file mode 100644 index 0000000000..18f4fa7da5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/arrow-function-object-body/expected.js @@ -0,0 +1,4 @@ +var foo = arr.map(v => ({ + x: v.bar, + y: v.bar * 2 +})); diff --git a/packages/babel-generator/test/fixtures/parentheses/terminator-break/actual.js b/packages/babel-generator/test/fixtures/parentheses/terminator-break/actual.js new file mode 100644 index 0000000000..ad3ad2eecf --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/terminator-break/actual.js @@ -0,0 +1,12 @@ +function foo() { + return ( // foobar + "bar" + ); +} + +function foo() { + return ( + // foobar + "bar" + ); +} diff --git a/packages/babel-generator/test/fixtures/parentheses/terminator-break/expected.js b/packages/babel-generator/test/fixtures/parentheses/terminator-break/expected.js new file mode 100644 index 0000000000..e6604a1cf0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/parentheses/terminator-break/expected.js @@ -0,0 +1,12 @@ +function foo() { + return (// foobar + "bar" + ); +} + +function foo() { + return( + // foobar + "bar" + ); +} diff --git a/packages/babel-generator/test/fixtures/types/ArrayExpression-ArrayPattern/actual.js b/packages/babel-generator/test/fixtures/types/ArrayExpression-ArrayPattern/actual.js new file mode 100644 index 0000000000..20076ec145 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ArrayExpression-ArrayPattern/actual.js @@ -0,0 +1,5 @@ +[a, b, c]; +[[], [b, c], []]; +[a,, b,]; +[a,,,, b]; +[a, b,, c]; diff --git a/packages/babel-generator/test/fixtures/types/ArrayExpression-ArrayPattern/expected.js b/packages/babel-generator/test/fixtures/types/ArrayExpression-ArrayPattern/expected.js new file mode 100644 index 0000000000..472dd398ba --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ArrayExpression-ArrayPattern/expected.js @@ -0,0 +1,5 @@ +[a, b, c]; +[[], [b, c], []]; +[a,, b]; +[a,,,, b]; +[a, b,, c]; diff --git a/packages/babel-generator/test/fixtures/types/ArrowFunctionExpression/actual.js b/packages/babel-generator/test/fixtures/types/ArrowFunctionExpression/actual.js new file mode 100644 index 0000000000..359ef770df --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ArrowFunctionExpression/actual.js @@ -0,0 +1,4 @@ +var foo = x => x * x; +var foo = (a, b) => a * b; +var foo = async x => x * x; +var foo = async (a, b) => a * b; diff --git a/packages/babel-generator/test/fixtures/types/ArrowFunctionExpression/expected.js b/packages/babel-generator/test/fixtures/types/ArrowFunctionExpression/expected.js new file mode 100644 index 0000000000..359ef770df --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ArrowFunctionExpression/expected.js @@ -0,0 +1,4 @@ +var foo = x => x * x; +var foo = (a, b) => a * b; +var foo = async x => x * x; +var foo = async (a, b) => a * b; diff --git a/packages/babel-generator/test/fixtures/types/AssignmentExpression-BinaryExpression-LogicalExpression/actual.js b/packages/babel-generator/test/fixtures/types/AssignmentExpression-BinaryExpression-LogicalExpression/actual.js new file mode 100644 index 0000000000..5cdce74d9b --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/AssignmentExpression-BinaryExpression-LogicalExpression/actual.js @@ -0,0 +1,3 @@ +foo === bar; +foo + bar; +foo = bar; diff --git a/packages/babel-generator/test/fixtures/types/AssignmentExpression-BinaryExpression-LogicalExpression/expected.js b/packages/babel-generator/test/fixtures/types/AssignmentExpression-BinaryExpression-LogicalExpression/expected.js new file mode 100644 index 0000000000..5cdce74d9b --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/AssignmentExpression-BinaryExpression-LogicalExpression/expected.js @@ -0,0 +1,3 @@ +foo === bar; +foo + bar; +foo = bar; diff --git a/packages/babel-generator/test/fixtures/types/AwaitExpression/actual.js b/packages/babel-generator/test/fixtures/types/AwaitExpression/actual.js new file mode 100644 index 0000000000..17bd494915 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/AwaitExpression/actual.js @@ -0,0 +1,7 @@ +async function foo() { + await bar(); +} + +async function bar() { + await* foo(); +} diff --git a/packages/babel-generator/test/fixtures/types/AwaitExpression/expected.js b/packages/babel-generator/test/fixtures/types/AwaitExpression/expected.js new file mode 100644 index 0000000000..17bd494915 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/AwaitExpression/expected.js @@ -0,0 +1,7 @@ +async function foo() { + await bar(); +} + +async function bar() { + await* foo(); +} diff --git a/packages/babel-generator/test/fixtures/types/BindExpression/actual.js b/packages/babel-generator/test/fixtures/types/BindExpression/actual.js new file mode 100644 index 0000000000..c78d72da44 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/BindExpression/actual.js @@ -0,0 +1,5 @@ +::foo.bar.foo; +::foo.bar["foo"]; + +ctx::foo.bar.foo; +ctx::foo.bar["foo"]; diff --git a/packages/babel-generator/test/fixtures/types/BindExpression/expected.js b/packages/babel-generator/test/fixtures/types/BindExpression/expected.js new file mode 100644 index 0000000000..c78d72da44 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/BindExpression/expected.js @@ -0,0 +1,5 @@ +::foo.bar.foo; +::foo.bar["foo"]; + +ctx::foo.bar.foo; +ctx::foo.bar["foo"]; diff --git a/packages/babel-generator/test/fixtures/types/BlockStatement/actual.js b/packages/babel-generator/test/fixtures/types/BlockStatement/actual.js new file mode 100644 index 0000000000..f9ce0d4e58 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/BlockStatement/actual.js @@ -0,0 +1,5 @@ +{} + +{ + foo(); +} diff --git a/packages/babel-generator/test/fixtures/types/BlockStatement/expected.js b/packages/babel-generator/test/fixtures/types/BlockStatement/expected.js new file mode 100644 index 0000000000..f9ce0d4e58 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/BlockStatement/expected.js @@ -0,0 +1,5 @@ +{} + +{ + foo(); +} diff --git a/packages/babel-generator/test/fixtures/types/BreakStatement/actual.js b/packages/babel-generator/test/fixtures/types/BreakStatement/actual.js new file mode 100644 index 0000000000..21e486a7df --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/BreakStatement/actual.js @@ -0,0 +1,7 @@ +for (var i in foo) { + break; +} + +foo: for (var i in foo) { + break foo; +} diff --git a/packages/babel-generator/test/fixtures/types/BreakStatement/expected.js b/packages/babel-generator/test/fixtures/types/BreakStatement/expected.js new file mode 100644 index 0000000000..21e486a7df --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/BreakStatement/expected.js @@ -0,0 +1,7 @@ +for (var i in foo) { + break; +} + +foo: for (var i in foo) { + break foo; +} diff --git a/packages/babel-generator/test/fixtures/types/CallExpression/actual.js b/packages/babel-generator/test/fixtures/types/CallExpression/actual.js new file mode 100644 index 0000000000..356fa149e2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/CallExpression/actual.js @@ -0,0 +1,5 @@ +foo(); +foo("foo"); +foo("foo", "bar"); +foo(bar()); +foo(bar("test")); diff --git a/packages/babel-generator/test/fixtures/types/CallExpression/expected.js b/packages/babel-generator/test/fixtures/types/CallExpression/expected.js new file mode 100644 index 0000000000..356fa149e2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/CallExpression/expected.js @@ -0,0 +1,5 @@ +foo(); +foo("foo"); +foo("foo", "bar"); +foo(bar()); +foo(bar("test")); diff --git a/packages/babel-generator/test/fixtures/types/ClassBody-MethodDefinition/actual.js b/packages/babel-generator/test/fixtures/types/ClassBody-MethodDefinition/actual.js new file mode 100644 index 0000000000..1e431aa75b --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ClassBody-MethodDefinition/actual.js @@ -0,0 +1,13 @@ +class Foo { + async foo() {} + foo() {} + ["foo"]() {} + get foo() {} + set foo(bar) {} + + static async foo() {} + static foo() {} + static ["foo"]() {} + static get foo() {} + static set foo(bar) {} +} diff --git a/packages/babel-generator/test/fixtures/types/ClassBody-MethodDefinition/expected.js b/packages/babel-generator/test/fixtures/types/ClassBody-MethodDefinition/expected.js new file mode 100644 index 0000000000..1e431aa75b --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ClassBody-MethodDefinition/expected.js @@ -0,0 +1,13 @@ +class Foo { + async foo() {} + foo() {} + ["foo"]() {} + get foo() {} + set foo(bar) {} + + static async foo() {} + static foo() {} + static ["foo"]() {} + static get foo() {} + static set foo(bar) {} +} diff --git a/packages/babel-generator/test/fixtures/types/ClassDeclaration/actual.js b/packages/babel-generator/test/fixtures/types/ClassDeclaration/actual.js new file mode 100644 index 0000000000..072c7c10e6 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ClassDeclaration/actual.js @@ -0,0 +1,2 @@ +var foo = class Foo {}; +var foo = class Foo extends Bar {}; diff --git a/packages/babel-generator/test/fixtures/types/ClassDeclaration/expected.js b/packages/babel-generator/test/fixtures/types/ClassDeclaration/expected.js new file mode 100644 index 0000000000..072c7c10e6 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ClassDeclaration/expected.js @@ -0,0 +1,2 @@ +var foo = class Foo {}; +var foo = class Foo extends Bar {}; diff --git a/packages/babel-generator/test/fixtures/types/ClassExpression/actual.js b/packages/babel-generator/test/fixtures/types/ClassExpression/actual.js new file mode 100644 index 0000000000..1931f1faea --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ClassExpression/actual.js @@ -0,0 +1,2 @@ +class Foo {} +class Foo extends Bar {} diff --git a/packages/babel-generator/test/fixtures/types/ClassExpression/expected.js b/packages/babel-generator/test/fixtures/types/ClassExpression/expected.js new file mode 100644 index 0000000000..1931f1faea --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ClassExpression/expected.js @@ -0,0 +1,2 @@ +class Foo {} +class Foo extends Bar {} diff --git a/packages/babel-generator/test/fixtures/types/ConditionalExpression/actual.js b/packages/babel-generator/test/fixtures/types/ConditionalExpression/actual.js new file mode 100644 index 0000000000..58ab924af4 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ConditionalExpression/actual.js @@ -0,0 +1 @@ +foo ? foo : bar; diff --git a/packages/babel-generator/test/fixtures/types/ConditionalExpression/expected.js b/packages/babel-generator/test/fixtures/types/ConditionalExpression/expected.js new file mode 100644 index 0000000000..58ab924af4 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ConditionalExpression/expected.js @@ -0,0 +1 @@ +foo ? foo : bar; diff --git a/packages/babel-generator/test/fixtures/types/ContinueStatement/actual.js b/packages/babel-generator/test/fixtures/types/ContinueStatement/actual.js new file mode 100644 index 0000000000..593fe2c367 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ContinueStatement/actual.js @@ -0,0 +1,7 @@ +for (var i in foo) { + continue; +} + +foo: for (var i in foo) { + continue foo; +} diff --git a/packages/babel-generator/test/fixtures/types/ContinueStatement/expected.js b/packages/babel-generator/test/fixtures/types/ContinueStatement/expected.js new file mode 100644 index 0000000000..593fe2c367 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ContinueStatement/expected.js @@ -0,0 +1,7 @@ +for (var i in foo) { + continue; +} + +foo: for (var i in foo) { + continue foo; +} diff --git a/packages/babel-generator/test/fixtures/types/DebuggerStatement/actual.js b/packages/babel-generator/test/fixtures/types/DebuggerStatement/actual.js new file mode 100644 index 0000000000..eab7469213 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/DebuggerStatement/actual.js @@ -0,0 +1 @@ +debugger; diff --git a/packages/babel-generator/test/fixtures/types/DebuggerStatement/expected.js b/packages/babel-generator/test/fixtures/types/DebuggerStatement/expected.js new file mode 100644 index 0000000000..eab7469213 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/DebuggerStatement/expected.js @@ -0,0 +1 @@ +debugger; diff --git a/packages/babel-generator/test/fixtures/types/Decorator/actual.js b/packages/babel-generator/test/fixtures/types/Decorator/actual.js new file mode 100644 index 0000000000..d0b6d43621 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Decorator/actual.js @@ -0,0 +1,31 @@ +var obj = { + @foo + @bar + foo: "bar", + + @foo + @bar + foo() {}, + + @foo + get foo() {}, + + @bar + set bar(foo) {} +}; + +class Foo { + @foo + @bar + foo() {} + + @foo + @bar + foo() {} + + @foo + get foo() {} + + @bar + set bar(foo) {} +} diff --git a/packages/babel-generator/test/fixtures/types/Decorator/expected.js b/packages/babel-generator/test/fixtures/types/Decorator/expected.js new file mode 100644 index 0000000000..d0b6d43621 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Decorator/expected.js @@ -0,0 +1,31 @@ +var obj = { + @foo + @bar + foo: "bar", + + @foo + @bar + foo() {}, + + @foo + get foo() {}, + + @bar + set bar(foo) {} +}; + +class Foo { + @foo + @bar + foo() {} + + @foo + @bar + foo() {} + + @foo + get foo() {} + + @bar + set bar(foo) {} +} diff --git a/packages/babel-generator/test/fixtures/types/DoWhileStatement/actual.js b/packages/babel-generator/test/fixtures/types/DoWhileStatement/actual.js new file mode 100644 index 0000000000..c567c9b0c5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/DoWhileStatement/actual.js @@ -0,0 +1,5 @@ +do { + test(); +} while (true); + +do {} while (true); diff --git a/packages/babel-generator/test/fixtures/types/DoWhileStatement/expected.js b/packages/babel-generator/test/fixtures/types/DoWhileStatement/expected.js new file mode 100644 index 0000000000..c567c9b0c5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/DoWhileStatement/expected.js @@ -0,0 +1,5 @@ +do { + test(); +} while (true); + +do {} while (true); diff --git a/packages/babel-generator/test/fixtures/types/EmptyStatement/actual.js b/packages/babel-generator/test/fixtures/types/EmptyStatement/actual.js new file mode 100644 index 0000000000..092bc2b041 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/EmptyStatement/actual.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-generator/test/fixtures/types/EmptyStatement/expected.js b/packages/babel-generator/test/fixtures/types/EmptyStatement/expected.js new file mode 100644 index 0000000000..092bc2b041 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/EmptyStatement/expected.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-generator/test/fixtures/types/ExportDefaultDeclaration-ExportSpecifier-ExportNamedDeclaration/actual.js b/packages/babel-generator/test/fixtures/types/ExportDefaultDeclaration-ExportSpecifier-ExportNamedDeclaration/actual.js new file mode 100644 index 0000000000..288b335663 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ExportDefaultDeclaration-ExportSpecifier-ExportNamedDeclaration/actual.js @@ -0,0 +1,31 @@ +export default 42; +export default {}; +export default []; +export default foo; +export default function () {} +export default class {} +export default function foo() {} +export default class Foo {} +export * from "foo"; +export * as foo from "foo"; +export foo from "foo"; +export * as foo, { bar } from "foo"; +export foo, { bar } from "foo"; +export { foo } from "foo"; +export { foo, bar } from "foo"; +export { foo as bar } from "foo"; +export { foo as default } from "foo"; +export { foo as default, bar } from "foo"; +export { foo }; +export { foo, bar }; +export { foo as bar }; +export { foo as default }; +export { foo as default, bar }; +export var foo = 1; +export var foo2 = function () {}; +export var foo3; +export let foo4 = 2; +export let foo5; +export const foo6 = 3; +export function foo7() {} +export class foo8 {} diff --git a/packages/babel-generator/test/fixtures/types/ExportDefaultDeclaration-ExportSpecifier-ExportNamedDeclaration/expected.js b/packages/babel-generator/test/fixtures/types/ExportDefaultDeclaration-ExportSpecifier-ExportNamedDeclaration/expected.js new file mode 100644 index 0000000000..288b335663 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ExportDefaultDeclaration-ExportSpecifier-ExportNamedDeclaration/expected.js @@ -0,0 +1,31 @@ +export default 42; +export default {}; +export default []; +export default foo; +export default function () {} +export default class {} +export default function foo() {} +export default class Foo {} +export * from "foo"; +export * as foo from "foo"; +export foo from "foo"; +export * as foo, { bar } from "foo"; +export foo, { bar } from "foo"; +export { foo } from "foo"; +export { foo, bar } from "foo"; +export { foo as bar } from "foo"; +export { foo as default } from "foo"; +export { foo as default, bar } from "foo"; +export { foo }; +export { foo, bar }; +export { foo as bar }; +export { foo as default }; +export { foo as default, bar }; +export var foo = 1; +export var foo2 = function () {}; +export var foo3; +export let foo4 = 2; +export let foo5; +export const foo6 = 3; +export function foo7() {} +export class foo8 {} diff --git a/packages/babel-generator/test/fixtures/types/ForInStatement/actual.js b/packages/babel-generator/test/fixtures/types/ForInStatement/actual.js new file mode 100644 index 0000000000..f767fe3b0f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ForInStatement/actual.js @@ -0,0 +1,5 @@ +for (var i in nums) {} + +for (var i in nums) { + nums[i] = nums[i] * nums[i]; +} diff --git a/packages/babel-generator/test/fixtures/types/ForInStatement/expected.js b/packages/babel-generator/test/fixtures/types/ForInStatement/expected.js new file mode 100644 index 0000000000..f767fe3b0f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ForInStatement/expected.js @@ -0,0 +1,5 @@ +for (var i in nums) {} + +for (var i in nums) { + nums[i] = nums[i] * nums[i]; +} diff --git a/packages/babel-generator/test/fixtures/types/ForOfStatement/actual.js b/packages/babel-generator/test/fixtures/types/ForOfStatement/actual.js new file mode 100644 index 0000000000..190da9ebfa --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ForOfStatement/actual.js @@ -0,0 +1,5 @@ +for (var x of nums) {} + +for (var x of nums) { + console.log(x * x); +} diff --git a/packages/babel-generator/test/fixtures/types/ForOfStatement/expected.js b/packages/babel-generator/test/fixtures/types/ForOfStatement/expected.js new file mode 100644 index 0000000000..190da9ebfa --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ForOfStatement/expected.js @@ -0,0 +1,5 @@ +for (var x of nums) {} + +for (var x of nums) { + console.log(x * x); +} diff --git a/packages/babel-generator/test/fixtures/types/ForStatement/actual.js b/packages/babel-generator/test/fixtures/types/ForStatement/actual.js new file mode 100644 index 0000000000..1f82486abe --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ForStatement/actual.js @@ -0,0 +1,3 @@ +for (var i = 0;;) {} +for (var i = 0; i < 5;) {} +for (var i = 0; i < 5; i++) {} diff --git a/packages/babel-generator/test/fixtures/types/ForStatement/expected.js b/packages/babel-generator/test/fixtures/types/ForStatement/expected.js new file mode 100644 index 0000000000..1f82486abe --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ForStatement/expected.js @@ -0,0 +1,3 @@ +for (var i = 0;;) {} +for (var i = 0; i < 5;) {} +for (var i = 0; i < 5; i++) {} diff --git a/packages/babel-generator/test/fixtures/types/FunctionDeclaration-FunctionExpression/actual.js b/packages/babel-generator/test/fixtures/types/FunctionDeclaration-FunctionExpression/actual.js new file mode 100644 index 0000000000..3b31e93eb7 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/FunctionDeclaration-FunctionExpression/actual.js @@ -0,0 +1,23 @@ +function foo(bar = "bar") {} + +function foo(bar = "bar", ...items) {} + +function foo(...items) {} + +function* foo() {} + +function foo() {} + +async function foo() {} + +var foo = function* foo() {}; + +var foo = function foo() {}; + +var foo = async function foo() {}; + +var foo = function* () {}; + +var foo = function () {}; + +var foo = async function () {}; diff --git a/packages/babel-generator/test/fixtures/types/FunctionDeclaration-FunctionExpression/expected.js b/packages/babel-generator/test/fixtures/types/FunctionDeclaration-FunctionExpression/expected.js new file mode 100644 index 0000000000..3b31e93eb7 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/FunctionDeclaration-FunctionExpression/expected.js @@ -0,0 +1,23 @@ +function foo(bar = "bar") {} + +function foo(bar = "bar", ...items) {} + +function foo(...items) {} + +function* foo() {} + +function foo() {} + +async function foo() {} + +var foo = function* foo() {}; + +var foo = function foo() {}; + +var foo = async function foo() {}; + +var foo = function* () {}; + +var foo = function () {}; + +var foo = async function () {}; diff --git a/packages/babel-generator/test/fixtures/types/Identifier/actual.js b/packages/babel-generator/test/fixtures/types/Identifier/actual.js new file mode 100644 index 0000000000..ef20d940c5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Identifier/actual.js @@ -0,0 +1,2 @@ +foo; +undefined; diff --git a/packages/babel-generator/test/fixtures/types/Identifier/expected.js b/packages/babel-generator/test/fixtures/types/Identifier/expected.js new file mode 100644 index 0000000000..ef20d940c5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Identifier/expected.js @@ -0,0 +1,2 @@ +foo; +undefined; diff --git a/packages/babel-generator/test/fixtures/types/IfStatement/actual.js b/packages/babel-generator/test/fixtures/types/IfStatement/actual.js new file mode 100644 index 0000000000..4631d3503f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/IfStatement/actual.js @@ -0,0 +1,25 @@ +if (foo) foobar(); + +if (foo) { + foobar(); +} + +if (foo) {} + +if (foo) { + foo(); +} else bar(); + +if (foo) { + foo(); +} else { + bar(); +} + +if (foo) { + foo(); +} else if (bar) { + foobar(); +} else { + bar(); +} diff --git a/packages/babel-generator/test/fixtures/types/IfStatement/expected.js b/packages/babel-generator/test/fixtures/types/IfStatement/expected.js new file mode 100644 index 0000000000..4631d3503f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/IfStatement/expected.js @@ -0,0 +1,25 @@ +if (foo) foobar(); + +if (foo) { + foobar(); +} + +if (foo) {} + +if (foo) { + foo(); +} else bar(); + +if (foo) { + foo(); +} else { + bar(); +} + +if (foo) { + foo(); +} else if (bar) { + foobar(); +} else { + bar(); +} diff --git a/packages/babel-generator/test/fixtures/types/ImportDeclaration-ImportSpecifier-ImportNamespaceSpecifier/actual.js b/packages/babel-generator/test/fixtures/types/ImportDeclaration-ImportSpecifier-ImportNamespaceSpecifier/actual.js new file mode 100644 index 0000000000..b7a4a4b9fd --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ImportDeclaration-ImportSpecifier-ImportNamespaceSpecifier/actual.js @@ -0,0 +1,9 @@ +import "foo"; +import foo from "foo"; +import { default as foo } from "foo"; +import * as foo from "foo"; +import foo, { baz as xyz } from "foo"; +import { bar } from "foo"; +import { bar, baz } from "foo"; +import { bar as baz } from "foo"; +import { bar as baz, xyz } from "foo"; diff --git a/packages/babel-generator/test/fixtures/types/ImportDeclaration-ImportSpecifier-ImportNamespaceSpecifier/expected.js b/packages/babel-generator/test/fixtures/types/ImportDeclaration-ImportSpecifier-ImportNamespaceSpecifier/expected.js new file mode 100644 index 0000000000..b7a4a4b9fd --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ImportDeclaration-ImportSpecifier-ImportNamespaceSpecifier/expected.js @@ -0,0 +1,9 @@ +import "foo"; +import foo from "foo"; +import { default as foo } from "foo"; +import * as foo from "foo"; +import foo, { baz as xyz } from "foo"; +import { bar } from "foo"; +import { bar, baz } from "foo"; +import { bar as baz } from "foo"; +import { bar as baz, xyz } from "foo"; diff --git a/packages/babel-generator/test/fixtures/types/LabeledStatement/actual.js b/packages/babel-generator/test/fixtures/types/LabeledStatement/actual.js new file mode 100644 index 0000000000..2846749406 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/LabeledStatement/actual.js @@ -0,0 +1 @@ +label: for (var i in test) {} diff --git a/packages/babel-generator/test/fixtures/types/LabeledStatement/expected.js b/packages/babel-generator/test/fixtures/types/LabeledStatement/expected.js new file mode 100644 index 0000000000..2846749406 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/LabeledStatement/expected.js @@ -0,0 +1 @@ +label: for (var i in test) {} diff --git a/packages/babel-generator/test/fixtures/types/Literal/actual.js b/packages/babel-generator/test/fixtures/types/Literal/actual.js new file mode 100644 index 0000000000..6bd9f84a96 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Literal/actual.js @@ -0,0 +1,12 @@ +5; +5.0; +"foobar"; +"\n\r\u2028\u2029"; +/foobar/g; +null; +true; +false; +5.; +0b10; +0o70; +0X1F; diff --git a/packages/babel-generator/test/fixtures/types/Literal/expected.js b/packages/babel-generator/test/fixtures/types/Literal/expected.js new file mode 100644 index 0000000000..6bd9f84a96 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Literal/expected.js @@ -0,0 +1,12 @@ +5; +5.0; +"foobar"; +"\n\r\u2028\u2029"; +/foobar/g; +null; +true; +false; +5.; +0b10; +0o70; +0X1F; diff --git a/packages/babel-generator/test/fixtures/types/MemberExpression/actual.js b/packages/babel-generator/test/fixtures/types/MemberExpression/actual.js new file mode 100644 index 0000000000..b1b488aa12 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/MemberExpression/actual.js @@ -0,0 +1,11 @@ +foo["bar"]; +foo.bar; + +foo.bar.foo; +foo.bar["foo"]; + +foo["foo"]["bar"]; +foo[test()][bar()]; + +0..toString(); +0.5.toString(); diff --git a/packages/babel-generator/test/fixtures/types/MemberExpression/expected.js b/packages/babel-generator/test/fixtures/types/MemberExpression/expected.js new file mode 100644 index 0000000000..b1b488aa12 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/MemberExpression/expected.js @@ -0,0 +1,11 @@ +foo["bar"]; +foo.bar; + +foo.bar.foo; +foo.bar["foo"]; + +foo["foo"]["bar"]; +foo[test()][bar()]; + +0..toString(); +0.5.toString(); diff --git a/packages/babel-generator/test/fixtures/types/NewExpression/actual.js b/packages/babel-generator/test/fixtures/types/NewExpression/actual.js new file mode 100644 index 0000000000..2e4ccdb39d --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/NewExpression/actual.js @@ -0,0 +1,3 @@ +new Foo; +new Foo(); +new Foo(bar); diff --git a/packages/babel-generator/test/fixtures/types/NewExpression/expected.js b/packages/babel-generator/test/fixtures/types/NewExpression/expected.js new file mode 100644 index 0000000000..962d55bf72 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/NewExpression/expected.js @@ -0,0 +1,3 @@ +new Foo(); +new Foo(); +new Foo(bar); diff --git a/packages/babel-generator/test/fixtures/types/ObjectExpression-ObjectPattern-Property/actual.js b/packages/babel-generator/test/fixtures/types/ObjectExpression-ObjectPattern-Property/actual.js new file mode 100644 index 0000000000..5dff240f1e --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ObjectExpression-ObjectPattern-Property/actual.js @@ -0,0 +1,20 @@ +var foo = {}; + +var foo = { x, y }; + +var foo = { x: x, y: y }; + +var foo = { + x: x, + y: y +}; + +var foo = { + ["bar"]: "foo", + ["foo"]() {}, + foo() {}, + async foo() {}, + *foo() {}, + get foo() {}, + set foo(foo) {} +}; diff --git a/packages/babel-generator/test/fixtures/types/ObjectExpression-ObjectPattern-Property/expected.js b/packages/babel-generator/test/fixtures/types/ObjectExpression-ObjectPattern-Property/expected.js new file mode 100644 index 0000000000..5dff240f1e --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ObjectExpression-ObjectPattern-Property/expected.js @@ -0,0 +1,20 @@ +var foo = {}; + +var foo = { x, y }; + +var foo = { x: x, y: y }; + +var foo = { + x: x, + y: y +}; + +var foo = { + ["bar"]: "foo", + ["foo"]() {}, + foo() {}, + async foo() {}, + *foo() {}, + get foo() {}, + set foo(foo) {} +}; diff --git a/packages/babel-generator/test/fixtures/types/ReturnStatement/actual.js b/packages/babel-generator/test/fixtures/types/ReturnStatement/actual.js new file mode 100644 index 0000000000..404a7c2e64 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ReturnStatement/actual.js @@ -0,0 +1,7 @@ +function foo() { + return; +} + +function bar() { + return "foo"; +} diff --git a/packages/babel-generator/test/fixtures/types/ReturnStatement/expected.js b/packages/babel-generator/test/fixtures/types/ReturnStatement/expected.js new file mode 100644 index 0000000000..404a7c2e64 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ReturnStatement/expected.js @@ -0,0 +1,7 @@ +function foo() { + return; +} + +function bar() { + return "foo"; +} diff --git a/packages/babel-generator/test/fixtures/types/SequenceExpression/actual.js b/packages/babel-generator/test/fixtures/types/SequenceExpression/actual.js new file mode 100644 index 0000000000..df1a8bc422 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/SequenceExpression/actual.js @@ -0,0 +1,4 @@ +foo, bar; + +foo, +bar; diff --git a/packages/babel-generator/test/fixtures/types/SequenceExpression/expected.js b/packages/babel-generator/test/fixtures/types/SequenceExpression/expected.js new file mode 100644 index 0000000000..8a6b86f823 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/SequenceExpression/expected.js @@ -0,0 +1,3 @@ +foo, bar; + +foo, bar; diff --git a/packages/babel-generator/test/fixtures/types/SpreadElement-SpreadProperty/actual.js b/packages/babel-generator/test/fixtures/types/SpreadElement-SpreadProperty/actual.js new file mode 100644 index 0000000000..7a9e438858 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/SpreadElement-SpreadProperty/actual.js @@ -0,0 +1,3 @@ +[...foo]; +foo(bar, ...items); +new Foo(...foo); diff --git a/packages/babel-generator/test/fixtures/types/SpreadElement-SpreadProperty/expected.js b/packages/babel-generator/test/fixtures/types/SpreadElement-SpreadProperty/expected.js new file mode 100644 index 0000000000..7a9e438858 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/SpreadElement-SpreadProperty/expected.js @@ -0,0 +1,3 @@ +[...foo]; +foo(bar, ...items); +new Foo(...foo); diff --git a/packages/babel-generator/test/fixtures/types/SwitchStatement-SwitchCase/actual.js b/packages/babel-generator/test/fixtures/types/SwitchStatement-SwitchCase/actual.js new file mode 100644 index 0000000000..dbfef765fe --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/SwitchStatement-SwitchCase/actual.js @@ -0,0 +1,39 @@ +switch (foo) {} + +switch (foo) { + case "foo": +} + +switch (foo) { + default: +} + +switch (foo) { + case "foo": + default: +} + +switch (foo) { + case "foo": + case "bar": + default: +} + +switch (foo) { + case "foo": + foo(); + break; + + case "bar": + bar(); + break; + + default: + yay(); +} + +switch (foo) { + case "foo": foo(); + case "bar": bar(); + default: yay(); +} diff --git a/packages/babel-generator/test/fixtures/types/SwitchStatement-SwitchCase/expected.js b/packages/babel-generator/test/fixtures/types/SwitchStatement-SwitchCase/expected.js new file mode 100644 index 0000000000..3fee51a4d2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/SwitchStatement-SwitchCase/expected.js @@ -0,0 +1,42 @@ +switch (foo) {} + +switch (foo) { + case "foo": +} + +switch (foo) { + default: +} + +switch (foo) { + case "foo": + default: +} + +switch (foo) { + case "foo": + case "bar": + default: +} + +switch (foo) { + case "foo": + foo(); + break; + + case "bar": + bar(); + break; + + default: + yay(); +} + +switch (foo) { + case "foo": + foo(); + case "bar": + bar(); + default: + yay(); +} diff --git a/packages/babel-generator/test/fixtures/types/TemplateLiteral-TaggedTemplateExpression-TemplateElement/actual.js b/packages/babel-generator/test/fixtures/types/TemplateLiteral-TaggedTemplateExpression-TemplateElement/actual.js new file mode 100644 index 0000000000..455ed642b5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/TemplateLiteral-TaggedTemplateExpression-TemplateElement/actual.js @@ -0,0 +1,12 @@ +html``; + +`multi + lines`; + +`test ${ interpolation } test`; + +`foob + + asdf +awer + erqer`; diff --git a/packages/babel-generator/test/fixtures/types/TemplateLiteral-TaggedTemplateExpression-TemplateElement/expected.js b/packages/babel-generator/test/fixtures/types/TemplateLiteral-TaggedTemplateExpression-TemplateElement/expected.js new file mode 100644 index 0000000000..455ed642b5 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/TemplateLiteral-TaggedTemplateExpression-TemplateElement/expected.js @@ -0,0 +1,12 @@ +html``; + +`multi + lines`; + +`test ${ interpolation } test`; + +`foob + + asdf +awer + erqer`; diff --git a/packages/babel-generator/test/fixtures/types/ThisExpression/actual.js b/packages/babel-generator/test/fixtures/types/ThisExpression/actual.js new file mode 100644 index 0000000000..0ce825c42a --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ThisExpression/actual.js @@ -0,0 +1,5 @@ +this; +this.foo; +this["foo"]; +this.foo(); +this["foo"](); diff --git a/packages/babel-generator/test/fixtures/types/ThisExpression/expected.js b/packages/babel-generator/test/fixtures/types/ThisExpression/expected.js new file mode 100644 index 0000000000..0ce825c42a --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ThisExpression/expected.js @@ -0,0 +1,5 @@ +this; +this.foo; +this["foo"]; +this.foo(); +this["foo"](); diff --git a/packages/babel-generator/test/fixtures/types/ThrowStatement/actual.js b/packages/babel-generator/test/fixtures/types/ThrowStatement/actual.js new file mode 100644 index 0000000000..15dd4fc7b2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ThrowStatement/actual.js @@ -0,0 +1,3 @@ +throw err; +throw Error("foobar"); +throw new Error("foobar"); diff --git a/packages/babel-generator/test/fixtures/types/ThrowStatement/expected.js b/packages/babel-generator/test/fixtures/types/ThrowStatement/expected.js new file mode 100644 index 0000000000..15dd4fc7b2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ThrowStatement/expected.js @@ -0,0 +1,3 @@ +throw err; +throw Error("foobar"); +throw new Error("foobar"); diff --git a/packages/babel-generator/test/fixtures/types/TryStatement-CatchClause/actual.js b/packages/babel-generator/test/fixtures/types/TryStatement-CatchClause/actual.js new file mode 100644 index 0000000000..95717a83b6 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/TryStatement-CatchClause/actual.js @@ -0,0 +1,25 @@ +try {} catch (err) {} + +try { + bar; +} catch (err) {} + +try { + bar; +} catch (err) { + foo(); +} + +try { + bar; +} catch (err) { + foo(); +} finally { + yay(); +} + +try { + bar; +} catch (err) { + foo(); +} finally {} diff --git a/packages/babel-generator/test/fixtures/types/TryStatement-CatchClause/expected.js b/packages/babel-generator/test/fixtures/types/TryStatement-CatchClause/expected.js new file mode 100644 index 0000000000..95717a83b6 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/TryStatement-CatchClause/expected.js @@ -0,0 +1,25 @@ +try {} catch (err) {} + +try { + bar; +} catch (err) {} + +try { + bar; +} catch (err) { + foo(); +} + +try { + bar; +} catch (err) { + foo(); +} finally { + yay(); +} + +try { + bar; +} catch (err) { + foo(); +} finally {} diff --git a/packages/babel-generator/test/fixtures/types/UnaryExpression/actual.js b/packages/babel-generator/test/fixtures/types/UnaryExpression/actual.js new file mode 100644 index 0000000000..9f318cdb1f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/UnaryExpression/actual.js @@ -0,0 +1,5 @@ +delete delete i; ++ +i; +!!i; ++ ++i; +- --i; diff --git a/packages/babel-generator/test/fixtures/types/UnaryExpression/expected.js b/packages/babel-generator/test/fixtures/types/UnaryExpression/expected.js new file mode 100644 index 0000000000..9f318cdb1f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/UnaryExpression/expected.js @@ -0,0 +1,5 @@ +delete delete i; ++ +i; +!!i; ++ ++i; +- --i; diff --git a/packages/babel-generator/test/fixtures/types/UpdateExpression/actual.js b/packages/babel-generator/test/fixtures/types/UpdateExpression/actual.js new file mode 100644 index 0000000000..0aba7be1a0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/UpdateExpression/actual.js @@ -0,0 +1,3 @@ +++i; +i++; +(foo++).test(); diff --git a/packages/babel-generator/test/fixtures/types/UpdateExpression/expected.js b/packages/babel-generator/test/fixtures/types/UpdateExpression/expected.js new file mode 100644 index 0000000000..0aba7be1a0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/UpdateExpression/expected.js @@ -0,0 +1,3 @@ +++i; +i++; +(foo++).test(); diff --git a/packages/babel-generator/test/fixtures/types/VariableDeclaration-VariableDeclarator/actual.js b/packages/babel-generator/test/fixtures/types/VariableDeclaration-VariableDeclarator/actual.js new file mode 100644 index 0000000000..ede42c53ec --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/VariableDeclaration-VariableDeclarator/actual.js @@ -0,0 +1,13 @@ +let foo; +var foo; + +let foo = "foo"; +var foo = "bar"; +const foo = "foo"; + +let foo, bar = "bar"; +var foo, bar = "bar"; + +let foo = "foo", bar = "bar"; +var foo = "foo", bar = "bar"; +const foo = "foo", bar = "bar"; diff --git a/packages/babel-generator/test/fixtures/types/VariableDeclaration-VariableDeclarator/expected.js b/packages/babel-generator/test/fixtures/types/VariableDeclaration-VariableDeclarator/expected.js new file mode 100644 index 0000000000..487fff2ae2 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/VariableDeclaration-VariableDeclarator/expected.js @@ -0,0 +1,18 @@ +let foo; +var foo; + +let foo = "foo"; +var foo = "bar"; +const foo = "foo"; + +let foo, + bar = "bar"; +var foo, + bar = "bar"; + +let foo = "foo", + bar = "bar"; +var foo = "foo", + bar = "bar"; +const foo = "foo", + bar = "bar"; diff --git a/packages/babel-generator/test/fixtures/types/WhileStatement/actual.js b/packages/babel-generator/test/fixtures/types/WhileStatement/actual.js new file mode 100644 index 0000000000..616c1dcd45 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/WhileStatement/actual.js @@ -0,0 +1,5 @@ +while (foo) {} + +while (foo) { + bar(); +} diff --git a/packages/babel-generator/test/fixtures/types/WhileStatement/expected.js b/packages/babel-generator/test/fixtures/types/WhileStatement/expected.js new file mode 100644 index 0000000000..616c1dcd45 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/WhileStatement/expected.js @@ -0,0 +1,5 @@ +while (foo) {} + +while (foo) { + bar(); +} diff --git a/packages/babel-generator/test/fixtures/types/WithStatement/actual.js b/packages/babel-generator/test/fixtures/types/WithStatement/actual.js new file mode 100644 index 0000000000..eb30b5f541 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/WithStatement/actual.js @@ -0,0 +1,5 @@ +with (foo) {} + +with (foo) { + bar(); +} diff --git a/packages/babel-generator/test/fixtures/types/WithStatement/expected.js b/packages/babel-generator/test/fixtures/types/WithStatement/expected.js new file mode 100644 index 0000000000..eb30b5f541 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/WithStatement/expected.js @@ -0,0 +1,5 @@ +with (foo) {} + +with (foo) { + bar(); +} diff --git a/packages/babel-generator/test/fixtures/types/XJSAttribute/actual.js b/packages/babel-generator/test/fixtures/types/XJSAttribute/actual.js new file mode 100644 index 0000000000..ff8711dc2f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSAttribute/actual.js @@ -0,0 +1,7 @@ +
; + +
text
; + +
; + +
text
; diff --git a/packages/babel-generator/test/fixtures/types/XJSAttribute/expected.js b/packages/babel-generator/test/fixtures/types/XJSAttribute/expected.js new file mode 100644 index 0000000000..ff8711dc2f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSAttribute/expected.js @@ -0,0 +1,7 @@ +
; + +
text
; + +
; + +
text
; diff --git a/packages/babel-generator/test/fixtures/types/XJSElement-XJSOpeningElement-XJSClosingElement-XJSIdentifier/actual.js b/packages/babel-generator/test/fixtures/types/XJSElement-XJSOpeningElement-XJSClosingElement-XJSIdentifier/actual.js new file mode 100644 index 0000000000..4ef54fa621 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSElement-XJSOpeningElement-XJSClosingElement-XJSIdentifier/actual.js @@ -0,0 +1,5 @@ +
; + +
; + +
text
; diff --git a/packages/babel-generator/test/fixtures/types/XJSElement-XJSOpeningElement-XJSClosingElement-XJSIdentifier/expected.js b/packages/babel-generator/test/fixtures/types/XJSElement-XJSOpeningElement-XJSClosingElement-XJSIdentifier/expected.js new file mode 100644 index 0000000000..4ef54fa621 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSElement-XJSOpeningElement-XJSClosingElement-XJSIdentifier/expected.js @@ -0,0 +1,5 @@ +
; + +
; + +
text
; diff --git a/packages/babel-generator/test/fixtures/types/XJSEmptyExpression/actual.js b/packages/babel-generator/test/fixtures/types/XJSEmptyExpression/actual.js new file mode 100644 index 0000000000..a7a4a7e533 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSEmptyExpression/actual.js @@ -0,0 +1 @@ +{}; diff --git a/packages/babel-generator/test/fixtures/types/XJSEmptyExpression/expected.js b/packages/babel-generator/test/fixtures/types/XJSEmptyExpression/expected.js new file mode 100644 index 0000000000..a7a4a7e533 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSEmptyExpression/expected.js @@ -0,0 +1 @@ +{}; diff --git a/packages/babel-generator/test/fixtures/types/XJSExpressionContainer/actual.js b/packages/babel-generator/test/fixtures/types/XJSExpressionContainer/actual.js new file mode 100644 index 0000000000..b7c8a18a62 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSExpressionContainer/actual.js @@ -0,0 +1 @@ +
{this.props.children}
; diff --git a/packages/babel-generator/test/fixtures/types/XJSExpressionContainer/expected.js b/packages/babel-generator/test/fixtures/types/XJSExpressionContainer/expected.js new file mode 100644 index 0000000000..b7c8a18a62 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSExpressionContainer/expected.js @@ -0,0 +1 @@ +
{this.props.children}
; diff --git a/packages/babel-generator/test/fixtures/types/XJSMemberExpression/actual.js b/packages/babel-generator/test/fixtures/types/XJSMemberExpression/actual.js new file mode 100644 index 0000000000..875ffe4f32 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSMemberExpression/actual.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-generator/test/fixtures/types/XJSMemberExpression/expected.js b/packages/babel-generator/test/fixtures/types/XJSMemberExpression/expected.js new file mode 100644 index 0000000000..875ffe4f32 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSMemberExpression/expected.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-generator/test/fixtures/types/XJSNamespacedName/actual.js b/packages/babel-generator/test/fixtures/types/XJSNamespacedName/actual.js new file mode 100644 index 0000000000..33efe268cf --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSNamespacedName/actual.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-generator/test/fixtures/types/XJSNamespacedName/expected.js b/packages/babel-generator/test/fixtures/types/XJSNamespacedName/expected.js new file mode 100644 index 0000000000..33efe268cf --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSNamespacedName/expected.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-generator/test/fixtures/types/XJSSpreadAttribute/actual.js b/packages/babel-generator/test/fixtures/types/XJSSpreadAttribute/actual.js new file mode 100644 index 0000000000..82aa5eb72d --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSSpreadAttribute/actual.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-generator/test/fixtures/types/XJSSpreadAttribute/expected.js b/packages/babel-generator/test/fixtures/types/XJSSpreadAttribute/expected.js new file mode 100644 index 0000000000..82aa5eb72d --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/XJSSpreadAttribute/expected.js @@ -0,0 +1 @@ +; diff --git a/packages/babel-generator/test/fixtures/types/YieldExpression/actual.js b/packages/babel-generator/test/fixtures/types/YieldExpression/actual.js new file mode 100644 index 0000000000..b37159854f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/YieldExpression/actual.js @@ -0,0 +1,7 @@ +function* foo() { + yield bar; +} + +function* bar() { + yield* foo(); +} diff --git a/packages/babel-generator/test/fixtures/types/YieldExpression/expected.js b/packages/babel-generator/test/fixtures/types/YieldExpression/expected.js new file mode 100644 index 0000000000..b37159854f --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/YieldExpression/expected.js @@ -0,0 +1,7 @@ +function* foo() { + yield bar; +} + +function* bar() { + yield* foo(); +} diff --git a/packages/babel-generator/test/index.js b/packages/babel-generator/test/index.js new file mode 100644 index 0000000000..2eb653eea9 --- /dev/null +++ b/packages/babel-generator/test/index.js @@ -0,0 +1,49 @@ +var generate = require("../lib"); +var assert = require("assert"); +var parse = require("babylon").parse; +var chai = require("chai"); +var t = require("babel-types"); +var _ = require("lodash"); + +suite("generation", function () { + test("completeness", function () { + _.each(t.VISITOR_KEYS, function (keys, type) { + assert.ok(!!generate.CodeGenerator.prototype[type], type + " should exist"); + }); + + _.each(generate.CodeGenerator.prototype, function (fn, type) { + if (!/[A-Z]/.test(type[0])) return; + assert.ok(t.VISITOR_KEYS[type], type + " should not exist"); + }); + }); +}); + +var suites = require("babel-helper-fixtures")(__dirname + "/fixtures"); + +suites.forEach(function (testSuite) { + suite("generation/" + testSuite.title, function () { + _.each(testSuite.tests, function (task) { + test(task.title, !task.disabled && function () { + var expect = task.expect; + var actual = task.actual; + + var actualAst = parse(actual.code, { + filename: actual.loc, + plugins: [ + "jsx", + "flow", + "decorators", + "asyncFunctions", + "exportExtensions", + "functionBind", + ], + strictMode: false, + sourceType: "module", + }); + + var actualCode = generate.default(actualAst, task.options, actual.code).code; + chai.expect(actualCode).to.equal(expect.code, actual.loc + " !== " + expect.loc); + }); + }); + }); +});