summaryrefslogtreecommitdiff
path: root/node_modules/@babel/helper-define-polyfill-provider/lib/visitors/usage.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/@babel/helper-define-polyfill-provider/lib/visitors/usage.js')
-rw-r--r--node_modules/@babel/helper-define-polyfill-provider/lib/visitors/usage.js91
1 files changed, 91 insertions, 0 deletions
diff --git a/node_modules/@babel/helper-define-polyfill-provider/lib/visitors/usage.js b/node_modules/@babel/helper-define-polyfill-provider/lib/visitors/usage.js
new file mode 100644
index 00000000..4a4c5472
--- /dev/null
+++ b/node_modules/@babel/helper-define-polyfill-provider/lib/visitors/usage.js
@@ -0,0 +1,91 @@
+"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");
+ if (object.isIdentifier()) {
+ 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; \ No newline at end of file