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 { MethodSignatureEntity } from '../declaration-node/methodSignatureDeclaration'; 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 MethodSignatureArrayProps { 307c804472Sopenharmony_ci methodSignatureArray: Array<MethodSignatureEntity>; 317c804472Sopenharmony_ci methodEntity: MethodSignatureEntity; 327c804472Sopenharmony_ci methodSignatureBody: string; 337c804472Sopenharmony_ci sourceFile: SourceFile; 347c804472Sopenharmony_ci mockApi: string; 357c804472Sopenharmony_ci} 367c804472Sopenharmony_ci 377c804472Sopenharmony_ciinterface MethodSignatureArrayBack { 387c804472Sopenharmony_ci methodSignatureArray: Array<MethodSignatureEntity>; 397c804472Sopenharmony_ci returnSet: Set<string>; 407c804472Sopenharmony_ci isCallBack: boolean; 417c804472Sopenharmony_ci methodSignatureBody: string; 427c804472Sopenharmony_ci} 437c804472Sopenharmony_ci 447c804472Sopenharmony_ci/** 457c804472Sopenharmony_ci * generate interface signature method 467c804472Sopenharmony_ci * @param rootName 477c804472Sopenharmony_ci * @param methodSignatureArray 487c804472Sopenharmony_ci * @param sourceFile 497c804472Sopenharmony_ci * @returns 507c804472Sopenharmony_ci */ 517c804472Sopenharmony_ciexport function generateCommonMethodSignature( 527c804472Sopenharmony_ci rootName: string, 537c804472Sopenharmony_ci methodSignatureArray: Array<MethodSignatureEntity>, 547c804472Sopenharmony_ci sourceFile: SourceFile, 557c804472Sopenharmony_ci mockApi: string 567c804472Sopenharmony_ci): string { 577c804472Sopenharmony_ci let methodSignatureBody = ''; 587c804472Sopenharmony_ci const methodEntity = methodSignatureArray[0]; 597c804472Sopenharmony_ci methodSignatureBody += `${methodEntity.functionName}: function(...args) {`; 607c804472Sopenharmony_ci methodSignatureBody += getWarnConsole(rootName, methodEntity.functionName); 617c804472Sopenharmony_ci if (methodSignatureArray.length === 1) { 627c804472Sopenharmony_ci const args = methodEntity.args; 637c804472Sopenharmony_ci const len = args.length; 647c804472Sopenharmony_ci if (len && args[len - 1].paramName.toLowerCase().includes('callback')) { 657c804472Sopenharmony_ci methodSignatureBody += getCallbackStatement(mockApi, args[len - 1]?.paramTypeString); 667c804472Sopenharmony_ci } 677c804472Sopenharmony_ci if (methodEntity.returnType.returnKind !== SyntaxKind.VoidKeyword) { 687c804472Sopenharmony_ci if (rootName === 'Context' && methodEntity.returnType.returnKindName === 'Context') { 697c804472Sopenharmony_ci methodSignatureBody += 'return Context;'; 707c804472Sopenharmony_ci } else { 717c804472Sopenharmony_ci methodSignatureBody += getReturnStatement(methodEntity.returnType, sourceFile); 727c804472Sopenharmony_ci } 737c804472Sopenharmony_ci } 747c804472Sopenharmony_ci } else { 757c804472Sopenharmony_ci const methodSignatureArrayBack = methodSignatureArrayForEach({ 767c804472Sopenharmony_ci methodSignatureArray, 777c804472Sopenharmony_ci methodEntity, 787c804472Sopenharmony_ci methodSignatureBody, 797c804472Sopenharmony_ci sourceFile, 807c804472Sopenharmony_ci mockApi 817c804472Sopenharmony_ci }); 827c804472Sopenharmony_ci methodSignatureBody = returnSetForEach(methodSignatureArrayBack, sourceFile, mockApi); 837c804472Sopenharmony_ci } 847c804472Sopenharmony_ci methodSignatureBody += '},\n'; 857c804472Sopenharmony_ci return methodSignatureBody; 867c804472Sopenharmony_ci} 877c804472Sopenharmony_ci 887c804472Sopenharmony_ci/** 897c804472Sopenharmony_ci * returnSet ForEach 907c804472Sopenharmony_ci * @param porps 917c804472Sopenharmony_ci * @param sourceFile 927c804472Sopenharmony_ci * @param mockApi 937c804472Sopenharmony_ci * @returns 947c804472Sopenharmony_ci */ 957c804472Sopenharmony_cifunction returnSetForEach(porps: MethodSignatureArrayBack, sourceFile: SourceFile, mockApi: string): string { 967c804472Sopenharmony_ci let isReturnPromise = false; 977c804472Sopenharmony_ci let promiseReturnValue = ''; 987c804472Sopenharmony_ci let methodSignatureOtherReturnValue = ''; 997c804472Sopenharmony_ci porps.returnSet.forEach(value => { 1007c804472Sopenharmony_ci if (value.includes('Promise<')) { 1017c804472Sopenharmony_ci isReturnPromise = true; 1027c804472Sopenharmony_ci promiseReturnValue = value; 1037c804472Sopenharmony_ci } else { 1047c804472Sopenharmony_ci if (!methodSignatureOtherReturnValue) { 1057c804472Sopenharmony_ci methodSignatureOtherReturnValue = value; 1067c804472Sopenharmony_ci } 1077c804472Sopenharmony_ci } 1087c804472Sopenharmony_ci }); 1097c804472Sopenharmony_ci if (isReturnPromise) { 1107c804472Sopenharmony_ci if (promiseReturnValue) { 1117c804472Sopenharmony_ci let returnType = null; 1127c804472Sopenharmony_ci porps.methodSignatureArray.forEach(value => { 1137c804472Sopenharmony_ci if (value.returnType.returnKindName === promiseReturnValue) { 1147c804472Sopenharmony_ci returnType = value.returnType; 1157c804472Sopenharmony_ci } 1167c804472Sopenharmony_ci }); 1177c804472Sopenharmony_ci porps.methodSignatureBody += getReturnData(porps.isCallBack, isReturnPromise, returnType, sourceFile, mockApi); 1187c804472Sopenharmony_ci } else { 1197c804472Sopenharmony_ci porps.methodSignatureBody += ` 1207c804472Sopenharmony_ci return new Promise((resolve, reject) => { 1217c804472Sopenharmony_ci resolve('[PC Preview] unknow boolean'); 1227c804472Sopenharmony_ci }) 1237c804472Sopenharmony_ci `; 1247c804472Sopenharmony_ci } 1257c804472Sopenharmony_ci } else if (methodSignatureOtherReturnValue) { 1267c804472Sopenharmony_ci let returnType = null; 1277c804472Sopenharmony_ci porps.methodSignatureArray.forEach(value => { 1287c804472Sopenharmony_ci if (value.returnType.returnKindName === methodSignatureOtherReturnValue) { 1297c804472Sopenharmony_ci returnType = value.returnType; 1307c804472Sopenharmony_ci } 1317c804472Sopenharmony_ci }); 1327c804472Sopenharmony_ci porps.methodSignatureBody += getReturnData(porps.isCallBack, isReturnPromise, returnType, sourceFile, mockApi); 1337c804472Sopenharmony_ci } 1347c804472Sopenharmony_ci return porps.methodSignatureBody; 1357c804472Sopenharmony_ci} 1367c804472Sopenharmony_ci 1377c804472Sopenharmony_ci/** 1387c804472Sopenharmony_ci * methodSignatureArray ForEach 1397c804472Sopenharmony_ci * @param porps 1407c804472Sopenharmony_ci * @returns 1417c804472Sopenharmony_ci */ 1427c804472Sopenharmony_cifunction methodSignatureArrayForEach(porps: MethodSignatureArrayProps): MethodSignatureArrayBack { 1437c804472Sopenharmony_ci let argSet: Set<string> = new Set<string>(); 1447c804472Sopenharmony_ci let argParamsSet: string = ''; 1457c804472Sopenharmony_ci let returnSet: Set<string> = new Set<string>(); 1467c804472Sopenharmony_ci let isCallBack = false; 1477c804472Sopenharmony_ci let needOverloaded = false; 1487c804472Sopenharmony_ci const methodSignatureArray = porps.methodSignatureArray; 1497c804472Sopenharmony_ci const sourceFile = porps.sourceFile; 1507c804472Sopenharmony_ci const mockApi = porps.mockApi; 1517c804472Sopenharmony_ci porps.methodSignatureArray.forEach(value => { 1527c804472Sopenharmony_ci ({ returnSet, argSet, isCallBack, argParamsSet, needOverloaded} = 1537c804472Sopenharmony_ci methodArrayItemForEach({returnSet, value, argSet, isCallBack, argParamsSet, needOverloaded})); 1547c804472Sopenharmony_ci }); 1557c804472Sopenharmony_ci if (isCallBack) { 1567c804472Sopenharmony_ci if (overloadedFunctionArr.includes(porps.methodEntity.functionName) && needOverloaded) { 1577c804472Sopenharmony_ci porps.methodSignatureBody += getOverloadedFunctionCallbackStatement(methodSignatureArray, sourceFile, mockApi); 1587c804472Sopenharmony_ci } else { 1597c804472Sopenharmony_ci porps.methodSignatureBody += getCallbackStatement(porps.mockApi, argParamsSet); 1607c804472Sopenharmony_ci } 1617c804472Sopenharmony_ci } 1627c804472Sopenharmony_ci return { 1637c804472Sopenharmony_ci returnSet, 1647c804472Sopenharmony_ci isCallBack, 1657c804472Sopenharmony_ci methodSignatureBody: porps.methodSignatureBody, 1667c804472Sopenharmony_ci methodSignatureArray: porps.methodSignatureArray 1677c804472Sopenharmony_ci }; 1687c804472Sopenharmony_ci} 169