"use strict"; var arrays = require("../../utils/arrays"), visitor = require("../visitor"); /* * Removes proxy rules -- that is, rules that only delegate to other rule. */ function removeProxyRules(ast, options) { function isProxyRule(node) { return node.type === "rule" && node.expression.type === "rule_ref"; } function replaceRuleRefs(ast, from, to) { var replace = visitor.build({ rule_ref: function(node) { if (node.name === from) { node.name = to; } } }); replace(ast); } var indices = []; arrays.each(ast.rules, function(rule, i) { if (isProxyRule(rule)) { replaceRuleRefs(ast, rule.name, rule.expression.name); if (!arrays.contains(options.allowedStartRules, rule.name)) { indices.push(i); } } }); indices.reverse(); arrays.each(indices, function(i) { ast.rules.splice(i, 1); }); } module.exports = removeProxyRules;