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;