'use strict'; var isArray = Array.isArray; var Node = require('./ast/Node'); var Program = require('./ast/Program'); var TemplateRoot = require('./ast/TemplateRoot'); var FunctionDeclaration = require('./ast/FunctionDeclaration'); var FunctionCall = require('./ast/FunctionCall'); var Literal = require('./ast/Literal'); var Identifier = require('./ast/Identifier'); var If = require('./ast/If'); var ElseIf = require('./ast/ElseIf'); var Else = require('./ast/Else'); var Assignment = require('./ast/Assignment'); var BinaryExpression = require('./ast/BinaryExpression'); var Vars = require('./ast/Vars'); var Return = require('./ast/Return'); var HtmlElement = require('./ast/HtmlElement'); var Html = require('./ast/Html'); var Text = require('./ast/Text'); var ForEach = require('./ast/ForEach'); var ForEachProp = require('./ast/ForEachProp'); var ForRange = require('./ast/ForRange'); var Slot = require('./ast/Slot'); var HtmlComment = require('./ast/HtmlComment'); var SelfInvokingFunction = require('./ast/SelfInvokingFunction'); var ForStatement = require('./ast/ForStatement'); var BinaryExpression = require('./ast/BinaryExpression'); var UpdateExpression = require('./ast/UpdateExpression'); var UnaryExpression = require('./ast/UnaryExpression'); var MemberExpression = require('./ast/MemberExpression'); var parseExpression = require('./util/parseExpression'); function makeNode(arg) { if (typeof arg === 'string') { return parseExpression(arg); } else if (arg instanceof Node) { return arg; } else { return undefined; } } class Builder { assignment(left, right, operator) { if (operator == null) { operator = '='; } left = makeNode(left); right = makeNode(right); return new Assignment({left, right, operator}); } binaryExpression(left, operator, right) { left = makeNode(left); right = makeNode(right); return new BinaryExpression({left, operator, right}); } elseStatement(body) { return new Else({body}); } elseIfStatement(test, body, elseStatement) { test = makeNode(test); return new ElseIf({test, body, else: elseStatement}); } expression(value) { return makeNode(value); } forEach(varName, inExpression, body) { if (arguments.length === 1) { var def = arguments[0]; return new ForEach(def); } else { varName = makeNode(varName); inExpression = makeNode(inExpression); return new ForEach({varName, in: inExpression, body}); } } forEachProp(nameVarName, valueVarName, inExpression, body) { if (arguments.length === 1) { var def = arguments[0]; return new ForEachProp(def); } else { nameVarName = makeNode(nameVarName); valueVarName = makeNode(valueVarName); inExpression = makeNode(inExpression); return new ForEachProp({nameVarName, valueVarName, in: inExpression, body}); } } forRange(varName, from, to, step, body) { if (arguments.length === 1) { var def = arguments[0]; return new ForRange(def); } else { varName = makeNode(varName); from = makeNode(from); to = makeNode(to); step = makeNode(step); body = makeNode(body); return new ForRange({varName, from, to, step, body}); } } forStatement(init, test, update, body) { if (arguments.length === 1) { var def = arguments[0]; return new ForStatement(def); } else { init = makeNode(init); test = makeNode(test); update = makeNode(update); return new ForStatement({init, test, update, body}); } } functionCall(callee, args) { callee = makeNode(callee); if (args) { if (!isArray(args)) { args = [args]; } for (var i=0; i { let id = new Identifier({name: key}); let init = makeNode(declarations[key]); return { id, init }; }); } } return new Vars({declarations, kind}); } } module.exports = Builder;