17c804472Sopenharmony_ci/* 27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 47c804472Sopenharmony_ci * you may not use this file except in compliance with the License. 57c804472Sopenharmony_ci * You may obtain a copy of the License at 67c804472Sopenharmony_ci * 77c804472Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 87c804472Sopenharmony_ci * 97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 127c804472Sopenharmony_ci * See the License for the specific language governing permissions and 137c804472Sopenharmony_ci * limitations under the License. 147c804472Sopenharmony_ci */ 157c804472Sopenharmony_ci 167c804472Sopenharmony_ciimport type { SourceFile } from 'typescript'; 177c804472Sopenharmony_ciimport { SyntaxKind } from 'typescript'; 187c804472Sopenharmony_ciimport type { FunctionEntity } from '../declaration-node/functionDeclaration'; 197c804472Sopenharmony_ciimport { 207c804472Sopenharmony_ci getCallbackStatement, 217c804472Sopenharmony_ci getReturnStatement, 227c804472Sopenharmony_ci getWarnConsole, 237c804472Sopenharmony_ci getReturnData, 247c804472Sopenharmony_ci getOverloadedFunctionCallbackStatement, 257c804472Sopenharmony_ci overloadedFunctionArr 267c804472Sopenharmony_ci} from './generateCommonUtil'; 277c804472Sopenharmony_ciimport { methodArrayItemForEach } from './generateCommonMethod'; 287c804472Sopenharmony_ci 297c804472Sopenharmony_ciinterface AssemblyFunctionProps { 307c804472Sopenharmony_ci functionArray: Array<FunctionEntity>; 317c804472Sopenharmony_ci functionEntity: FunctionEntity; 327c804472Sopenharmony_ci functionBody: string; 337c804472Sopenharmony_ci sourceFile: SourceFile; 347c804472Sopenharmony_ci mockApi: string; 357c804472Sopenharmony_ci} 367c804472Sopenharmony_ci 377c804472Sopenharmony_ciinterface AssemblyFunctionBack { 387c804472Sopenharmony_ci isReturnPromise: boolean; 397c804472Sopenharmony_ci promiseReturnValue: string; 407c804472Sopenharmony_ci functionOtherReturnValue: string; 417c804472Sopenharmony_ci isCallBack: boolean; 427c804472Sopenharmony_ci functionBody: string; 437c804472Sopenharmony_ci} 447c804472Sopenharmony_ci 457c804472Sopenharmony_ci/** 467c804472Sopenharmony_ci * generate function 477c804472Sopenharmony_ci * @param rootName 487c804472Sopenharmony_ci * @param functionArray 497c804472Sopenharmony_ci * @param sourceFile 507c804472Sopenharmony_ci * @param mockApi 517c804472Sopenharmony_ci * @param isRoot 527c804472Sopenharmony_ci * @returns 537c804472Sopenharmony_ci */ 547c804472Sopenharmony_ciexport function generateCommonFunction( 557c804472Sopenharmony_ci rootName: string, 567c804472Sopenharmony_ci functionArray: Array<FunctionEntity>, 577c804472Sopenharmony_ci sourceFile: SourceFile, 587c804472Sopenharmony_ci mockApi: string, 597c804472Sopenharmony_ci isRoot: boolean 607c804472Sopenharmony_ci): string { 617c804472Sopenharmony_ci let functionBody = ''; 627c804472Sopenharmony_ci const functionEntity = functionArray[0]; 637c804472Sopenharmony_ci if (isRoot) { 647c804472Sopenharmony_ci functionBody = `${functionEntity.isExport ? 'export ' : ''}const ${ 657c804472Sopenharmony_ci functionEntity.functionName 667c804472Sopenharmony_ci } = function(...args) {`; 677c804472Sopenharmony_ci } else { 687c804472Sopenharmony_ci functionBody = `${functionEntity.functionName}: function(...args) {`; 697c804472Sopenharmony_ci } 707c804472Sopenharmony_ci functionBody += getWarnConsole(rootName, functionEntity.functionName); 717c804472Sopenharmony_ci 727c804472Sopenharmony_ci if (functionArray.length === 1) { 737c804472Sopenharmony_ci const args = functionEntity.args; 747c804472Sopenharmony_ci const len = args.length; 757c804472Sopenharmony_ci if (len && args[len - 1].paramName.toLowerCase().includes('callback')) { 767c804472Sopenharmony_ci functionBody += getCallbackStatement(mockApi, args[len - 1]?.paramTypeString); 777c804472Sopenharmony_ci } 787c804472Sopenharmony_ci if (functionEntity.returnType.returnKind !== SyntaxKind.VoidKeyword) { 797c804472Sopenharmony_ci if (rootName === 'featureAbility' && functionEntity.returnType.returnKindName === 'Context') { 807c804472Sopenharmony_ci functionBody += 'return _Context;'; 817c804472Sopenharmony_ci } else if (rootName === 'inputMethod' && functionEntity.returnType.returnKindName === 'InputMethodSubtype') { 827c804472Sopenharmony_ci functionBody += 'return mockInputMethodSubtype().InputMethodSubtype;'; 837c804472Sopenharmony_ci } else { 847c804472Sopenharmony_ci functionBody += getReturnStatement(functionEntity.returnType, sourceFile); 857c804472Sopenharmony_ci } 867c804472Sopenharmony_ci } 877c804472Sopenharmony_ci } else { 887c804472Sopenharmony_ci const assemblyBack = assemblyFunctionBody({ functionArray, functionEntity, functionBody, mockApi, sourceFile }); 897c804472Sopenharmony_ci functionBody = assemblyFuntion(assemblyBack, functionArray, sourceFile, mockApi); 907c804472Sopenharmony_ci functionBody = assemblyBack.functionBody; 917c804472Sopenharmony_ci } 927c804472Sopenharmony_ci functionBody += isRoot ? '};' : '},'; 937c804472Sopenharmony_ci if (isRoot) { 947c804472Sopenharmony_ci functionBody += ` 957c804472Sopenharmony_ci if (!global.${functionEntity.functionName}) { 967c804472Sopenharmony_ci global.${functionEntity.functionName} = ${functionEntity.functionName}; 977c804472Sopenharmony_ci } 987c804472Sopenharmony_ci `; 997c804472Sopenharmony_ci } 1007c804472Sopenharmony_ci return functionBody; 1017c804472Sopenharmony_ci} 1027c804472Sopenharmony_ci 1037c804472Sopenharmony_ci/** 1047c804472Sopenharmony_ci * generate assembly function 1057c804472Sopenharmony_ci * @param props 1067c804472Sopenharmony_ci * @returns 1077c804472Sopenharmony_ci */ 1087c804472Sopenharmony_cifunction assemblyFunctionBody(props: AssemblyFunctionProps): AssemblyFunctionBack { 1097c804472Sopenharmony_ci let argSet: Set<string> = new Set<string>(); 1107c804472Sopenharmony_ci let argParamsSet: string = ''; 1117c804472Sopenharmony_ci let returnSet: Set<string> = new Set<string>(); 1127c804472Sopenharmony_ci let isCallBack = false; 1137c804472Sopenharmony_ci let needOverloaded = false; 1147c804472Sopenharmony_ci props.functionArray.forEach(value => { 1157c804472Sopenharmony_ci ({ returnSet, argSet, isCallBack, argParamsSet, needOverloaded} = 1167c804472Sopenharmony_ci methodArrayItemForEach({returnSet, value, argSet, isCallBack, argParamsSet, needOverloaded})); 1177c804472Sopenharmony_ci }); 1187c804472Sopenharmony_ci props.functionBody = forEachFuntionArray(isCallBack, props, needOverloaded, argParamsSet); 1197c804472Sopenharmony_ci let isReturnPromise = false; 1207c804472Sopenharmony_ci let promiseReturnValue = ''; 1217c804472Sopenharmony_ci let functionOtherReturnValue = ''; 1227c804472Sopenharmony_ci returnSet.forEach(value => { 1237c804472Sopenharmony_ci if (value.includes('Promise<')) { 1247c804472Sopenharmony_ci isReturnPromise = true; 1257c804472Sopenharmony_ci promiseReturnValue = value; 1267c804472Sopenharmony_ci } else { 1277c804472Sopenharmony_ci if (!functionOtherReturnValue) { 1287c804472Sopenharmony_ci functionOtherReturnValue = value; 1297c804472Sopenharmony_ci } 1307c804472Sopenharmony_ci } 1317c804472Sopenharmony_ci }); 1327c804472Sopenharmony_ci return { 1337c804472Sopenharmony_ci isReturnPromise, 1347c804472Sopenharmony_ci promiseReturnValue, 1357c804472Sopenharmony_ci functionOtherReturnValue, 1367c804472Sopenharmony_ci isCallBack, 1377c804472Sopenharmony_ci functionBody: props.functionBody 1387c804472Sopenharmony_ci }; 1397c804472Sopenharmony_ci} 1407c804472Sopenharmony_ci 1417c804472Sopenharmony_ci/** 1427c804472Sopenharmony_ci * forEach functionArray 1437c804472Sopenharmony_ci * @param isCallBack 1447c804472Sopenharmony_ci * @param props 1457c804472Sopenharmony_ci * @param needOverloaded 1467c804472Sopenharmony_ci * @param argParamsSet 1477c804472Sopenharmony_ci * @returns 1487c804472Sopenharmony_ci */ 1497c804472Sopenharmony_cifunction forEachFuntionArray( 1507c804472Sopenharmony_ci isCallBack: boolean, 1517c804472Sopenharmony_ci props: AssemblyFunctionProps, 1527c804472Sopenharmony_ci needOverloaded: boolean, 1537c804472Sopenharmony_ci argParamsSet: string 1547c804472Sopenharmony_ci): string { 1557c804472Sopenharmony_ci if (isCallBack) { 1567c804472Sopenharmony_ci if (overloadedFunctionArr.includes(props.functionEntity.functionName) && needOverloaded) { 1577c804472Sopenharmony_ci const stateEment = getOverloadedFunctionCallbackStatement(props.functionArray, props.sourceFile, props.mockApi); 1587c804472Sopenharmony_ci props.functionBody += stateEment; 1597c804472Sopenharmony_ci } else { 1607c804472Sopenharmony_ci props.functionBody += getCallbackStatement(props.mockApi, argParamsSet); 1617c804472Sopenharmony_ci } 1627c804472Sopenharmony_ci } 1637c804472Sopenharmony_ci return props.functionBody; 1647c804472Sopenharmony_ci} 1657c804472Sopenharmony_ci 1667c804472Sopenharmony_ci/** 1677c804472Sopenharmony_ci * assembly Function 1687c804472Sopenharmony_ci * @param porps 1697c804472Sopenharmony_ci * @param functionArray 1707c804472Sopenharmony_ci * @param sourceFile 1717c804472Sopenharmony_ci * @param mockApi 1727c804472Sopenharmony_ci * @returns 1737c804472Sopenharmony_ci */ 1747c804472Sopenharmony_cifunction assemblyFuntion( 1757c804472Sopenharmony_ci porps: AssemblyFunctionBack, 1767c804472Sopenharmony_ci functionArray: Array<FunctionEntity>, 1777c804472Sopenharmony_ci sourceFile: SourceFile, 1787c804472Sopenharmony_ci mockApi: string 1797c804472Sopenharmony_ci): string { 1807c804472Sopenharmony_ci if (porps.isReturnPromise) { 1817c804472Sopenharmony_ci if (porps.promiseReturnValue) { 1827c804472Sopenharmony_ci let returnType = null; 1837c804472Sopenharmony_ci functionArray.forEach(value => { 1847c804472Sopenharmony_ci if (value.returnType.returnKindName === porps.promiseReturnValue) { 1857c804472Sopenharmony_ci returnType = value.returnType; 1867c804472Sopenharmony_ci } 1877c804472Sopenharmony_ci }); 1887c804472Sopenharmony_ci porps.functionBody += getReturnData(porps.isCallBack, porps.isReturnPromise, returnType, sourceFile, mockApi); 1897c804472Sopenharmony_ci } else { 1907c804472Sopenharmony_ci porps.functionBody += ` 1917c804472Sopenharmony_ci return new Promise((resolve, reject) => { 1927c804472Sopenharmony_ci resolve('[PC Preview] unknow boolean'); 1937c804472Sopenharmony_ci }) 1947c804472Sopenharmony_ci `; 1957c804472Sopenharmony_ci } 1967c804472Sopenharmony_ci } else if (porps.functionOtherReturnValue) { 1977c804472Sopenharmony_ci let returnType = null; 1987c804472Sopenharmony_ci functionArray.forEach(value => { 1997c804472Sopenharmony_ci if (value.returnType.returnKindName === porps.functionOtherReturnValue) { 2007c804472Sopenharmony_ci returnType = value.returnType; 2017c804472Sopenharmony_ci } 2027c804472Sopenharmony_ci }); 2037c804472Sopenharmony_ci porps.functionBody += getReturnData(porps.isCallBack, porps.isReturnPromise, returnType, sourceFile, mockApi); 2047c804472Sopenharmony_ci } 2057c804472Sopenharmony_ci return porps.functionBody; 2067c804472Sopenharmony_ci} 207