UNPKG

aurelia-binding

Version:

A modern databinding library for JavaScript and HTML.

105 lines (84 loc) 2.84 kB
import { ValueConverter, Assign, Conditional, AccessThis, AccessScope, AccessMember, AccessKeyed, CallScope, CallFunction, CallMember, Unary, BindingBehavior, Binary, LiteralPrimitive, LiteralArray, LiteralObject, LiteralString, LiteralTemplate } from './ast'; export class ExpressionCloner { cloneExpressionArray(array) { let clonedArray = []; let i = array.length; while (i--) { clonedArray[i] = array[i].accept(this); } return clonedArray; } visitBindingBehavior(behavior) { return new BindingBehavior( behavior.expression.accept(this), behavior.name, this.cloneExpressionArray(behavior.args)); } visitValueConverter(converter) { return new ValueConverter( converter.expression.accept(this), converter.name, this.cloneExpressionArray(converter.args)); } visitAssign(assign) { return new Assign(assign.target.accept(this), assign.value.accept(this)); } visitConditional(conditional) { return new Conditional( conditional.condition.accept(this), conditional.yes.accept(this), conditional.no.accept(this)); } visitAccessThis(access) { return new AccessThis(access.ancestor); } visitAccessScope(access) { return new AccessScope(access.name, access.ancestor); } visitAccessMember(access) { return new AccessMember(access.object.accept(this), access.name); } visitAccessKeyed(access) { return new AccessKeyed(access.object.accept(this), access.key.accept(this)); } visitCallScope(call) { return new CallScope(call.name, this.cloneExpressionArray(call.args), call.ancestor); } visitCallFunction(call) { return new CallFunction(call.func.accept(this), this.cloneExpressionArray(call.args)); } visitCallMember(call) { return new CallMember(call.object.accept(this), call.name, this.cloneExpressionArray(call.args)); } visitUnary(unary) { return new Unary(prefix.operation, prefix.expression.accept(this)); } visitBinary(binary) { return new Binary(binary.operation, binary.left.accept(this), binary.right.accept(this)); } visitLiteralPrimitive(literal) { return new LiteralPrimitive(literal); } visitLiteralArray(literal) { return new LiteralArray(this.cloneExpressionArray(literal.elements)); } visitLiteralObject(literal) { return new LiteralObject(literal.keys, this.cloneExpressionArray(literal.values)); } visitLiteralString(literal) { return new LiteralString(literal.value); } visitLiteralTemplate(literal) { return new LiteralTemplate(literal.cooked, this.cloneExpressionArray(literal.expressions), literal.raw, literal.tag && literal.tag.accept(this)); } } export function cloneExpression(expression) { let visitor = new ExpressionCloner(); return expression.accept(visitor); }