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
			| 
											3 years ago
										 | "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
 |