
(function(mod){if(typeof exports=="object"&&typeof module=="object")return mod(exports); if(typeof define=="function"&&define.amd)return define(["exports"],mod); mod((this.acorn||(this.acorn={})).walk={});})(function(exports){"use strict";





exports.simple=function(node,visitors,base,state){if(!base)base=exports.base;function c(node,st,override){var type=override||node.type,found=visitors[type];base[type](node,st,c);if(found)found(node,st);}
c(node,state);};



exports.recursive=function(node,state,funcs,base){var visitor=funcs?exports.make(funcs,base):base;function c(node,st,override){visitor[override||node.type](node,st,c);}
c(node,state);};function makeTest(test){if(typeof test=="string")
return function(type){return type==test;};else if(!test)
return function(){return true;};else
return test;}
function Found(node,state){this.node=node;this.state=state;}

exports.findNodeAt=function(node,start,end,test,base,state){test=makeTest(test);try{if(!base)base=exports.base;var c=function(node,st,override){var type=override||node.type;if((start==null||node.start<=start)&&(end==null||node.end>=end))
base[type](node,st,c);if(test(type,node)&&(start==null||node.start==start)&&(end==null||node.end==end))
throw new Found(node,st);};c(node,state);}catch(e){if(e instanceof Found)return e;throw e;}};
exports.findNodeAround=function(node,pos,test,base,state){test=makeTest(test);try{if(!base)base=exports.base;var c=function(node,st,override){var type=override||node.type;if(node.start>pos||node.end<pos)return;base[type](node,st,c);if(test(type,node))throw new Found(node,st);};c(node,state);}catch(e){if(e instanceof Found)return e;throw e;}};exports.findNodeAfter=function(node,pos,test,base,state){test=makeTest(test);try{if(!base)base=exports.base;var c=function(node,st,override){if(node.end<pos)return;var type=override||node.type;if(node.start>=pos&&test(type,node))throw new Found(node,st);base[type](node,st,c);};c(node,state);}catch(e){if(e instanceof Found)return e;throw e;}};exports.findNodeBefore=function(node,pos,test,base,state){test=makeTest(test);if(!base)base=exports.base;var max;var c=function(node,st,override){if(node.start>pos)return;var type=override||node.type;if(node.end<=pos&&(!max||max.node.end<node.end)&&test(type,node))
max=new Found(node,st);base[type](node,st,c);};c(node,state);return max;};
exports.make=function(funcs,base){if(!base)base=exports.base;var visitor={};for(var type in base)visitor[type]=base[type];for(var type in funcs)visitor[type]=funcs[type];return visitor;};function skipThrough(node,st,c){c(node,st);}
function ignore(_node,_st,_c){}
var base=exports.base={};base.Program=base.BlockStatement=function(node,st,c){for(var i=0;i<node.body.length;++i)
c(node.body[i],st,"Statement");};base.Statement=skipThrough;base.EmptyStatement=ignore;base.ExpressionStatement=function(node,st,c){c(node.expression,st,"Expression");};base.IfStatement=function(node,st,c){c(node.test,st,"Expression");c(node.consequent,st,"Statement");if(node.alternate)c(node.alternate,st,"Statement");};base.LabeledStatement=function(node,st,c){c(node.body,st,"Statement");};base.BreakStatement=base.ContinueStatement=ignore;base.WithStatement=function(node,st,c){c(node.object,st,"Expression");c(node.body,st,"Statement");};base.SwitchStatement=function(node,st,c){c(node.discriminant,st,"Expression");for(var i=0;i<node.cases.length;++i){var cs=node.cases[i];if(cs.test)c(cs.test,st,"Expression");for(var j=0;j<cs.consequent.length;++j)
c(cs.consequent[j],st,"Statement");}};base.ReturnStatement=function(node,st,c){if(node.argument)c(node.argument,st,"Expression");};base.ThrowStatement=function(node,st,c){c(node.argument,st,"Expression");};base.TryStatement=function(node,st,c){c(node.block,st,"Statement");if(node.handler)c(node.handler.body,st,"ScopeBody");if(node.finalizer)c(node.finalizer,st,"Statement");};base.WhileStatement=function(node,st,c){c(node.test,st,"Expression");c(node.body,st,"Statement");};base.DoWhileStatement=base.WhileStatement;base.ForStatement=function(node,st,c){if(node.init)c(node.init,st,"ForInit");if(node.test)c(node.test,st,"Expression");if(node.update)c(node.update,st,"Expression");c(node.body,st,"Statement");};base.ForInStatement=function(node,st,c){c(node.left,st,"ForInit");c(node.right,st,"Expression");c(node.body,st,"Statement");};base.ForInit=function(node,st,c){if(node.type=="VariableDeclaration")c(node,st);else c(node,st,"Expression");};base.DebuggerStatement=ignore;base.FunctionDeclaration=function(node,st,c){c(node,st,"Function");};base.VariableDeclaration=function(node,st,c){for(var i=0;i<node.declarations.length;++i){var decl=node.declarations[i];if(decl.init)c(decl.init,st,"Expression");}};base.Function=function(node,st,c){c(node.body,st,"ScopeBody");};base.ScopeBody=function(node,st,c){c(node,st,"Statement");};base.Expression=skipThrough;base.ThisExpression=ignore;base.ArrayExpression=function(node,st,c){for(var i=0;i<node.elements.length;++i){var elt=node.elements[i];if(elt)c(elt,st,"Expression");}};base.ObjectExpression=function(node,st,c){for(var i=0;i<node.properties.length;++i)
c(node.properties[i].value,st,"Expression");};base.FunctionExpression=base.FunctionDeclaration;base.SequenceExpression=function(node,st,c){for(var i=0;i<node.expressions.length;++i)
c(node.expressions[i],st,"Expression");};base.UnaryExpression=base.UpdateExpression=function(node,st,c){c(node.argument,st,"Expression");};base.BinaryExpression=base.AssignmentExpression=base.LogicalExpression=function(node,st,c){c(node.left,st,"Expression");c(node.right,st,"Expression");};base.ConditionalExpression=function(node,st,c){c(node.test,st,"Expression");c(node.consequent,st,"Expression");c(node.alternate,st,"Expression");};base.NewExpression=base.CallExpression=function(node,st,c){c(node.callee,st,"Expression");if(node.arguments)for(var i=0;i<node.arguments.length;++i)
c(node.arguments[i],st,"Expression");};base.MemberExpression=function(node,st,c){c(node.object,st,"Expression");if(node.computed)c(node.property,st,"Expression");};base.Identifier=base.Literal=ignore;
function makeScope(prev,isCatch){return{vars:Object.create(null),prev:prev,isCatch:isCatch};}
function normalScope(scope){while(scope.isCatch)scope=scope.prev;return scope;}
exports.scopeVisitor=exports.make({Function:function(node,scope,c){var inner=makeScope(scope);for(var i=0;i<node.params.length;++i)
inner.vars[node.params[i].name]={type:"argument",node:node.params[i]};if(node.id){var decl=node.type=="FunctionDeclaration";(decl?normalScope(scope):inner).vars[node.id.name]={type:decl?"function":"function name",node:node.id};}
c(node.body,inner,"ScopeBody");},TryStatement:function(node,scope,c){c(node.block,scope,"Statement");if(node.handler){var inner=makeScope(scope,true);inner.vars[node.handler.param.name]={type:"catch clause",node:node.handler.param};c(node.handler.body,inner,"ScopeBody");}
if(node.finalizer)c(node.finalizer,scope,"Statement");},VariableDeclaration:function(node,scope,c){var target=normalScope(scope);for(var i=0;i<node.declarations.length;++i){var decl=node.declarations[i];target.vars[decl.id.name]={type:"var",node:decl.id};if(decl.init)c(decl.init,scope,"Expression");}}});});