Home Reference Source Test

lib/parser/optimizer.js

const estraverse = require("estraverse");

const { ARITHM_OPERATORS } = require("../interp/registry.js");
const { Eggvm } = require("../interp/eggvm.js");
const { Value } = require("../interp/ast.js");

class Optimizer {

  optimize(tree) {
    const optimized_tree = estraverse.replace(tree, {
      leave: function(node) {
        if (node.type === "apply") {
          // If all arguments are literals, substitute the node with the result of the
          // evaluation
          if (
            ARITHM_OPERATORS.includes(node.operator.name) &&
            node.args.every(arg => arg.type === "value")
          ) {
            const result = Eggvm.eval(node);

            return new Value({ value: result });
          }
        }
      },
      keys: {
        apply: ["operator", "args"],
        word: [],
        value: [],
        regex: []
      }
    });

    return optimized_tree;
  }

  static optimize(tree) {
    return new Optimizer().optimize(tree);
  }
}

module.exports = {
  Optimizer
};