diff --git a/packages/babel-helper-remap-async-to-generator/src/index.js b/packages/babel-helper-remap-async-to-generator/src/index.js index 27dbaa37ef..ea9e55e8d5 100644 --- a/packages/babel-helper-remap-async-to-generator/src/index.js +++ b/packages/babel-helper-remap-async-to-generator/src/index.js @@ -53,6 +53,12 @@ function plainFunction(path: NodePath, callId: Object) { let asyncFnId = node.id; node.id = null; + let isDeclaration = path.isFunctionDeclaration(); + + if (isDeclaration) { + node.type = "FunctionExpression"; + } + let built = t.callExpression(callId, [node]); let container = buildWrapper({ FUNCTION: built, @@ -61,9 +67,7 @@ function plainFunction(path: NodePath, callId: Object) { let retFunction = container.body.body[1].argument; - if (path.isFunctionDeclaration()) { - node.type = "FunctionExpression"; - + if (isDeclaration) { let declar = t.variableDeclaration("let", [ t.variableDeclarator( t.identifier(asyncFnId.name), diff --git a/packages/babel-types/src/definitions/core.js b/packages/babel-types/src/definitions/core.js index 49228d692c..623160163e 100644 --- a/packages/babel-types/src/definitions/core.js +++ b/packages/babel-types/src/definitions/core.js @@ -12,6 +12,7 @@ import { import defineType, { assertValueType, assertNodeType, + assertNodeOrValueType, assertEach, chain, assertOneOf, @@ -20,7 +21,7 @@ import defineType, { defineType("ArrayExpression", { fields: { elements: { - validate: assertValueType("array") + validate: chain(assertValueType("array"), assertEach(assertNodeOrValueType("null", "Expression", "SpreadElement"))) } }, visitor: ["elements"], @@ -112,7 +113,7 @@ defineType("CallExpression", { validate: assertNodeType("Expression") }, arguments: { - validate: assertValueType("array") + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression", "SpreadElement"))) } }, aliases: ["Expression"] @@ -435,7 +436,7 @@ defineType("NewExpression", { validate: assertNodeType("Expression") }, arguments: { - validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression"))) + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression", "SpreadElement"))) } } }); @@ -554,7 +555,9 @@ defineType("ReturnStatement", { defineType("SequenceExpression", { visitor: ["expressions"], fields: { - expressions: { validate: assertValueType("array") } + expressions: { + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression"))) + } }, aliases: ["Expression"] }); diff --git a/packages/babel-types/src/definitions/es2015.js b/packages/babel-types/src/definitions/es2015.js index e699ba3d18..d70cebd15d 100644 --- a/packages/babel-types/src/definitions/es2015.js +++ b/packages/babel-types/src/definitions/es2015.js @@ -329,7 +329,12 @@ defineType("TemplateLiteral", { visitor: ["quasis", "expressions"], aliases: ["Expression", "Literal"], fields: { - // todo + quasis: { + validate: chain(assertValueType("array"), assertEach(assertNodeType("TemplateElement"))) + }, + expressions: { + validate: chain(assertValueType("array"), assertEach(assertNodeType("Expression"))) + } } }); diff --git a/packages/babel-types/src/definitions/index.js b/packages/babel-types/src/definitions/index.js index dc0b4e64fe..2f6c7dfc76 100644 --- a/packages/babel-types/src/definitions/index.js +++ b/packages/babel-types/src/definitions/index.js @@ -61,6 +61,27 @@ export function assertNodeType(...types: Array): Function { return validate; } +export function assertNodeOrValueType(...types: Array): Function { + function validate(node, key, val) { + let valid = false; + + for (let type of types) { + if (getType(val) === type || t.is(type, val)) { + valid = true; + break; + } + } + + if (!valid) { + throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val && val.type)}`); + } + } + + validate.oneOfNodeOrValueTypes = types; + + return validate; +} + export function assertValueType(type: string): Function { function validate(node, key, val) { let valid = getType(val) === type;