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.
97 lines
2.5 KiB
97 lines
2.5 KiB
"use strict"; |
|
|
|
exports.__esModule = true; |
|
exports.default = void 0; |
|
|
|
var _utils = require("../utils"); |
|
|
|
var _default = callProvider => { |
|
function property(object, key, placement, path) { |
|
return callProvider({ |
|
kind: "property", |
|
object, |
|
key, |
|
placement |
|
}, path); |
|
} |
|
|
|
return { |
|
// Symbol(), new Promise |
|
ReferencedIdentifier(path) { |
|
const { |
|
node: { |
|
name |
|
}, |
|
scope |
|
} = path; |
|
if (scope.getBindingIdentifier(name)) return; |
|
callProvider({ |
|
kind: "global", |
|
name |
|
}, path); |
|
}, |
|
|
|
MemberExpression(path) { |
|
const key = (0, _utils.resolveKey)(path.get("property"), path.node.computed); |
|
if (!key || key === "prototype") return; |
|
const object = path.get("object"); |
|
const binding = object.scope.getBinding(object.node.name); |
|
if (binding && binding.path.isImportNamespaceSpecifier()) return; |
|
const source = (0, _utils.resolveSource)(object); |
|
return property(source.id, key, source.placement, path); |
|
}, |
|
|
|
ObjectPattern(path) { |
|
const { |
|
parentPath, |
|
parent |
|
} = path; |
|
let obj; // const { keys, values } = Object |
|
|
|
if (parentPath.isVariableDeclarator()) { |
|
obj = parentPath.get("init"); // ({ keys, values } = Object) |
|
} else if (parentPath.isAssignmentExpression()) { |
|
obj = parentPath.get("right"); // !function ({ keys, values }) {...} (Object) |
|
// resolution does not work after properties transform :-( |
|
} else if (parentPath.isFunction()) { |
|
const grand = parentPath.parentPath; |
|
|
|
if (grand.isCallExpression() || grand.isNewExpression()) { |
|
if (grand.node.callee === parent) { |
|
obj = grand.get("arguments")[path.key]; |
|
} |
|
} |
|
} |
|
|
|
let id = null; |
|
let placement = null; |
|
if (obj) ({ |
|
id, |
|
placement |
|
} = (0, _utils.resolveSource)(obj)); |
|
|
|
for (const prop of path.get("properties")) { |
|
if (prop.isObjectProperty()) { |
|
const key = (0, _utils.resolveKey)(prop.get("key")); |
|
if (key) property(id, key, placement, prop); |
|
} |
|
} |
|
}, |
|
|
|
BinaryExpression(path) { |
|
if (path.node.operator !== "in") return; |
|
const source = (0, _utils.resolveSource)(path.get("right")); |
|
const key = (0, _utils.resolveKey)(path.get("left"), true); |
|
if (!key) return; |
|
callProvider({ |
|
kind: "in", |
|
object: source.id, |
|
key, |
|
placement: source.placement |
|
}, path); |
|
} |
|
|
|
}; |
|
}; |
|
|
|
exports.default = _default; |