#!/usr/bin/env node

var fs = require("fs");

var acornSrc = fs.readFileSync(require.resolve("../acorn"), "utf8");
var acorn = require("../acorn"), walk = require("../util/walk");

var ast = acorn.parse(acornSrc);
var touchups = [], uses = [];

walk.simple(ast, {
  FunctionDeclaration: function(node) {
    if (node.id.name == "makePredicate")
      touchups.push({text: "// Removed to create an eval-free library", from: node.start, to: node.end});
  },
  VariableDeclaration: function(node) {
    node.declarations.forEach(function(decl) {
      if (decl.init && decl.init.type == "CallExpression" &&
          decl.init.callee.name == "makePredicate")
        uses.push(decl);
    });
  }
});

var results = Object.create(null);
var functions = new Function("predicates", acornSrc.replace(
  /\}\);\s*$/, uses.map(function(decl) {
    return "predicates[" + JSON.stringify(decl.id.name) + "] = " + decl.id.name + ";";
  }).join("") + "});"))(results);

uses.forEach(function(decl) {
  touchups.push({text: results[decl.id.name].toString(),
                 from: decl.init.start, to: decl.init.end});
});

var result = "", pos = 0;
touchups.sort(function(a, b) { return a.from - b.from; });
touchups.forEach(function(touchup) {
  result += acornSrc.slice(pos, touchup.from);
  result += touchup.text;
  pos = touchup.to;
});
result += acornSrc.slice(pos);

process.stdout.write(result);
