Path: blob/master/web-gui/buildyourownbotnet/assets/js/codemirror/test/lint/walk.js
1294 views
// AST walker module for Mozilla Parser API compatible trees12(function(exports) {3"use strict";45// A simple walk is one where you simply specify callbacks to be6// called on specific nodes. The last two arguments are optional. A7// simple use would be8//9// walk.simple(myTree, {10// Expression: function(node) { ... }11// });12//13// to do something with all expressions. All Parser API node types14// can be used to identify node types, as well as Expression,15// Statement, and ScopeBody, which denote categories of nodes.16//17// The base argument can be used to pass a custom (recursive)18// walker, and state can be used to give this walked an initial19// state.20exports.simple = function(node, visitors, base, state) {21if (!base) base = exports;22function c(node, st, override) {23var type = override || node.type, found = visitors[type];24if (found) found(node, st);25base[type](node, st, c);26}27c(node, state);28};2930// A recursive walk is one where your functions override the default31// walkers. They can modify and replace the state parameter that's32// threaded through the walk, and can opt how and whether to walk33// their child nodes (by calling their third argument on these34// nodes).35exports.recursive = function(node, state, funcs, base) {36var visitor = exports.make(funcs, base);37function c(node, st, override) {38visitor[override || node.type](node, st, c);39}40c(node, state);41};4243// Used to create a custom walker. Will fill in all missing node44// type properties with the defaults.45exports.make = function(funcs, base) {46if (!base) base = exports;47var visitor = {};48for (var type in base)49visitor[type] = funcs.hasOwnProperty(type) ? funcs[type] : base[type];50return visitor;51};5253function skipThrough(node, st, c) { c(node, st); }54function ignore(node, st, c) {}5556// Node walkers.5758exports.Program = exports.BlockStatement = function(node, st, c) {59for (var i = 0; i < node.body.length; ++i)60c(node.body[i], st, "Statement");61};62exports.Statement = skipThrough;63exports.EmptyStatement = ignore;64exports.ExpressionStatement = function(node, st, c) {65c(node.expression, st, "Expression");66};67exports.IfStatement = function(node, st, c) {68c(node.test, st, "Expression");69c(node.consequent, st, "Statement");70if (node.alternate) c(node.alternate, st, "Statement");71};72exports.LabeledStatement = function(node, st, c) {73c(node.body, st, "Statement");74};75exports.BreakStatement = exports.ContinueStatement = ignore;76exports.WithStatement = function(node, st, c) {77c(node.object, st, "Expression");78c(node.body, st, "Statement");79};80exports.SwitchStatement = function(node, st, c) {81c(node.discriminant, st, "Expression");82for (var i = 0; i < node.cases.length; ++i) {83var cs = node.cases[i];84if (cs.test) c(cs.test, st, "Expression");85for (var j = 0; j < cs.consequent.length; ++j)86c(cs.consequent[j], st, "Statement");87}88};89exports.ReturnStatement = function(node, st, c) {90if (node.argument) c(node.argument, st, "Expression");91};92exports.ThrowStatement = function(node, st, c) {93c(node.argument, st, "Expression");94};95exports.TryStatement = function(node, st, c) {96c(node.block, st, "Statement");97for (var i = 0; i < node.handlers.length; ++i)98c(node.handlers[i].body, st, "ScopeBody");99if (node.finalizer) c(node.finalizer, st, "Statement");100};101exports.WhileStatement = function(node, st, c) {102c(node.test, st, "Expression");103c(node.body, st, "Statement");104};105exports.DoWhileStatement = exports.WhileStatement;106exports.ForStatement = function(node, st, c) {107if (node.init) c(node.init, st, "ForInit");108if (node.test) c(node.test, st, "Expression");109if (node.update) c(node.update, st, "Expression");110c(node.body, st, "Statement");111};112exports.ForInStatement = function(node, st, c) {113c(node.left, st, "ForInit");114c(node.right, st, "Expression");115c(node.body, st, "Statement");116};117exports.ForInit = function(node, st, c) {118if (node.type == "VariableDeclaration") c(node, st);119else c(node, st, "Expression");120};121exports.DebuggerStatement = ignore;122123exports.FunctionDeclaration = function(node, st, c) {124c(node, st, "Function");125};126exports.VariableDeclaration = function(node, st, c) {127for (var i = 0; i < node.declarations.length; ++i) {128var decl = node.declarations[i];129if (decl.init) c(decl.init, st, "Expression");130}131};132133exports.Function = function(node, st, c) {134c(node.body, st, "ScopeBody");135};136exports.ScopeBody = function(node, st, c) {137c(node, st, "Statement");138};139140exports.Expression = skipThrough;141exports.ThisExpression = ignore;142exports.ArrayExpression = function(node, st, c) {143for (var i = 0; i < node.elements.length; ++i) {144var elt = node.elements[i];145if (elt) c(elt, st, "Expression");146}147};148exports.ObjectExpression = function(node, st, c) {149for (var i = 0; i < node.properties.length; ++i)150c(node.properties[i].value, st, "Expression");151};152exports.FunctionExpression = exports.FunctionDeclaration;153exports.SequenceExpression = function(node, st, c) {154for (var i = 0; i < node.expressions.length; ++i)155c(node.expressions[i], st, "Expression");156};157exports.UnaryExpression = exports.UpdateExpression = function(node, st, c) {158c(node.argument, st, "Expression");159};160exports.BinaryExpression = exports.AssignmentExpression = exports.LogicalExpression = function(node, st, c) {161c(node.left, st, "Expression");162c(node.right, st, "Expression");163};164exports.ConditionalExpression = function(node, st, c) {165c(node.test, st, "Expression");166c(node.consequent, st, "Expression");167c(node.alternate, st, "Expression");168};169exports.NewExpression = exports.CallExpression = function(node, st, c) {170c(node.callee, st, "Expression");171if (node.arguments) for (var i = 0; i < node.arguments.length; ++i)172c(node.arguments[i], st, "Expression");173};174exports.MemberExpression = function(node, st, c) {175c(node.object, st, "Expression");176if (node.computed) c(node.property, st, "Expression");177};178exports.Identifier = exports.Literal = ignore;179180// A custom walker that keeps track of the scope chain and the181// variables defined in it.182function makeScope(prev) {183return {vars: Object.create(null), prev: prev};184}185exports.scopeVisitor = exports.make({186Function: function(node, scope, c) {187var inner = makeScope(scope);188for (var i = 0; i < node.params.length; ++i)189inner.vars[node.params[i].name] = {type: "argument", node: node.params[i]};190if (node.id) {191var decl = node.type == "FunctionDeclaration";192(decl ? scope : inner).vars[node.id.name] =193{type: decl ? "function" : "function name", node: node.id};194}195c(node.body, inner, "ScopeBody");196},197TryStatement: function(node, scope, c) {198c(node.block, scope, "Statement");199for (var i = 0; i < node.handlers.length; ++i) {200var handler = node.handlers[i], inner = makeScope(scope);201inner.vars[handler.param.name] = {type: "catch clause", node: handler.param};202c(handler.body, inner, "ScopeBody");203}204if (node.finalizer) c(node.finalizer, scope, "Statement");205},206VariableDeclaration: function(node, scope, c) {207for (var i = 0; i < node.declarations.length; ++i) {208var decl = node.declarations[i];209scope.vars[decl.id.name] = {type: "var", node: decl.id};210if (decl.init) c(decl.init, scope, "Expression");211}212}213});214215})(typeof exports == "undefined" ? acorn.walk = {} : exports);216217218