react / wstein / node_modules / browserify / node_modules / insert-module-globals / node_modules / lexical-scope / index.js
80538 viewsvar astw = require('astw');12module.exports = function (src) {3var locals = {};4var implicit = {};5var exported = {};67if (typeof src === 'string') {8src = String(src).replace(/^#![^\n]*\n/, '');9}10if (src && typeof src === 'object'11&& typeof src.copy === 'function' && typeof src.toString === 'function') {12src = src.toString('utf8');13}14var walk = astw(src);1516walk(function (node) {17if (node.type === 'VariableDeclaration') {18// take off the leading `var `19var id = getScope(node);20for (var i = 0; i < node.declarations.length; i++) {21var d = node.declarations[i];22locals[id][d.id.name] = d;23}24}25else if (node.type === 'CatchClause') {26var id = getScope(node);27locals[id][node.param.name] = node.param28}29else if (isFunction(node)) {30var id = getScope(node.parent);31if (node.id) locals[id][node.id.name] = node;32var nid = node.params.length && getScope(node);33if (nid && !locals[nid]) locals[nid] = {};34for (var i = 0; i < node.params.length; i++) {35var p = node.params[i];36locals[nid][p.name] = p;37}38}39});4041walk(function (node) {42if (node.type === 'Identifier'43&& lookup(node) === undefined) {44if (node.parent.type === 'Property'45&& node.parent.key === node) return;46if (node.parent.type === 'MemberExpression'47&& node.parent.property === node) return;48if (isFunction(node.parent)) return;49if (node.parent.type === 'LabeledStatement') return;50if (node.parent.type === 'ContinueStatement') return;51if (node.parent.type === 'BreakStatement') return;5253if (node.parent.type === 'AssignmentExpression') {54var isLeft0 = node.parent.left.type === 'MemberExpression'55&& node.parent.left.object === node.name56;57var isLeft1 = node.parent.left.type === 'Identifier'58&& node.parent.left.name === node.name59;60if (isLeft0 || isLeft1) {61exported[node.name] = keyOf(node).length;62}63}64if (!exported[node.name]65|| exported[node.name] < keyOf(node).length) {66implicit[node.name] = keyOf(node).length;67}68}69});7071var localScopes = {};72var lks = objectKeys(locals);73for (var i = 0; i < lks.length; i++) {74var key = lks[i];75localScopes[key] = objectKeys(locals[key]);76}7778return {79locals: localScopes,80globals: {81implicit: objectKeys(implicit),82exported: objectKeys(exported)83}84};8586function lookup (node) {87for (var p = node; p; p = p.parent) {88if (isFunction(p) || p.type === 'Program') {89var id = getScope(p);90if (locals[id][node.name]) {91return id;92}93}94}95return undefined;96}9798function getScope (node) {99for (100var p = node;101!isFunction(p) && p.type !== 'Program';102p = p.parent103);104var id = idOf(p);105if (!locals[id]) locals[id] = {};106return id;107}108109};110111function isFunction (x) {112return x.type === 'FunctionDeclaration'113|| x.type === 'FunctionExpression'114;115}116117function idOf (node) {118var id = [];119for (var n = node; n.type !== 'Program'; n = n.parent) {120var key = keyOf(n).join('.');121id.unshift(key);122}123return id.join('.');124}125126function keyOf (node) {127if (node.lexicalScopeKey) return node.lexicalScopeKey;128var p = node.parent;129var ks = objectKeys(p);130var kv = { keys : [], values : [], top : [] };131132for (var i = 0; i < ks.length; i++) {133var key = ks[i];134kv.keys.push(key);135kv.values.push(p[key]);136kv.top.push(undefined);137138if (isArray(p[key])) {139var keys = objectKeys(p[key]);140kv.keys.push.apply(kv.keys, keys);141kv.values.push.apply(kv.values, p[key]);142143var nkeys = [];144for (var j = 0; j < keys.length; j++) nkeys.push(key);145kv.top.push.apply(kv.top, nkeys);146}147}148var ix = indexOf(kv.values, node);149var res = [];150if (kv.top[ix]) res.push(kv.top[ix]);151if (kv.keys[ix]) res.push(kv.keys[ix]);152if (node.parent.type === 'CallExpression') {153res.unshift.apply(res, keyOf(node.parent.parent));154}155return node.lexicalScopeKey = res;156}157158var isArray = Array.isArray || function (xs) {159return Object.prototype.toString.call(xs) === '[object Array]';160};161162var objectKeys = Object.keys || function (obj) {163var keys = [];164for (var key in obj) keys.push(key);165return keys;166};167168function indexOf (xs, x) {169if (xs.indexOf) return xs.indexOf(x);170for (var i = 0; i < xs.length; i++) {171if (x === xs[i]) return i;172}173return -1;174}175176177