| 'use strict'; |
| |
| var noop = function() {}; |
| |
| function ensureFunction(value) { |
| return typeof value === 'function' ? value : noop; |
| } |
| |
| module.exports = function(node, options, context) { |
| function walk(node) { |
| enter.call(context, node); |
| |
| switch (node.type) { |
| case 'Group': |
| node.terms.forEach(walk); |
| break; |
| |
| case 'Multiplier': |
| walk(node.term); |
| break; |
| |
| case 'Type': |
| case 'Property': |
| case 'Keyword': |
| case 'AtKeyword': |
| case 'Function': |
| case 'String': |
| case 'Token': |
| case 'Comma': |
| break; |
| |
| default: |
| throw new Error('Unknown type: ' + node.type); |
| } |
| |
| leave.call(context, node); |
| } |
| |
| var enter = noop; |
| var leave = noop; |
| |
| if (typeof options === 'function') { |
| enter = options; |
| } else if (options) { |
| enter = ensureFunction(options.enter); |
| leave = ensureFunction(options.leave); |
| } |
| |
| if (enter === noop && leave === noop) { |
| throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function'); |
| } |
| |
| walk(node, context); |
| }; |