summaryrefslogtreecommitdiff
path: root/tools/node_modules/babel-eslint/node_modules/esrecurse/esrecurse.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/babel-eslint/node_modules/esrecurse/esrecurse.js')
-rw-r--r--tools/node_modules/babel-eslint/node_modules/esrecurse/esrecurse.js135
1 files changed, 135 insertions, 0 deletions
diff --git a/tools/node_modules/babel-eslint/node_modules/esrecurse/esrecurse.js b/tools/node_modules/babel-eslint/node_modules/esrecurse/esrecurse.js
new file mode 100644
index 0000000000..0805e67f39
--- /dev/null
+++ b/tools/node_modules/babel-eslint/node_modules/esrecurse/esrecurse.js
@@ -0,0 +1,135 @@
+/*
+ Copyright (C) 2014 Yusuke Suzuki <utatane.tea@gmail.com>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+(function () {
+ 'use strict';
+
+ var assign,
+ estraverse,
+ isArray,
+ objectKeys;
+
+ assign = require('object-assign');
+ estraverse = require('estraverse');
+
+ isArray = Array.isArray || function isArray(array) {
+ return Object.prototype.toString.call(array) === '[object Array]';
+ };
+
+ objectKeys = Object.keys || function (o) {
+ var keys = [], key;
+ for (key in o) {
+ keys.push(key);
+ }
+ return keys;
+ };
+
+ function isNode(node) {
+ if (node == null) {
+ return false;
+ }
+ return typeof node === 'object' && typeof node.type === 'string';
+ }
+
+ function isProperty(nodeType, key) {
+ return (nodeType === estraverse.Syntax.ObjectExpression || nodeType === estraverse.Syntax.ObjectPattern) && key === 'properties';
+ }
+
+ function Visitor(visitor, options) {
+ options = options || {};
+
+ this.__visitor = visitor || this;
+ this.__childVisitorKeys = options.childVisitorKeys
+ ? assign({}, estraverse.VisitorKeys, options.childVisitorKeys)
+ : estraverse.VisitorKeys;
+ if (options.fallback === 'iteration') {
+ this.__fallback = objectKeys;
+ } else if (typeof options.fallback === 'function') {
+ this.__fallback = options.fallback;
+ }
+ }
+
+ /* Default method for visiting children.
+ * When you need to call default visiting operation inside custom visiting
+ * operation, you can use it with `this.visitChildren(node)`.
+ */
+ Visitor.prototype.visitChildren = function (node) {
+ var type, children, i, iz, j, jz, child;
+
+ if (node == null) {
+ return;
+ }
+
+ type = node.type || estraverse.Syntax.Property;
+
+ children = this.__childVisitorKeys[type];
+ if (!children) {
+ if (this.__fallback) {
+ children = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + type + '.');
+ }
+ }
+
+ for (i = 0, iz = children.length; i < iz; ++i) {
+ child = node[children[i]];
+ if (child) {
+ if (isArray(child)) {
+ for (j = 0, jz = child.length; j < jz; ++j) {
+ if (child[j]) {
+ if (isNode(child[j]) || isProperty(type, children[i])) {
+ this.visit(child[j]);
+ }
+ }
+ }
+ } else if (isNode(child)) {
+ this.visit(child);
+ }
+ }
+ }
+ };
+
+ /* Dispatching node. */
+ Visitor.prototype.visit = function (node) {
+ var type;
+
+ if (node == null) {
+ return;
+ }
+
+ type = node.type || estraverse.Syntax.Property;
+ if (this.__visitor[type]) {
+ this.__visitor[type].call(this, node);
+ return;
+ }
+ this.visitChildren(node);
+ };
+
+ exports.version = require('./package.json').version;
+ exports.Visitor = Visitor;
+ exports.visit = function (node, visitor, options) {
+ var v = new Visitor(visitor, options);
+ v.visit(node);
+ };
+}());
+/* vim: set sw=4 ts=4 et tw=80 : */