Merge pull request #3109 from phantom10111/additional-validators

Additional validators for CallExpression, NewExpresion,TemplateLiteral, ArrayExpression, SequenceExpression
This commit is contained in:
Henry Zhu
2015-11-29 21:35:18 -05:00
4 changed files with 41 additions and 8 deletions

View File

@@ -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),

View File

@@ -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"]
});

View File

@@ -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")))
}
}
});

View File

@@ -61,6 +61,27 @@ export function assertNodeType(...types: Array<string>): Function {
return validate;
}
export function assertNodeOrValueType(...types: Array<string>): 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;