'use strict';

var _ = require('underscore');
class CodeGenerator {
    gen_ArrayLiteral(ast) {
        var self = this;
        var exprs = _.map(ast.elements, function(element) {
            return self.gen_expr(element);
        } );
        return '[' + exprs.join(',') + ']';
    }
    gen_NumberLiteral(ast) {
        return ast.value.toString();
    }
    gen_InfinityLiteral(ast) {
        return (ast.negative ? '-' : '') + 'Infinity';
    }
    gen_NaNLiteral() {
        return 'NaN';
    }
    gen_BooleanLiteral(ast) {
        return JSON.stringify(ast.value);
    }
    gen_StringLiteral(ast) {
        return JSON.stringify(ast.value);
    }
    gen_MultipartStringLiteral(ast) {
        var self = this;
        var exprs = _.map(ast.parts, function(part) {
            return self.gen_expr(part);
        });
        return '(' + exprs.join(' + ') + ')';
    }
    gen_NullLiteral() {
        return 'null';
    }
    gen_RegExpLiteral(ast) {
        return '/'+ ast.pattern +'/'+ ast.flags;
    }
    gen_ObjectLiteral(ast) {
        var self = this;
        var simple = _(ast.properties).any(function(property) {
            return property.key.type === 'StringLiteral';
        });
        var props = _(ast.properties).map(function(property) {
            return self.gen_ObjectProperty(property, simple);
        });

        return simple
            ? '{' + props.join(', ') + '}'
            : 'juttle.values.buildObject([' + props.join(', ') + '])';
    }
    gen_ObjectProperty(ast, simple) {
        return simple
            ? this.gen_expr(ast.key) + ': ' + this.gen_expr(ast.value)
            : '[' + this.gen_expr(ast.key) + ', ' + this.gen_expr(ast.value) + ']';
    }
    gen_DurationLiteral(ast) {
        return 'juttle.types.JuttleMoment.duration("' + ast.value + '")';
    }
    gen_MomentLiteral(ast) {
        return 'new juttle.types.JuttleMoment("' + ast.value + '")';
    }
    gen_FilterLiteral(ast) {
        return 'new juttle.types.Filter(' + JSON.stringify(ast.ast) + ',' + JSON.stringify(ast.source) + ')';
    }
    gen_ToString(ast) {
        return 'juttle.ops.str(' + this.gen_expr(ast.expression) + ')';
    }
}


module.exports = CodeGenerator;

@@ -74,35 +74,36 @@
 en_ArrayLiteral(
-ast
+node
 ) %7B%0A        var 
@@ -141,19 +141,20 @@
 = _.map(
-ast
+node
 .element
@@ -296,35 +296,36 @@
 n_NumberLiteral(
-ast
+node
 ) %7B%0A        retu
@@ -327,19 +327,20 @@
  return 
-ast
+node
 .value.t
@@ -372,35 +372,36 @@
 InfinityLiteral(
-ast
+node
 ) %7B%0A        retu
@@ -404,19 +404,20 @@
 return (
-ast
+node
 .negativ
@@ -516,35 +516,36 @@
 _BooleanLiteral(
-ast
+node
 ) %7B%0A        retu
@@ -554,35 +554,36 @@
  JSON.stringify(
-ast
+node
 .value);%0A    %7D%0A 
@@ -595,35 +595,36 @@
 n_StringLiteral(
-ast
+node
 ) %7B%0A        retu
@@ -641,19 +641,20 @@
 ringify(
-ast
+node
 .value);
@@ -683,35 +683,36 @@
 rtStringLiteral(
-ast
+node
 ) %7B%0A        var 
@@ -750,19 +750,20 @@
 = _.map(
-ast
+node
 .parts, 
@@ -950,35 +950,36 @@
 n_RegExpLiteral(
-ast
+node
 ) %7B%0A        retu
@@ -986,19 +986,20 @@
 rn '/'+ 
-ast
+node
 .pattern
@@ -1005,19 +1005,20 @@
 n +'/'+ 
-ast
+node
 .flags;%0A
@@ -1037,35 +1037,36 @@
 n_ObjectLiteral(
-ast
+node
 ) %7B%0A        var 
@@ -1097,27 +1097,28 @@
  simple = _(
-ast
+node
 .properties)
@@ -1235,19 +1235,20 @@
 ops = _(
-ast
+node
 .propert
@@ -1517,19 +1517,20 @@
 roperty(
-ast
+node
 , simple
@@ -1575,35 +1575,36 @@
 ? this.gen_expr(
-ast
+node
 .key) + ': ' + t
@@ -1612,27 +1612,28 @@
 is.gen_expr(
-ast
+node
 .value)%0A    
@@ -1662,19 +1662,20 @@
 en_expr(
-ast
+node
 .key) + 
@@ -1695,19 +1695,20 @@
 en_expr(
-ast
+node
 .value) 
@@ -1736,35 +1736,36 @@
 DurationLiteral(
-ast
+node
 ) %7B%0A        retu
@@ -1804,27 +1804,28 @@
 ration(%22' + 
-ast
+node
 .value + '%22)
@@ -1847,35 +1847,36 @@
 n_MomentLiteral(
-ast
+node
 ) %7B%0A        retu
@@ -1914,19 +1914,20 @@
 nt(%22' + 
-ast
+node
 .value +
@@ -1961,19 +1961,20 @@
 Literal(
-ast
+node
 ) %7B%0A    
@@ -2032,15 +2032,17 @@
 ify(
-ast.ast
+node.node
 ) + 
@@ -2062,19 +2062,20 @@
 ringify(
-ast
+node
 .source)
@@ -2105,19 +2105,20 @@
 oString(
-ast
+node
 ) %7B%0A    
@@ -2166,11 +2166,12 @@
 xpr(
-ast
+node
 .exp

Rename the "ast" parameter to "node"