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.
266 lines
6.5 KiB
266 lines
6.5 KiB
"use strict"; |
|
|
|
exports.__esModule = true; |
|
|
|
var _create = require("babel-runtime/core-js/object/create"); |
|
|
|
var _create2 = _interopRequireDefault(_create); |
|
|
|
var _getIterator2 = require("babel-runtime/core-js/get-iterator"); |
|
|
|
var _getIterator3 = _interopRequireDefault(_getIterator2); |
|
|
|
exports.getStatementParent = getStatementParent; |
|
exports.getOpposite = getOpposite; |
|
exports.getCompletionRecords = getCompletionRecords; |
|
exports.getSibling = getSibling; |
|
exports.getPrevSibling = getPrevSibling; |
|
exports.getNextSibling = getNextSibling; |
|
exports.getAllNextSiblings = getAllNextSiblings; |
|
exports.getAllPrevSiblings = getAllPrevSiblings; |
|
exports.get = get; |
|
exports._getKey = _getKey; |
|
exports._getPattern = _getPattern; |
|
exports.getBindingIdentifiers = getBindingIdentifiers; |
|
exports.getOuterBindingIdentifiers = getOuterBindingIdentifiers; |
|
exports.getBindingIdentifierPaths = getBindingIdentifierPaths; |
|
exports.getOuterBindingIdentifierPaths = getOuterBindingIdentifierPaths; |
|
|
|
var _index = require("./index"); |
|
|
|
var _index2 = _interopRequireDefault(_index); |
|
|
|
var _babelTypes = require("babel-types"); |
|
|
|
var t = _interopRequireWildcard(_babelTypes); |
|
|
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
|
|
|
function getStatementParent() { |
|
var path = this; |
|
|
|
do { |
|
if (!path.parentPath || Array.isArray(path.container) && path.isStatement()) { |
|
break; |
|
} else { |
|
path = path.parentPath; |
|
} |
|
} while (path); |
|
|
|
if (path && (path.isProgram() || path.isFile())) { |
|
throw new Error("File/Program node, we can't possibly find a statement parent to this"); |
|
} |
|
|
|
return path; |
|
} |
|
|
|
function getOpposite() { |
|
if (this.key === "left") { |
|
return this.getSibling("right"); |
|
} else if (this.key === "right") { |
|
return this.getSibling("left"); |
|
} |
|
} |
|
|
|
function getCompletionRecords() { |
|
var paths = []; |
|
|
|
var add = function add(path) { |
|
if (path) paths = paths.concat(path.getCompletionRecords()); |
|
}; |
|
|
|
if (this.isIfStatement()) { |
|
add(this.get("consequent")); |
|
add(this.get("alternate")); |
|
} else if (this.isDoExpression() || this.isFor() || this.isWhile()) { |
|
add(this.get("body")); |
|
} else if (this.isProgram() || this.isBlockStatement()) { |
|
add(this.get("body").pop()); |
|
} else if (this.isFunction()) { |
|
return this.get("body").getCompletionRecords(); |
|
} else if (this.isTryStatement()) { |
|
add(this.get("block")); |
|
add(this.get("handler")); |
|
add(this.get("finalizer")); |
|
} else { |
|
paths.push(this); |
|
} |
|
|
|
return paths; |
|
} |
|
|
|
function getSibling(key) { |
|
return _index2.default.get({ |
|
parentPath: this.parentPath, |
|
parent: this.parent, |
|
container: this.container, |
|
listKey: this.listKey, |
|
key: key |
|
}); |
|
} |
|
|
|
function getPrevSibling() { |
|
return this.getSibling(this.key - 1); |
|
} |
|
|
|
function getNextSibling() { |
|
return this.getSibling(this.key + 1); |
|
} |
|
|
|
function getAllNextSiblings() { |
|
var _key = this.key; |
|
var sibling = this.getSibling(++_key); |
|
var siblings = []; |
|
while (sibling.node) { |
|
siblings.push(sibling); |
|
sibling = this.getSibling(++_key); |
|
} |
|
return siblings; |
|
} |
|
|
|
function getAllPrevSiblings() { |
|
var _key = this.key; |
|
var sibling = this.getSibling(--_key); |
|
var siblings = []; |
|
while (sibling.node) { |
|
siblings.push(sibling); |
|
sibling = this.getSibling(--_key); |
|
} |
|
return siblings; |
|
} |
|
|
|
function get(key, context) { |
|
if (context === true) context = this.context; |
|
var parts = key.split("."); |
|
if (parts.length === 1) { |
|
return this._getKey(key, context); |
|
} else { |
|
return this._getPattern(parts, context); |
|
} |
|
} |
|
|
|
function _getKey(key, context) { |
|
var _this = this; |
|
|
|
var node = this.node; |
|
var container = node[key]; |
|
|
|
if (Array.isArray(container)) { |
|
return container.map(function (_, i) { |
|
return _index2.default.get({ |
|
listKey: key, |
|
parentPath: _this, |
|
parent: node, |
|
container: container, |
|
key: i |
|
}).setContext(context); |
|
}); |
|
} else { |
|
return _index2.default.get({ |
|
parentPath: this, |
|
parent: node, |
|
container: node, |
|
key: key |
|
}).setContext(context); |
|
} |
|
} |
|
|
|
function _getPattern(parts, context) { |
|
var path = this; |
|
for (var _iterator = parts, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) { |
|
var _ref; |
|
|
|
if (_isArray) { |
|
if (_i >= _iterator.length) break; |
|
_ref = _iterator[_i++]; |
|
} else { |
|
_i = _iterator.next(); |
|
if (_i.done) break; |
|
_ref = _i.value; |
|
} |
|
|
|
var part = _ref; |
|
|
|
if (part === ".") { |
|
path = path.parentPath; |
|
} else { |
|
if (Array.isArray(path)) { |
|
path = path[part]; |
|
} else { |
|
path = path.get(part, context); |
|
} |
|
} |
|
} |
|
return path; |
|
} |
|
|
|
function getBindingIdentifiers(duplicates) { |
|
return t.getBindingIdentifiers(this.node, duplicates); |
|
} |
|
|
|
function getOuterBindingIdentifiers(duplicates) { |
|
return t.getOuterBindingIdentifiers(this.node, duplicates); |
|
} |
|
|
|
function getBindingIdentifierPaths() { |
|
var duplicates = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; |
|
var outerOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; |
|
|
|
var path = this; |
|
var search = [].concat(path); |
|
var ids = (0, _create2.default)(null); |
|
|
|
while (search.length) { |
|
var id = search.shift(); |
|
if (!id) continue; |
|
if (!id.node) continue; |
|
|
|
var keys = t.getBindingIdentifiers.keys[id.node.type]; |
|
|
|
if (id.isIdentifier()) { |
|
if (duplicates) { |
|
var _ids = ids[id.node.name] = ids[id.node.name] || []; |
|
_ids.push(id); |
|
} else { |
|
ids[id.node.name] = id; |
|
} |
|
continue; |
|
} |
|
|
|
if (id.isExportDeclaration()) { |
|
var declaration = id.get("declaration"); |
|
if (declaration.isDeclaration()) { |
|
search.push(declaration); |
|
} |
|
continue; |
|
} |
|
|
|
if (outerOnly) { |
|
if (id.isFunctionDeclaration()) { |
|
search.push(id.get("id")); |
|
continue; |
|
} |
|
if (id.isFunctionExpression()) { |
|
continue; |
|
} |
|
} |
|
|
|
if (keys) { |
|
for (var i = 0; i < keys.length; i++) { |
|
var key = keys[i]; |
|
var child = id.get(key); |
|
if (Array.isArray(child) || child.node) { |
|
search = search.concat(child); |
|
} |
|
} |
|
} |
|
} |
|
|
|
return ids; |
|
} |
|
|
|
function getOuterBindingIdentifierPaths(duplicates) { |
|
return this.getBindingIdentifierPaths(duplicates, true); |
|
} |