marko/compiler/Builder.js
2015-12-02 19:35:19 -07:00

133 lines
3.3 KiB
JavaScript

'use strict';
var isArray = Array.isArray;
var ok = require('assert').ok;
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 HtmlOutput = require('./ast/HtmlOutput');
var TextOutput = require('./ast/TextOutput');
var ForEach = require('./ast/ForEach');
var Slot = require('./ast/Slot');
var HtmlComment = require('./ast/HtmlComment');
class Builder {
program(body) {
return new Program({body});
}
templateRoot(body) {
return new TemplateRoot({body});
}
functionDeclaration(name, params, body) {
return new FunctionDeclaration({name, params, body});
}
functionCall(callee, args) {
if (args) {
if (!isArray(args)) {
args = [args];
}
} else {
args = [];
}
return new FunctionCall({callee, args});
}
literal(value) {
return new Literal({value});
}
identifier(name) {
return new Identifier({name});
}
ifStatement(test, body, elseStatement) {
return new If({test, body, else: elseStatement});
}
elseIfStatement(test, body, elseStatement) {
return new ElseIf({
if: new If({test, body, else: elseStatement})
});
}
elseStatement(body) {
return new Else({body});
}
assignment(left, right) {
return new Assignment({left, right});
}
strictEquality(left, right) {
var operator = '===';
return new BinaryExpression({left, right, operator});
}
vars(declarations, kind) {
return new Vars({declarations, kind});
}
returnStatement(argument) {
return new Return({argument});
}
htmlElement(tagName, attributes, body, argument) {
if (typeof tagName === 'object') {
let elInfo = tagName;
tagName = elInfo.tagName;
attributes = elInfo.attributes;
body = elInfo.body;
argument = elInfo.argument;
}
return new HtmlElement({tagName, attributes, body, argument});
}
htmlOutput(argument) {
return new HtmlOutput({argument});
}
textOutput(argument, escape) {
return new TextOutput({argument, escape});
}
htmlComment(comment) {
return new HtmlComment({comment});
}
forEach(varName, target, body) {
if (typeof varName === 'object') {
var options = varName;
return new ForEach(options);
} else {
return new ForEach({varName, target, body});
}
}
slot() {
return new Slot();
}
require(path) {
let callee = 'require';
let args = [ path ];
return new FunctionCall({callee, args});
}
}
module.exports = Builder;