You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.2 KiB
52 lines
1.2 KiB
const noop = function() {}; |
|
|
|
function ensureFunction(value) { |
|
return typeof value === 'function' ? value : noop; |
|
} |
|
|
|
export function walk(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); |
|
} |
|
|
|
let enter = noop; |
|
let 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); |
|
};
|
|
|