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.
		
		
		
		
		
			
		
			
				
					101 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					101 lines
				
				2.6 KiB
			| 
											3 years ago
										 | "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; |