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.
		
		
		
		
		
			
		
			
				
					107 lines
				
				3.4 KiB
			
		
		
			
		
	
	
					107 lines
				
				3.4 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.extractComputedKeys = extractComputedKeys; | ||
|  | exports.injectInitialization = injectInitialization; | ||
|  | var _core = require("@babel/core"); | ||
|  | var _helperEnvironmentVisitor = require("@babel/helper-environment-visitor"); | ||
|  | const findBareSupers = _core.traverse.visitors.merge([{ | ||
|  |   Super(path) { | ||
|  |     const { | ||
|  |       node, | ||
|  |       parentPath | ||
|  |     } = path; | ||
|  |     if (parentPath.isCallExpression({ | ||
|  |       callee: node | ||
|  |     })) { | ||
|  |       this.push(parentPath); | ||
|  |     } | ||
|  |   } | ||
|  | }, _helperEnvironmentVisitor.default]); | ||
|  | const referenceVisitor = { | ||
|  |   "TSTypeAnnotation|TypeAnnotation"(path) { | ||
|  |     path.skip(); | ||
|  |   }, | ||
|  |   ReferencedIdentifier(path, { | ||
|  |     scope | ||
|  |   }) { | ||
|  |     if (scope.hasOwnBinding(path.node.name)) { | ||
|  |       scope.rename(path.node.name); | ||
|  |       path.skip(); | ||
|  |     } | ||
|  |   } | ||
|  | }; | ||
|  | function handleClassTDZ(path, state) { | ||
|  |   if (state.classBinding && state.classBinding === path.scope.getBinding(path.node.name)) { | ||
|  |     const classNameTDZError = state.file.addHelper("classNameTDZError"); | ||
|  |     const throwNode = _core.types.callExpression(classNameTDZError, [_core.types.stringLiteral(path.node.name)]); | ||
|  |     path.replaceWith(_core.types.sequenceExpression([throwNode, path.node])); | ||
|  |     path.skip(); | ||
|  |   } | ||
|  | } | ||
|  | const classFieldDefinitionEvaluationTDZVisitor = { | ||
|  |   ReferencedIdentifier: handleClassTDZ | ||
|  | }; | ||
|  | function injectInitialization(path, constructor, nodes, renamer) { | ||
|  |   if (!nodes.length) return; | ||
|  |   const isDerived = !!path.node.superClass; | ||
|  |   if (!constructor) { | ||
|  |     const newConstructor = _core.types.classMethod("constructor", _core.types.identifier("constructor"), [], _core.types.blockStatement([])); | ||
|  |     if (isDerived) { | ||
|  |       newConstructor.params = [_core.types.restElement(_core.types.identifier("args"))]; | ||
|  |       newConstructor.body.body.push(_core.template.statement.ast`super(...args)`); | ||
|  |     } | ||
|  |     [constructor] = path.get("body").unshiftContainer("body", newConstructor); | ||
|  |   } | ||
|  |   if (renamer) { | ||
|  |     renamer(referenceVisitor, { | ||
|  |       scope: constructor.scope | ||
|  |     }); | ||
|  |   } | ||
|  |   if (isDerived) { | ||
|  |     const bareSupers = []; | ||
|  |     constructor.traverse(findBareSupers, bareSupers); | ||
|  |     let isFirst = true; | ||
|  |     for (const bareSuper of bareSupers) { | ||
|  |       if (isFirst) { | ||
|  |         bareSuper.insertAfter(nodes); | ||
|  |         isFirst = false; | ||
|  |       } else { | ||
|  |         bareSuper.insertAfter(nodes.map(n => _core.types.cloneNode(n))); | ||
|  |       } | ||
|  |     } | ||
|  |   } else { | ||
|  |     constructor.get("body").unshiftContainer("body", nodes); | ||
|  |   } | ||
|  | } | ||
|  | function extractComputedKeys(path, computedPaths, file) { | ||
|  |   const declarations = []; | ||
|  |   const state = { | ||
|  |     classBinding: path.node.id && path.scope.getBinding(path.node.id.name), | ||
|  |     file | ||
|  |   }; | ||
|  |   for (const computedPath of computedPaths) { | ||
|  |     const computedKey = computedPath.get("key"); | ||
|  |     if (computedKey.isReferencedIdentifier()) { | ||
|  |       handleClassTDZ(computedKey, state); | ||
|  |     } else { | ||
|  |       computedKey.traverse(classFieldDefinitionEvaluationTDZVisitor, state); | ||
|  |     } | ||
|  |     const computedNode = computedPath.node; | ||
|  |     if (!computedKey.isConstantExpression()) { | ||
|  |       const ident = path.scope.generateUidIdentifierBasedOnNode(computedNode.key); | ||
|  |       path.scope.push({ | ||
|  |         id: ident, | ||
|  |         kind: "let" | ||
|  |       }); | ||
|  |       declarations.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.cloneNode(ident), computedNode.key))); | ||
|  |       computedNode.key = _core.types.cloneNode(ident); | ||
|  |     } | ||
|  |   } | ||
|  |   return declarations; | ||
|  | } | ||
|  | 
 | ||
|  | //# sourceMappingURL=misc.js.map
 |