var acorn = require('acorn'); // Хранилище для типов синтаксических элементов (tokens) var tt = acorn.tokTypes; // Добавляем свой плагин в jQuery-style :) acorn.plugins.slice = function (parser) { // Инджектимся в метод parseMaybeConditional чтобы // добавить синтаксис на уровне тернарного оператора parser.extend('parseMaybeConditional', function (prev) { return function () { // Сохраняем начальные позиции, чтобы было откуда начать нашу ноду var startPos = this.start, startLoc = this.startLoc; // Вызываем обычный обработчик, чтобы он считал тернарный оператор // или выражение попроще var inner = prev.apply(this, arguments); // Проверяем, является ли следующий элемент двоеточием // и, если да, то сразу его "съедаем" if (this.eat(tt.colon)) { // Он таки является двоеточием, значит это и будет наш "range expression" // Создаем для него ноду из самого начала var node = this.startNodeAt(startPos, startLoc); // Кладём в эту ноду прочитанное выражение как начало node.from = inner; // Аналогично читаем правую часть node.to = prev.apply(this, arguments); // Завершаем ноду с собственным типом и возвращаем её. return this.finishNode(node, 'RangeExpression'); } else { // Если не нашли сразу двоеточия, значит не наш парень, // и можно сразу вернуть прочитанное выражение return inner; } }; }); }; module.exports = acorn;