in lib/generator.js [1253:1345]
visitExpr(ast, level) {
if (ast.type === 'boolean') {
this.emit(`${ast.value}`);
} else if (ast.type === 'property_access') {
this.visitPropertyAccess(ast, level);
} else if (ast.type === 'string') {
this.emit(`"${ast.value.string.replace(new RegExp('"', 'g'), '\\"')}"`);
} else if (ast.type === 'null') {
this.emit('null');
} else if (ast.type === 'number') {
this.emitNumber(ast);
} else if (ast.type === 'object') {
this.visitObject(ast, level);
} else if (ast.type === 'variable') {
var id = _name(ast.id);
if (id === '__response') {
this.emit(RESPONSE);
} else if (id === '__request') {
this.emit(REQUEST);
} else if (ast.inferred && ast.inferred.name === 'class') {
this.emit(avoidReserveName(id) + '.class');
} else {
this.emit(avoidReserveName(id));
}
} else if (ast.type === 'virtualVariable') {
const vid = `_${_lowerFirst(_name(ast.vid).substr(1))}`;
this.emit(`${vid}`);
} else if (ast.type === 'template_string') {
for (let i = 0; i < ast.elements.length; i++) {
var item = ast.elements[i];
if (item.type === 'element') {
this.emit('"');
this.emit(item.value.string);
this.emit('"');
} else if (item.type === 'expr') {
if (item.expr.type === 'property_access' && _name(item.expr.id) === '__module') {
var value = this.__module;
for (let i = 0; i < item.expr.propertyPath.length; i++) {
value = value[_name(item.expr.propertyPath[i])];
}
this.emit('"');
this.emit(value);
this.emit('"');
} else {
this.visitExpr(item.expr, level);
}
} else {
throw new Error('unimpelemented');
}
if (i < ast.elements.length - 1) {
this.emit(' + ');
}
}
} else if (ast.type === 'call') {
this.visitCall(ast, level);
} else if (ast.type === 'construct') {
this.visitConstruct(ast, level);
} else if (ast.type === 'array') {
this.visitArray(ast, level);
} else if (ast.type === 'and') {
this.visitExpr(ast.left, level);
this.emit(' && ');
this.visitExpr(ast.right, level);
} else if (ast.type === 'or') {
this.visitExpr(ast.left, level);
this.emit(' || ');
this.visitExpr(ast.right, level);
} else if (ast.type === 'null') {
this.emit('null');
} else if (ast.type === 'not') {
this.emit('!');
this.visitExpr(ast.expr, level);
} else if (ast.type === 'construct_model') {
this.visitConstructModel(ast, level);
} else if (ast.type === 'super') {
this.emit('super(');
if (ast.args) {
for (let i = 0; i < ast.args.length; i++) {
if (i > 0) {
this.emit(', ');
}
this.visitExpr(ast.args[i], level);
}
}
this.emit(')');
} else if (ast.type === 'map_access') {
this.visitMapAccess(ast, true);
} else if (ast.type === 'array_access') {
this.visitArrayAccess(ast, true);
} else {
throw new Error('unimpelemented');
}