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.
		
		
		
		
		
			
		
			
				
					
					
						
							149 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
	
	
							149 lines
						
					
					
						
							4.9 KiB
						
					
					
				| "use strict";
 | |
| 
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|   value: true
 | |
| });
 | |
| exports.default = convertFunctionParams;
 | |
| var _core = require("@babel/core");
 | |
| var _shadowUtils = require("./shadow-utils");
 | |
| const buildDefaultParam = _core.template.statement(`
 | |
|   let VARIABLE_NAME =
 | |
|     arguments.length > ARGUMENT_KEY && arguments[ARGUMENT_KEY] !== undefined ?
 | |
|       arguments[ARGUMENT_KEY]
 | |
|     :
 | |
|       DEFAULT_VALUE;
 | |
| `);
 | |
| const buildLooseDefaultParam = _core.template.statement(`
 | |
|   if (ASSIGNMENT_IDENTIFIER === UNDEFINED) {
 | |
|     ASSIGNMENT_IDENTIFIER = DEFAULT_VALUE;
 | |
|   }
 | |
| `);
 | |
| const buildLooseDestructuredDefaultParam = _core.template.statement(`
 | |
|   let ASSIGNMENT_IDENTIFIER = PARAMETER_NAME === UNDEFINED ? DEFAULT_VALUE : PARAMETER_NAME ;
 | |
| `);
 | |
| const buildSafeArgumentsAccess = _core.template.statement(`
 | |
|   let $0 = arguments.length > $1 ? arguments[$1] : undefined;
 | |
| `);
 | |
| 
 | |
| function convertFunctionParams(path, ignoreFunctionLength, shouldTransformParam, replaceRestElement) {
 | |
|   const params = path.get("params");
 | |
|   const isSimpleParameterList = params.every(param => param.isIdentifier());
 | |
|   if (isSimpleParameterList) return false;
 | |
|   const {
 | |
|     node,
 | |
|     scope
 | |
|   } = path;
 | |
|   const body = [];
 | |
|   const shadowedParams = new Set();
 | |
|   for (const param of params) {
 | |
|     (0, _shadowUtils.collectShadowedParamsNames)(param, scope, shadowedParams);
 | |
|   }
 | |
|   const state = {
 | |
|     needsOuterBinding: false,
 | |
|     scope
 | |
|   };
 | |
|   if (shadowedParams.size === 0) {
 | |
|     for (const param of params) {
 | |
|       if (!param.isIdentifier()) param.traverse(_shadowUtils.iifeVisitor, state);
 | |
|       if (state.needsOuterBinding) break;
 | |
|     }
 | |
|   }
 | |
|   let firstOptionalIndex = null;
 | |
|   for (let i = 0; i < params.length; i++) {
 | |
|     const param = params[i];
 | |
|     if (shouldTransformParam && !shouldTransformParam(i)) {
 | |
|       continue;
 | |
|     }
 | |
|     const transformedRestNodes = [];
 | |
|     if (replaceRestElement) {
 | |
|       replaceRestElement(path, param, transformedRestNodes);
 | |
|     }
 | |
|     const paramIsAssignmentPattern = param.isAssignmentPattern();
 | |
|     if (paramIsAssignmentPattern && (ignoreFunctionLength || _core.types.isMethod(node, {
 | |
|       kind: "set"
 | |
|     }))) {
 | |
|       const left = param.get("left");
 | |
|       const right = param.get("right");
 | |
|       const undefinedNode = scope.buildUndefinedNode();
 | |
|       if (left.isIdentifier()) {
 | |
|         body.push(buildLooseDefaultParam({
 | |
|           ASSIGNMENT_IDENTIFIER: _core.types.cloneNode(left.node),
 | |
|           DEFAULT_VALUE: right.node,
 | |
|           UNDEFINED: undefinedNode
 | |
|         }));
 | |
|         param.replaceWith(left.node);
 | |
|       } else if (left.isObjectPattern() || left.isArrayPattern()) {
 | |
|         const paramName = scope.generateUidIdentifier();
 | |
|         body.push(buildLooseDestructuredDefaultParam({
 | |
|           ASSIGNMENT_IDENTIFIER: left.node,
 | |
|           DEFAULT_VALUE: right.node,
 | |
|           PARAMETER_NAME: _core.types.cloneNode(paramName),
 | |
|           UNDEFINED: undefinedNode
 | |
|         }));
 | |
|         param.replaceWith(paramName);
 | |
|       }
 | |
|     } else if (paramIsAssignmentPattern) {
 | |
|       if (firstOptionalIndex === null) firstOptionalIndex = i;
 | |
|       const left = param.get("left");
 | |
|       const right = param.get("right");
 | |
|       const defNode = buildDefaultParam({
 | |
|         VARIABLE_NAME: left.node,
 | |
|         DEFAULT_VALUE: right.node,
 | |
|         ARGUMENT_KEY: _core.types.numericLiteral(i)
 | |
|       });
 | |
|       body.push(defNode);
 | |
|     } else if (firstOptionalIndex !== null) {
 | |
|       const defNode = buildSafeArgumentsAccess([param.node, _core.types.numericLiteral(i)]);
 | |
|       body.push(defNode);
 | |
|     } else if (param.isObjectPattern() || param.isArrayPattern()) {
 | |
|       const uid = path.scope.generateUidIdentifier("ref");
 | |
|       uid.typeAnnotation = param.node.typeAnnotation;
 | |
|       const defNode = _core.types.variableDeclaration("let", [_core.types.variableDeclarator(param.node, uid)]);
 | |
|       body.push(defNode);
 | |
|       param.replaceWith(_core.types.cloneNode(uid));
 | |
|     }
 | |
|     if (transformedRestNodes) {
 | |
|       for (const transformedNode of transformedRestNodes) {
 | |
|         body.push(transformedNode);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (firstOptionalIndex !== null) {
 | |
|     node.params = node.params.slice(0, firstOptionalIndex);
 | |
|   }
 | |
| 
 | |
|   path.ensureBlock();
 | |
|   const {
 | |
|     async,
 | |
|     generator
 | |
|   } = node;
 | |
|   if (generator || state.needsOuterBinding || shadowedParams.size > 0) {
 | |
|     body.push((0, _shadowUtils.buildScopeIIFE)(shadowedParams, path.node.body));
 | |
|     path.set("body", _core.types.blockStatement(body));
 | |
| 
 | |
|     const bodyPath = path.get("body.body");
 | |
|     const arrowPath = bodyPath[bodyPath.length - 1].get("argument.callee");
 | |
| 
 | |
|     arrowPath.arrowFunctionToExpression();
 | |
|     arrowPath.node.generator = generator;
 | |
|     arrowPath.node.async = async;
 | |
|     node.generator = false;
 | |
|     node.async = false;
 | |
|     if (async) {
 | |
|       path.node.body = _core.template.statement.ast`{
 | |
|         try {
 | |
|           ${path.node.body.body}
 | |
|         } catch (e) {
 | |
|           return Promise.reject(e);
 | |
|         }
 | |
|       }`;
 | |
|     }
 | |
|   } else {
 | |
|     path.get("body").unshiftContainer("body", body);
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| //# sourceMappingURL=params.js.map
 |