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 { firstCharacterToUppercase, getClassNameSet, specialType } from '../common/commonUtils'; 197c804472Sopenharmony_ciimport type { ReturnTypeEntity } from '../common/commonUtils'; 207c804472Sopenharmony_ciimport { getImportDeclarationArray } from '../declaration-node/importAndExportDeclaration'; 217c804472Sopenharmony_ciimport type { ImportElementEntity } from '../declaration-node/importAndExportDeclaration'; 227c804472Sopenharmony_ciimport type { MethodEntity } from '../declaration-node/methodDeclaration'; 237c804472Sopenharmony_ciimport type { FunctionEntity } from '../declaration-node/functionDeclaration'; 247c804472Sopenharmony_ciimport type { MethodSignatureEntity } from '../declaration-node/methodSignatureDeclaration'; 257c804472Sopenharmony_ci 267c804472Sopenharmony_ciconst repeatReturn = `} else { 277c804472Sopenharmony_ci return { 287c804472Sopenharmony_ci done: true 297c804472Sopenharmony_ci }; 307c804472Sopenharmony_ci }`; 317c804472Sopenharmony_ci 327c804472Sopenharmony_ciconst repeatString = `index++; 337c804472Sopenharmony_ci return { 347c804472Sopenharmony_ci value: returnValue, 357c804472Sopenharmony_ci done: false 367c804472Sopenharmony_ci }; 377c804472Sopenharmony_ci ${repeatReturn} 387c804472Sopenharmony_ci } 397c804472Sopenharmony_ci };`; 407c804472Sopenharmony_ci 417c804472Sopenharmony_ciconst iteratorEntriesMock = ` 427c804472Sopenharmony_ci let index = 0; 437c804472Sopenharmony_ci const IteratorEntriesMock = { 447c804472Sopenharmony_ci *[Symbol.iterator]() { 457c804472Sopenharmony_ci yield ['[PC Preview] unknown paramIterMock_K', '[PC Preview] unknown paramIterMock_V']; 467c804472Sopenharmony_ci }, 477c804472Sopenharmony_ci next: () => { 487c804472Sopenharmony_ci if (index < 1) { 497c804472Sopenharmony_ci const returnValue = ['[PC Previwe] unknown paramIterMock_K', '[PC Previwe] unknown paramIterMock_V']; 507c804472Sopenharmony_ci ${repeatString} 517c804472Sopenharmony_ci return IteratorEntriesMock; 527c804472Sopenharmony_ci`; 537c804472Sopenharmony_ci 547c804472Sopenharmony_ciconst iteratorStringMock = ` 557c804472Sopenharmony_ci let index = 0; 567c804472Sopenharmony_ci const IteratorStringMock = { 577c804472Sopenharmony_ci *[Symbol.iterator]() { 587c804472Sopenharmony_ci yield '[PC Preview] unknown string'; 597c804472Sopenharmony_ci }, 607c804472Sopenharmony_ci next: () => { 617c804472Sopenharmony_ci if (index < 1) { 627c804472Sopenharmony_ci const returnValue = '[PC Previwe] unknown string'; 637c804472Sopenharmony_ci ${repeatString} 647c804472Sopenharmony_ci return IteratorStringMock; 657c804472Sopenharmony_ci`; 667c804472Sopenharmony_ci 677c804472Sopenharmony_ci/** 687c804472Sopenharmony_ci * get warn console template 697c804472Sopenharmony_ci * @param interfaceNameOrClassName 707c804472Sopenharmony_ci * @param functionNameOrPropertyName 717c804472Sopenharmony_ci * @returns 727c804472Sopenharmony_ci */ 737c804472Sopenharmony_ciexport function getWarnConsole(interfaceNameOrClassName: string, functionNameOrPropertyName: string): string { 747c804472Sopenharmony_ci return `console.warn('The ${interfaceNameOrClassName}.${functionNameOrPropertyName} interface in the Previewer is a mocked implementation and may behave differently than on a real device.');\n`; 757c804472Sopenharmony_ci} 767c804472Sopenharmony_ci 777c804472Sopenharmony_cifunction handlePromiseParams(returnType: ReturnTypeEntity): string { 787c804472Sopenharmony_ci const returnKindName = returnType.returnKindName.slice(0, returnType.returnKindName.length - 1).slice(8).trim(); 797c804472Sopenharmony_ci let returnName = `return new Promise((resolve, reject) => { 807c804472Sopenharmony_ci resolve('[PC Preview] unknown type'); 817c804472Sopenharmony_ci })`; 827c804472Sopenharmony_ci Object.keys(paramsTypeStart).forEach(key => { 837c804472Sopenharmony_ci if (returnKindName.startsWith(key)) { 847c804472Sopenharmony_ci const data = paramsTypeStart[key] === '[PC Preview] unknown type' ? `'${paramsTypeStart[key]}'` : `${paramsTypeStart[key]}`; 857c804472Sopenharmony_ci returnName = `return new Promise((resolve, reject) => { 867c804472Sopenharmony_ci resolve(${data}); 877c804472Sopenharmony_ci })`; 887c804472Sopenharmony_ci } 897c804472Sopenharmony_ci }); 907c804472Sopenharmony_ci return returnName; 917c804472Sopenharmony_ci} 927c804472Sopenharmony_ci 937c804472Sopenharmony_ci/** 947c804472Sopenharmony_ci * generate return statement; 957c804472Sopenharmony_ci * @param returnType 967c804472Sopenharmony_ci * @param sourceFile 977c804472Sopenharmony_ci * @returns 987c804472Sopenharmony_ci */ 997c804472Sopenharmony_ciexport function getReturnStatement(returnType: ReturnTypeEntity, sourceFile: SourceFile): string { 1007c804472Sopenharmony_ci if (returnType.returnKind === SyntaxKind.TypeReference) { 1017c804472Sopenharmony_ci return handleTypeReferenceReturnBody(returnType, sourceFile); 1027c804472Sopenharmony_ci } else if (returnType.returnKind === SyntaxKind.UnionType) { 1037c804472Sopenharmony_ci return handleUnionTypeReturnBody(returnType); 1047c804472Sopenharmony_ci } 1057c804472Sopenharmony_ci let returnName = returnType.returnKindName.trim(); 1067c804472Sopenharmony_ci let temp = true; 1077c804472Sopenharmony_ci if (returnName.endsWith(']')) { 1087c804472Sopenharmony_ci returnName = '[]'; 1097c804472Sopenharmony_ci temp = false; 1107c804472Sopenharmony_ci } else { 1117c804472Sopenharmony_ci Object.keys(paramsTypeStart).forEach(key => { 1127c804472Sopenharmony_ci if (returnType.returnKindName.startsWith(key)) { 1137c804472Sopenharmony_ci returnName = paramsTypeStart[key]; 1147c804472Sopenharmony_ci temp = false; 1157c804472Sopenharmony_ci } 1167c804472Sopenharmony_ci }); 1177c804472Sopenharmony_ci } 1187c804472Sopenharmony_ci if (temp) { 1197c804472Sopenharmony_ci return 'return \'[PC Preview] unknown type\''; 1207c804472Sopenharmony_ci } 1217c804472Sopenharmony_ci return `return ${returnName};`; 1227c804472Sopenharmony_ci} 1237c804472Sopenharmony_ci 1247c804472Sopenharmony_ci/** 1257c804472Sopenharmony_ci * TypeReference return statement; 1267c804472Sopenharmony_ci * @param returnType 1277c804472Sopenharmony_ci * @param sourceFile 1287c804472Sopenharmony_ci * @returns 1297c804472Sopenharmony_ci */ 1307c804472Sopenharmony_cifunction handleTypeReferenceReturnBody(returnType: ReturnTypeEntity, sourceFile: SourceFile): string { 1317c804472Sopenharmony_ci if (returnType.returnKindName.startsWith('Promise')) { 1327c804472Sopenharmony_ci return handlePromiseParams(returnType); 1337c804472Sopenharmony_ci } 1347c804472Sopenharmony_ci const judgmentResult = judgmentReturnBody(returnType); 1357c804472Sopenharmony_ci if (judgmentResult !== '') { 1367c804472Sopenharmony_ci return judgmentResult; 1377c804472Sopenharmony_ci } 1387c804472Sopenharmony_ci const substepResult = substepReturnBody(returnType); 1397c804472Sopenharmony_ci if (substepResult !== '') { 1407c804472Sopenharmony_ci return substepResult; 1417c804472Sopenharmony_ci } 1427c804472Sopenharmony_ci if (returnType.returnKindName.includes('<')) { 1437c804472Sopenharmony_ci return returnType.returnKindName.includes(',') 1447c804472Sopenharmony_ci ? 'return {};' 1457c804472Sopenharmony_ci : `return new ${returnType.returnKindName.split('<')[0]}()`; 1467c804472Sopenharmony_ci } else { 1477c804472Sopenharmony_ci return generateReturnType(returnType, sourceFile); 1487c804472Sopenharmony_ci } 1497c804472Sopenharmony_ci} 1507c804472Sopenharmony_ci 1517c804472Sopenharmony_ci/** 1527c804472Sopenharmony_ci * generate return type 1537c804472Sopenharmony_ci * @param returnType 1547c804472Sopenharmony_ci * @param sourceFile 1557c804472Sopenharmony_ci * @returns 1567c804472Sopenharmony_ci */ 1577c804472Sopenharmony_cifunction generateReturnType(returnType: ReturnTypeEntity, sourceFile: SourceFile): string { 1587c804472Sopenharmony_ci if (getClassNameSet().has(returnType.returnKindName) && !specialType.includes(returnType.returnKindName)) { 1597c804472Sopenharmony_ci return returnType.returnKindName === 'Want' 1607c804472Sopenharmony_ci ? 'return mockWant().Want' 1617c804472Sopenharmony_ci : `return new ${returnType.returnKindName}()`; 1627c804472Sopenharmony_ci } else if (getClassNameSet().has(returnType.returnKindName) && specialType.includes(returnType.returnKindName)) { 1637c804472Sopenharmony_ci return `return ${returnType.returnKindName}`; 1647c804472Sopenharmony_ci } else if (propertyTypeWhiteList(returnType.returnKindName) === returnType.returnKindName) { 1657c804472Sopenharmony_ci return `return ${getTheRealReferenceFromImport(sourceFile, returnType.returnKindName)}`; 1667c804472Sopenharmony_ci } else { 1677c804472Sopenharmony_ci return `return ${propertyTypeWhiteList(returnType.returnKindName)}`; 1687c804472Sopenharmony_ci } 1697c804472Sopenharmony_ci} 1707c804472Sopenharmony_ci 1717c804472Sopenharmony_cifunction judgmentReturnBody(returnType: ReturnTypeEntity): string { 1727c804472Sopenharmony_ci if (returnType.returnKindName === 'T') { 1737c804472Sopenharmony_ci return 'return \'[PC Preview] unknown type\''; 1747c804472Sopenharmony_ci } else if (returnType.returnKindName === 'object' || returnType.returnKindName === 'Object') { 1757c804472Sopenharmony_ci return 'return {}'; 1767c804472Sopenharmony_ci } else if (returnType.returnKindName === 'Function') { 1777c804472Sopenharmony_ci return 'return \'[PC Preview] unknown type\''; 1787c804472Sopenharmony_ci } else if (returnType.returnKindName === 'String' || returnType.returnKindName === 'string') { 1797c804472Sopenharmony_ci return `return ${returnType.returnKindName}(...args)`; 1807c804472Sopenharmony_ci } else if (returnType.returnKindName === 'number' || returnType.returnKindName === 'Number') { 1817c804472Sopenharmony_ci return 'return 0'; 1827c804472Sopenharmony_ci } else if (returnType.returnKindName === 'boolean' || returnType.returnKindName === 'Boolean') { 1837c804472Sopenharmony_ci return 'return false'; 1847c804472Sopenharmony_ci } else if (returnType.returnKindName === 'ArrayBuffer') { 1857c804472Sopenharmony_ci return `return new ${returnType.returnKindName}(0)`; 1867c804472Sopenharmony_ci } else { 1877c804472Sopenharmony_ci return ''; 1887c804472Sopenharmony_ci } 1897c804472Sopenharmony_ci} 1907c804472Sopenharmony_ci 1917c804472Sopenharmony_cifunction substepReturnBody(returnType: ReturnTypeEntity): string { 1927c804472Sopenharmony_ci if (returnType.returnKindName.startsWith('Array')) { 1937c804472Sopenharmony_ci if (returnType.returnKindName.includes('<') && returnType.returnKindName.includes('>')) { 1947c804472Sopenharmony_ci return `return [${generateGenericTypeToMockValue(returnType.returnKindName)}]`; 1957c804472Sopenharmony_ci } else { 1967c804472Sopenharmony_ci return `return new ${returnType.returnKindName}()`; 1977c804472Sopenharmony_ci } 1987c804472Sopenharmony_ci } else if (returnType.returnKindName.startsWith('Readonly')) { 1997c804472Sopenharmony_ci return `return ${returnType.returnKindName.split('<')[1].split('>')[0]}`; 2007c804472Sopenharmony_ci } else if (checkIsGenericSymbol(returnType.returnKindName)) { 2017c804472Sopenharmony_ci return `return '[PC Preview] unknown iterableiterator_${returnType.returnKindName}'`; 2027c804472Sopenharmony_ci } else if (returnType.returnKindName.startsWith('Uint8Array')) { 2037c804472Sopenharmony_ci return `return new ${returnType.returnKindName}()`; 2047c804472Sopenharmony_ci } else if (returnType.returnKindName.startsWith('IterableIterator')) { 2057c804472Sopenharmony_ci return returnType.returnKindName.includes(',') ? iteratorEntriesMock : iteratorStringMock; 2067c804472Sopenharmony_ci } else if (returnType.returnKindName.includes('<T>')) { 2077c804472Sopenharmony_ci const tmpReturn = returnType.returnKindName.split('<')[0]; 2087c804472Sopenharmony_ci return tmpReturn.startsWith('Array') ? 'return []' : 'return {}'; 2097c804472Sopenharmony_ci } else { 2107c804472Sopenharmony_ci return ''; 2117c804472Sopenharmony_ci } 2127c804472Sopenharmony_ci} 2137c804472Sopenharmony_ci 2147c804472Sopenharmony_ci/** 2157c804472Sopenharmony_ci * UnionType return statement; 2167c804472Sopenharmony_ci * @param returnType 2177c804472Sopenharmony_ci * @returns 2187c804472Sopenharmony_ci */ 2197c804472Sopenharmony_cifunction handleUnionTypeReturnBody(returnType: ReturnTypeEntity): string { 2207c804472Sopenharmony_ci const returnNames = returnType.returnKindName.split('|'); 2217c804472Sopenharmony_ci let returnName = returnNames[0]; 2227c804472Sopenharmony_ci for (let i = 0; i < returnNames.length; i++) { 2237c804472Sopenharmony_ci if (!returnNames[i].includes('[]') && !returnNames[i].includes('<')) { 2247c804472Sopenharmony_ci returnName = returnNames[i]; 2257c804472Sopenharmony_ci break; 2267c804472Sopenharmony_ci } 2277c804472Sopenharmony_ci } 2287c804472Sopenharmony_ci if (returnName.trim() === 'void') { 2297c804472Sopenharmony_ci return ''; 2307c804472Sopenharmony_ci } 2317c804472Sopenharmony_ci if (getClassNameSet().has(returnName)) { 2327c804472Sopenharmony_ci return `return new ${returnName}()`; 2337c804472Sopenharmony_ci } else { 2347c804472Sopenharmony_ci return `return ${getBaseReturnValue(returnName.trim())}`; 2357c804472Sopenharmony_ci } 2367c804472Sopenharmony_ci} 2377c804472Sopenharmony_ci 2387c804472Sopenharmony_ci/** 2397c804472Sopenharmony_ci * special property whitelist 2407c804472Sopenharmony_ci * @param propertyTypeName 2417c804472Sopenharmony_ci * @returns 2427c804472Sopenharmony_ci */ 2437c804472Sopenharmony_ciexport function propertyTypeWhiteList(propertyTypeName: string): boolean | number | string { 2447c804472Sopenharmony_ci const whiteList = ['GLboolean', 'GLuint', 'GLenum', 'GLint', 'NotificationFlags']; 2457c804472Sopenharmony_ci if (whiteList.includes(propertyTypeName)) { 2467c804472Sopenharmony_ci if (propertyTypeName === 'NotificationFlags' || propertyTypeName === 'GLenum') { 2477c804472Sopenharmony_ci return `'[PC Preview] unknown ${propertyTypeName}'`; 2487c804472Sopenharmony_ci } else if (propertyTypeName === 'GLboolean') { 2497c804472Sopenharmony_ci return true; 2507c804472Sopenharmony_ci } else { 2517c804472Sopenharmony_ci return 0; 2527c804472Sopenharmony_ci } 2537c804472Sopenharmony_ci } else { 2547c804472Sopenharmony_ci return propertyTypeName; 2557c804472Sopenharmony_ci } 2567c804472Sopenharmony_ci} 2577c804472Sopenharmony_ci 2587c804472Sopenharmony_ci/** 2597c804472Sopenharmony_ci * get basic return value 2607c804472Sopenharmony_ci * @param value 2617c804472Sopenharmony_ci * @returns 2627c804472Sopenharmony_ci */ 2637c804472Sopenharmony_ciexport function getBaseReturnValue(value: string): string | number | boolean { 2647c804472Sopenharmony_ci if (value === 'string') { 2657c804472Sopenharmony_ci return '\'\''; 2667c804472Sopenharmony_ci } else if (value === 'number') { 2677c804472Sopenharmony_ci return 0; 2687c804472Sopenharmony_ci } else if (value === 'boolean') { 2697c804472Sopenharmony_ci return true; 2707c804472Sopenharmony_ci } else if (value === 'Object' || value === 'object') { 2717c804472Sopenharmony_ci return '{}'; 2727c804472Sopenharmony_ci } else if (checkIsGenericSymbol(value)) { 2737c804472Sopenharmony_ci return '\'[PC Preview] unknown type\''; 2747c804472Sopenharmony_ci } else if (value === 'WebGLActiveInfo') { 2757c804472Sopenharmony_ci return '{size: \'[PC Preview] unknown GLint\', type: 0, name: \'[PC Preview] unknown name\'}'; 2767c804472Sopenharmony_ci } else { 2777c804472Sopenharmony_ci return value; 2787c804472Sopenharmony_ci } 2797c804472Sopenharmony_ci} 2807c804472Sopenharmony_ci 2817c804472Sopenharmony_ci/** 2827c804472Sopenharmony_ci * get current sourceFile import data 2837c804472Sopenharmony_ci * @param sourceFile 2847c804472Sopenharmony_ci * @param typeName 2857c804472Sopenharmony_ci * @returns 2867c804472Sopenharmony_ci */ 2877c804472Sopenharmony_ciexport function getTheRealReferenceFromImport(sourceFile: SourceFile, typeName: string): string { 2887c804472Sopenharmony_ci const importArray = getImportDeclarationArray(sourceFile); 2897c804472Sopenharmony_ci let returnName = ''; 2907c804472Sopenharmony_ci let isFromImport = false; 2917c804472Sopenharmony_ci let isOhos = false; 2927c804472Sopenharmony_ci let mockMockName = ''; 2937c804472Sopenharmony_ci importArray.forEach(value => { 2947c804472Sopenharmony_ci if (typeName.includes('.') && typeName.split('.')[0] === value.importElements) { 2957c804472Sopenharmony_ci isFromImport = true; 2967c804472Sopenharmony_ci if (value.importPath.includes('@ohos')) { 2977c804472Sopenharmony_ci isOhos = true; 2987c804472Sopenharmony_ci } 2997c804472Sopenharmony_ci if (value.importElements.trim() === typeName.split('.')[0]) { 3007c804472Sopenharmony_ci const tmpArr = value.importPath.split('.'); 3017c804472Sopenharmony_ci mockMockName = tmpArr[tmpArr.length - 1].replace(/["']/g, ''); 3027c804472Sopenharmony_ci } 3037c804472Sopenharmony_ci } 3047c804472Sopenharmony_ci }); 3057c804472Sopenharmony_ci if (isFromImport) { 3067c804472Sopenharmony_ci const splitReturnKindName = typeName.split('.'); 3077c804472Sopenharmony_ci let left = ''; 3087c804472Sopenharmony_ci for (let i = 1; i < splitReturnKindName.length; i++) { 3097c804472Sopenharmony_ci left += `.${splitReturnKindName[i]}`; 3107c804472Sopenharmony_ci } 3117c804472Sopenharmony_ci if (isOhos) { 3127c804472Sopenharmony_ci if (mockMockName === 'observer') { 3137c804472Sopenharmony_ci returnName = `${mockMockName}()${left}`; 3147c804472Sopenharmony_ci } else { 3157c804472Sopenharmony_ci returnName = `mock${firstCharacterToUppercase(mockMockName)}()${left}`; 3167c804472Sopenharmony_ci } 3177c804472Sopenharmony_ci } 3187c804472Sopenharmony_ci } else { 3197c804472Sopenharmony_ci returnName = getImportTypeAliasNameFromImportElements(importArray, typeName); 3207c804472Sopenharmony_ci } 3217c804472Sopenharmony_ci return returnName.split('<')[0]; 3227c804472Sopenharmony_ci} 3237c804472Sopenharmony_ci 3247c804472Sopenharmony_ci/** 3257c804472Sopenharmony_ci * get return type alias, for example: {Context as _Context} return _Context 3267c804472Sopenharmony_ci * @param importElementEntity 3277c804472Sopenharmony_ci * @param typeName 3287c804472Sopenharmony_ci * @returns 3297c804472Sopenharmony_ci */ 3307c804472Sopenharmony_cifunction getImportTypeAliasNameFromImportElements( 3317c804472Sopenharmony_ci importElementEntity: ImportElementEntity[], 3327c804472Sopenharmony_ci typeName: string 3337c804472Sopenharmony_ci): string { 3347c804472Sopenharmony_ci for (let i = 0; i < importElementEntity.length; i++) { 3357c804472Sopenharmony_ci if (importElementEntity[i].importElements.includes('_')) { 3367c804472Sopenharmony_ci const importElements = importElementEntity[i].importElements.replace('{', '').replace('}', '').split(','); 3377c804472Sopenharmony_ci typeName = getTypeName(importElements, typeName); 3387c804472Sopenharmony_ci } 3397c804472Sopenharmony_ci } 3407c804472Sopenharmony_ci if (typeName === 'Want') { 3417c804472Sopenharmony_ci typeName = 'mockWant().Want'; 3427c804472Sopenharmony_ci } else if (typeName === 'InputMethodExtensionContext') { 3437c804472Sopenharmony_ci typeName = 'mockInputMethodExtensionContext().InputMethodExtensionContext'; 3447c804472Sopenharmony_ci } else if (typeName.includes('<') && typeName.includes(',')) { 3457c804472Sopenharmony_ci typeName = '{}'; 3467c804472Sopenharmony_ci } 3477c804472Sopenharmony_ci return typeName; 3487c804472Sopenharmony_ci} 3497c804472Sopenharmony_ci 3507c804472Sopenharmony_ci/** 3517c804472Sopenharmony_ci * get type name , for example: {Context as _Context} return _Context 3527c804472Sopenharmony_ci * @param importElements 3537c804472Sopenharmony_ci * @param typeName 3547c804472Sopenharmony_ci * @returns 3557c804472Sopenharmony_ci */ 3567c804472Sopenharmony_cifunction getTypeName(importElements: string[], typeName: string): string { 3577c804472Sopenharmony_ci for (let j = 0; j < importElements.length; j++) { 3587c804472Sopenharmony_ci const element = importElements[j].trim(); 3597c804472Sopenharmony_ci if (!element) { 3607c804472Sopenharmony_ci continue; 3617c804472Sopenharmony_ci } 3627c804472Sopenharmony_ci if (`_${typeName}` === element.trim()) { 3637c804472Sopenharmony_ci return `_${typeName}`; 3647c804472Sopenharmony_ci } 3657c804472Sopenharmony_ci if (element.includes(' as ') && `_${typeName}` === element.split('as')[1].trim()) { 3667c804472Sopenharmony_ci return `_${typeName}`; 3677c804472Sopenharmony_ci } 3687c804472Sopenharmony_ci } 3697c804472Sopenharmony_ci return typeName; 3707c804472Sopenharmony_ci} 3717c804472Sopenharmony_ci 3727c804472Sopenharmony_ci/** 3737c804472Sopenharmony_ci * check is generic symbol 3747c804472Sopenharmony_ci * @param type 3757c804472Sopenharmony_ci * @returns 3767c804472Sopenharmony_ci */ 3777c804472Sopenharmony_ciexport function checkIsGenericSymbol(type: string): boolean { 3787c804472Sopenharmony_ci const words = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; 3797c804472Sopenharmony_ci return words.includes(type); 3807c804472Sopenharmony_ci} 3817c804472Sopenharmony_ci 3827c804472Sopenharmony_ci/** 3837c804472Sopenharmony_ci * generate basic type default value 3847c804472Sopenharmony_ci * @param kindName 3857c804472Sopenharmony_ci * @returns 3867c804472Sopenharmony_ci */ 3877c804472Sopenharmony_ciexport function generateGenericTypeToMockValue(kindName: string): string | number | boolean { 3887c804472Sopenharmony_ci const genericTypeName = kindName.split('<')[1].split('>')[0]; 3897c804472Sopenharmony_ci if (genericTypeName === 'string') { 3907c804472Sopenharmony_ci return '\'\''; 3917c804472Sopenharmony_ci } else if (genericTypeName === 'number') { 3927c804472Sopenharmony_ci return 0; 3937c804472Sopenharmony_ci } else if (genericTypeName === 'boolean') { 3947c804472Sopenharmony_ci return true; 3957c804472Sopenharmony_ci } else if (genericTypeName === 'Object' || genericTypeName === 'object') { 3967c804472Sopenharmony_ci return '{}'; 3977c804472Sopenharmony_ci } else { 3987c804472Sopenharmony_ci return ''; 3997c804472Sopenharmony_ci } 4007c804472Sopenharmony_ci} 4017c804472Sopenharmony_ci 4027c804472Sopenharmony_ciexport const paramsTypeStart = { 4037c804472Sopenharmony_ci 'void': '\'[PC Preview] unknown type\'', 4047c804472Sopenharmony_ci 'Array': '[]', 4057c804472Sopenharmony_ci 'Object': '{}', 4067c804472Sopenharmony_ci 'object': '{}', 4077c804472Sopenharmony_ci '{': '{}', 4087c804472Sopenharmony_ci 'string': '""', 4097c804472Sopenharmony_ci 'String': '""', 4107c804472Sopenharmony_ci 'number': 0, 4117c804472Sopenharmony_ci 'Number': 0, 4127c804472Sopenharmony_ci 'boolean': false, 4137c804472Sopenharmony_ci 'Boolean': false, 4147c804472Sopenharmony_ci 'ArrayBuffer': 'new ArrayBuffer(0)', 4157c804472Sopenharmony_ci 'Uint8Array': 'new Uint8Array()', 4167c804472Sopenharmony_ci 'unknown': '\'[PC Preview] unknown type\'' 4177c804472Sopenharmony_ci}; 4187c804472Sopenharmony_ci 4197c804472Sopenharmony_ciconst removeCallback = (str: string): { type: string; value: string } => { 4207c804472Sopenharmony_ci const callbackParams = { 4217c804472Sopenharmony_ci type: 'Callback', 4227c804472Sopenharmony_ci value: '' 4237c804472Sopenharmony_ci }; 4247c804472Sopenharmony_ci if (str.startsWith('Callback')) { 4257c804472Sopenharmony_ci if (str.lastIndexOf('>') < str.lastIndexOf(' | ')) { 4267c804472Sopenharmony_ci callbackParams.value = str.slice(0, str.lastIndexOf('>')).slice(9).trim(); 4277c804472Sopenharmony_ci callbackParams.type = 'Callback'; 4287c804472Sopenharmony_ci } else { 4297c804472Sopenharmony_ci callbackParams.value = str.slice(0, str.length - 1).slice(9).trim(); 4307c804472Sopenharmony_ci callbackParams.type = 'Callback'; 4317c804472Sopenharmony_ci } 4327c804472Sopenharmony_ci } else if (str.startsWith('AsyncCallback')) { 4337c804472Sopenharmony_ci callbackParams.value = str.slice(0, str.length - 1).slice(14).trim(); 4347c804472Sopenharmony_ci callbackParams.type = 'AsyncCallback'; 4357c804472Sopenharmony_ci } 4367c804472Sopenharmony_ci let isHaveAnglebrackets = false; 4377c804472Sopenharmony_ci if (callbackParams.value.includes('<') && callbackParams.value.includes(',')) { 4387c804472Sopenharmony_ci isHaveAnglebrackets = true; 4397c804472Sopenharmony_ci } 4407c804472Sopenharmony_ci if (callbackParams.value.includes(',') && !isHaveAnglebrackets) { 4417c804472Sopenharmony_ci callbackParams.value = callbackParams.value.split(',')[0].trim(); 4427c804472Sopenharmony_ci } 4437c804472Sopenharmony_ci return callbackParams; 4447c804472Sopenharmony_ci}; 4457c804472Sopenharmony_ci 4467c804472Sopenharmony_ciconst isInImportType = (mockApi: string, value: string): string => { 4477c804472Sopenharmony_ci let hasDotFirstWorld = ''; 4487c804472Sopenharmony_ci if (value.includes('.')) { 4497c804472Sopenharmony_ci hasDotFirstWorld = value.split('.')[0].trim(); 4507c804472Sopenharmony_ci } 4517c804472Sopenharmony_ci if (hasDotFirstWorld && mockApi.includes(`import { mock${firstLetterWord(hasDotFirstWorld)} `)) { 4527c804472Sopenharmony_ci return 'isHasDotImportMock'; 4537c804472Sopenharmony_ci } 4547c804472Sopenharmony_ci if (hasDotFirstWorld && mockApi.includes(`import { ${firstLetterWord(hasDotFirstWorld)} `)) { 4557c804472Sopenharmony_ci return 'isNoHasDotImportMock'; 4567c804472Sopenharmony_ci } 4577c804472Sopenharmony_ci if (mockApi.includes(`import { mock${firstLetterWord(value)} `)) { 4587c804472Sopenharmony_ci return 'isImportMock'; 4597c804472Sopenharmony_ci } 4607c804472Sopenharmony_ci if (mockApi.includes(`import { ${value} `)) { 4617c804472Sopenharmony_ci return 'isImport'; 4627c804472Sopenharmony_ci } 4637c804472Sopenharmony_ci return 'noImport'; 4647c804472Sopenharmony_ci}; 4657c804472Sopenharmony_ci 4667c804472Sopenharmony_ciconst firstLetterWord = (word: string): string => { 4677c804472Sopenharmony_ci return word.slice(0, 1).toUpperCase() + word.slice(1); 4687c804472Sopenharmony_ci}; 4697c804472Sopenharmony_ci 4707c804472Sopenharmony_ciconst hasDotFirstWord = (str: string): string => { 4717c804472Sopenharmony_ci return str.includes('.') ? str.split('.')[0] : str; 4727c804472Sopenharmony_ci}; 4737c804472Sopenharmony_ci 4747c804472Sopenharmony_cifunction callbackHasNoImportType(callbackParams: { type: string; value: string }): string { 4757c804472Sopenharmony_ci let callbackData = ''; 4767c804472Sopenharmony_ci let paramsTypeHasType = true; 4777c804472Sopenharmony_ci if (callbackParams.value.endsWith(']')) { 4787c804472Sopenharmony_ci callbackData = '[]'; 4797c804472Sopenharmony_ci } else { 4807c804472Sopenharmony_ci Object.keys(paramsTypeStart).forEach(item => { 4817c804472Sopenharmony_ci if (callbackParams.value.startsWith(item)) { 4827c804472Sopenharmony_ci callbackData = paramsTypeStart[item]; 4837c804472Sopenharmony_ci paramsTypeHasType = false; 4847c804472Sopenharmony_ci } 4857c804472Sopenharmony_ci }); 4867c804472Sopenharmony_ci if (paramsTypeHasType) { 4877c804472Sopenharmony_ci callbackData = callbackParams.value; 4887c804472Sopenharmony_ci if (callbackParams.value.includes('<')) { 4897c804472Sopenharmony_ci callbackData = `${callbackParams.value.split('<')[0]}`; 4907c804472Sopenharmony_ci } 4917c804472Sopenharmony_ci if (callbackParams.value.includes('<') && callbackParams.value.includes(',')) { 4927c804472Sopenharmony_ci callbackData = '{}'; 4937c804472Sopenharmony_ci } 4947c804472Sopenharmony_ci } 4957c804472Sopenharmony_ci if (callbackParams.value === 'Date') { 4967c804472Sopenharmony_ci callbackData = 'new Date()'; 4977c804472Sopenharmony_ci } 4987c804472Sopenharmony_ci if (callbackParams.value === 'Uint8Array') { 4997c804472Sopenharmony_ci callbackData = 'new Uint8Array()'; 5007c804472Sopenharmony_ci } 5017c804472Sopenharmony_ci if (callbackParams.value === 'T') { 5027c804472Sopenharmony_ci callbackData = '[PC Preview] unknown type'; 5037c804472Sopenharmony_ci } 5047c804472Sopenharmony_ci } 5057c804472Sopenharmony_ci return callbackData; 5067c804472Sopenharmony_ci} 5077c804472Sopenharmony_ci 5087c804472Sopenharmony_ci/** 5097c804472Sopenharmony_ci * get callback parameters data 5107c804472Sopenharmony_ci * @returns data: parameters data: type: AsyncCallback or Callback 5117c804472Sopenharmony_ci */ 5127c804472Sopenharmony_ciconst setCallbackData = (mockApi: string, paramTypeString: string): { data: string; type: string } => { 5137c804472Sopenharmony_ci const callbackParams = removeCallback(paramTypeString); 5147c804472Sopenharmony_ci let callbackData = ''; 5157c804472Sopenharmony_ci let importType = ''; 5167c804472Sopenharmony_ci if (callbackParams.value) { 5177c804472Sopenharmony_ci importType = isInImportType(mockApi, callbackParams.value); 5187c804472Sopenharmony_ci } 5197c804472Sopenharmony_ci if (importType === 'isHasDotImportMock') { 5207c804472Sopenharmony_ci const upperWord = firstLetterWord(callbackParams.value); // Image.PixelMap 5217c804472Sopenharmony_ci const firstWord = hasDotFirstWord(upperWord); // Image 5227c804472Sopenharmony_ci callbackData = `mock${firstWord}()${upperWord.slice(firstWord.length)}`; 5237c804472Sopenharmony_ci } else if (importType === 'isNoHasDotImportMock') { 5247c804472Sopenharmony_ci callbackData = callbackParams.value; 5257c804472Sopenharmony_ci } else if (importType === 'isImportMock') { 5267c804472Sopenharmony_ci callbackData = `mock${firstLetterWord(callbackParams.value)}()`; 5277c804472Sopenharmony_ci } else if (importType === 'isImport') { 5287c804472Sopenharmony_ci callbackData = callbackParams.value; 5297c804472Sopenharmony_ci } else if (importType === 'noImport') { 5307c804472Sopenharmony_ci callbackData = callbackHasNoImportType(callbackParams); 5317c804472Sopenharmony_ci } else { 5327c804472Sopenharmony_ci callbackData = '[PC Preview] unknown type'; 5337c804472Sopenharmony_ci } 5347c804472Sopenharmony_ci return { 5357c804472Sopenharmony_ci data: callbackData, 5367c804472Sopenharmony_ci type: callbackParams.type 5377c804472Sopenharmony_ci }; 5387c804472Sopenharmony_ci}; 5397c804472Sopenharmony_ci 5407c804472Sopenharmony_ci/** 5417c804472Sopenharmony_ci * get callback statement 5427c804472Sopenharmony_ci * @returns callback statement 5437c804472Sopenharmony_ci */ 5447c804472Sopenharmony_ciexport function getCallbackStatement(mockApi: string, paramTypeString?: string): string { 5457c804472Sopenharmony_ci let outPut = `if (args && typeof args[args.length - 1] === 'function') { 5467c804472Sopenharmony_ci args[args.length - 1].call(this,`; 5477c804472Sopenharmony_ci const callbackError = "{'code': '','data': '','name': '','message': '','stack': ''}"; 5487c804472Sopenharmony_ci let callbackDataParams = { 5497c804472Sopenharmony_ci type: '', 5507c804472Sopenharmony_ci data: '[PC Preview] unknown type' 5517c804472Sopenharmony_ci }; 5527c804472Sopenharmony_ci if (paramTypeString) { 5537c804472Sopenharmony_ci callbackDataParams = setCallbackData(mockApi, paramTypeString); 5547c804472Sopenharmony_ci } 5557c804472Sopenharmony_ci if (callbackDataParams?.type === 'AsyncCallback') { 5567c804472Sopenharmony_ci outPut += ` ${callbackError},`; 5577c804472Sopenharmony_ci } 5587c804472Sopenharmony_ci outPut += 5597c804472Sopenharmony_ci callbackDataParams.data === '[PC Preview] unknown type' 5607c804472Sopenharmony_ci ? ` '${callbackDataParams.data}');\n}` 5617c804472Sopenharmony_ci : ` ${callbackDataParams.data});\n}`; 5627c804472Sopenharmony_ci return outPut; 5637c804472Sopenharmony_ci} 5647c804472Sopenharmony_ci 5657c804472Sopenharmony_ci/** 5667c804472Sopenharmony_ci * get callback statement 5677c804472Sopenharmony_ci * @returns callback statement 5687c804472Sopenharmony_ci */ 5697c804472Sopenharmony_ciexport function getOverloadedFunctionCallbackStatement( 5707c804472Sopenharmony_ci entityArray: Array<FunctionEntity> | Array<MethodEntity> | Array<MethodSignatureEntity>, 5717c804472Sopenharmony_ci sourceFile: SourceFile, 5727c804472Sopenharmony_ci mockApi: string 5737c804472Sopenharmony_ci): string { 5747c804472Sopenharmony_ci let overloadedCallbackBody = ''; 5757c804472Sopenharmony_ci entityArray.forEach(functionBody => { 5767c804472Sopenharmony_ci let content = ''; 5777c804472Sopenharmony_ci let firstParamContent = ''; 5787c804472Sopenharmony_ci let callbackParamContent = ''; 5797c804472Sopenharmony_ci functionBody.args.forEach(arg => { 5807c804472Sopenharmony_ci if ( 5817c804472Sopenharmony_ci arg.paramTypeString.startsWith("'") && arg.paramTypeString.endsWith("'") || 5827c804472Sopenharmony_ci arg.paramTypeString.startsWith('"') && arg.paramTypeString.endsWith('"') 5837c804472Sopenharmony_ci ) { 5847c804472Sopenharmony_ci const paramTypeStringArr = arg.paramTypeString.split('|'); 5857c804472Sopenharmony_ci firstParamContent += `if (args && [${paramTypeStringArr}].includes(args[0])) {\n`; 5867c804472Sopenharmony_ci } 5877c804472Sopenharmony_ci if (['callback', 'observercallback', 'listener', 'synccallback'].includes(arg.paramName.toLowerCase())) { 5887c804472Sopenharmony_ci callbackParamContent += getCallbackBody(mockApi, arg.paramTypeString); 5897c804472Sopenharmony_ci } 5907c804472Sopenharmony_ci }); 5917c804472Sopenharmony_ci if (firstParamContent) { 5927c804472Sopenharmony_ci content = `${firstParamContent}${callbackParamContent}\n}` + content; 5937c804472Sopenharmony_ci } else { 5947c804472Sopenharmony_ci content += callbackParamContent; 5957c804472Sopenharmony_ci } 5967c804472Sopenharmony_ci overloadedCallbackBody += content; 5977c804472Sopenharmony_ci }); 5987c804472Sopenharmony_ci overloadedCallbackBody += '\n'; 5997c804472Sopenharmony_ci return overloadedCallbackBody; 6007c804472Sopenharmony_ci} 6017c804472Sopenharmony_ci 6027c804472Sopenharmony_ci/** 6037c804472Sopenharmony_ci * get callback statement 6047c804472Sopenharmony_ci * @returns callback statement 6057c804472Sopenharmony_ci */ 6067c804472Sopenharmony_cifunction getCallbackBody(mockApi: string, paramString: string): string { 6077c804472Sopenharmony_ci let bodyInfo = `if (args && typeof args[args.length - 1] === 'function') { 6087c804472Sopenharmony_ci args[args.length - 1].call(this,`; 6097c804472Sopenharmony_ci const callbackError = "{'code': '','data': '','name': '','message': '','stack': ''}"; 6107c804472Sopenharmony_ci if (paramString === 'ErrorCallback') { 6117c804472Sopenharmony_ci bodyInfo += callbackError + ');\n}'; 6127c804472Sopenharmony_ci return bodyInfo; 6137c804472Sopenharmony_ci } 6147c804472Sopenharmony_ci let callbackDataParams = { 6157c804472Sopenharmony_ci type: '', 6167c804472Sopenharmony_ci data: '[PC Preview] unknown type' 6177c804472Sopenharmony_ci }; 6187c804472Sopenharmony_ci if (paramString) { 6197c804472Sopenharmony_ci callbackDataParams = setCallbackData(mockApi, paramString); 6207c804472Sopenharmony_ci } 6217c804472Sopenharmony_ci if (callbackDataParams?.type === 'AsyncCallback') { 6227c804472Sopenharmony_ci bodyInfo += ` ${callbackError},`; 6237c804472Sopenharmony_ci } 6247c804472Sopenharmony_ci bodyInfo += 6257c804472Sopenharmony_ci callbackDataParams.data === '[PC Preview] unknown type' 6267c804472Sopenharmony_ci ? ` '${callbackDataParams.data}');\n` 6277c804472Sopenharmony_ci : ` ${callbackDataParams.data});\n`; 6287c804472Sopenharmony_ci bodyInfo += '}'; 6297c804472Sopenharmony_ci return bodyInfo; 6307c804472Sopenharmony_ci} 6317c804472Sopenharmony_ci 6327c804472Sopenharmony_ci/** 6337c804472Sopenharmony_ci * get iterator template string 6347c804472Sopenharmony_ci * @param methodEntity 6357c804472Sopenharmony_ci * @returns 6367c804472Sopenharmony_ci */ 6377c804472Sopenharmony_ciexport function generateSymbolIterator(methodEntity: MethodEntity): string { 6387c804472Sopenharmony_ci let iteratorMethod = ''; 6397c804472Sopenharmony_ci if (methodEntity.returnType.returnKindName.includes('<[')) { 6407c804472Sopenharmony_ci iteratorMethod += `let index = 0; 6417c804472Sopenharmony_ci const IteratorMock = { 6427c804472Sopenharmony_ci next: () => { 6437c804472Sopenharmony_ci if (index < 1) { 6447c804472Sopenharmony_ci const returnValue = ['[PC Previwe] unknown iterableiterator_k', '[PC Previwe] unknown iterableiterator_v']; 6457c804472Sopenharmony_ci index++; 6467c804472Sopenharmony_ci return { 6477c804472Sopenharmony_ci value: returnValue, 6487c804472Sopenharmony_ci done: false 6497c804472Sopenharmony_ci }; 6507c804472Sopenharmony_ci } else { 6517c804472Sopenharmony_ci return { 6527c804472Sopenharmony_ci done: true 6537c804472Sopenharmony_ci }; 6547c804472Sopenharmony_ci } 6557c804472Sopenharmony_ci } 6567c804472Sopenharmony_ci }; 6577c804472Sopenharmony_ci return IteratorMock;`; 6587c804472Sopenharmony_ci } else { 6597c804472Sopenharmony_ci iteratorMethod += `let index = 0; 6607c804472Sopenharmony_ci const IteratorMock = { 6617c804472Sopenharmony_ci next: () => { 6627c804472Sopenharmony_ci if (index < 1) { 6637c804472Sopenharmony_ci index++; 6647c804472Sopenharmony_ci return { 6657c804472Sopenharmony_ci value: '[PC Preview] unknown any', 6667c804472Sopenharmony_ci done: false 6677c804472Sopenharmony_ci }; 6687c804472Sopenharmony_ci } 6697c804472Sopenharmony_ci return { 6707c804472Sopenharmony_ci done: true 6717c804472Sopenharmony_ci }; 6727c804472Sopenharmony_ci } 6737c804472Sopenharmony_ci }; 6747c804472Sopenharmony_ci return IteratorMock;`; 6757c804472Sopenharmony_ci } 6767c804472Sopenharmony_ci 6777c804472Sopenharmony_ci return iteratorMethod; 6787c804472Sopenharmony_ci} 6797c804472Sopenharmony_ci 6807c804472Sopenharmony_cifunction handleReturnDataNoImportType(returnPromiseParams: string, returnType: ReturnTypeEntity): string { 6817c804472Sopenharmony_ci let returnData = ''; 6827c804472Sopenharmony_ci if (returnPromiseParams.startsWith('[') || returnPromiseParams.endsWith(']')) { 6837c804472Sopenharmony_ci returnData = '[]'; 6847c804472Sopenharmony_ci } else { 6857c804472Sopenharmony_ci let paramsTypeHasType = true; 6867c804472Sopenharmony_ci Object.keys(paramsTypeStart).forEach(item => { 6877c804472Sopenharmony_ci if (returnPromiseParams.startsWith(item)) { 6887c804472Sopenharmony_ci returnData = paramsTypeStart[item]; 6897c804472Sopenharmony_ci paramsTypeHasType = false; 6907c804472Sopenharmony_ci } 6917c804472Sopenharmony_ci }); 6927c804472Sopenharmony_ci if (paramsTypeHasType) { 6937c804472Sopenharmony_ci returnData = returnPromiseParams; 6947c804472Sopenharmony_ci if (returnPromiseParams.includes('<')) { 6957c804472Sopenharmony_ci returnData = `${returnPromiseParams.split('<')[0]}`; 6967c804472Sopenharmony_ci } 6977c804472Sopenharmony_ci if (returnPromiseParams.includes('<') && returnPromiseParams.includes(',')) { 6987c804472Sopenharmony_ci returnData = '{}'; 6997c804472Sopenharmony_ci } 7007c804472Sopenharmony_ci } 7017c804472Sopenharmony_ci if (returnPromiseParams === 'Date') { 7027c804472Sopenharmony_ci returnData = 'new Date()'; 7037c804472Sopenharmony_ci } 7047c804472Sopenharmony_ci if (returnPromiseParams === 'T') { 7057c804472Sopenharmony_ci returnData = '"[PC Preview] unknown type"'; 7067c804472Sopenharmony_ci } 7077c804472Sopenharmony_ci if (returnType.returnKindName.startsWith('Readonly')) { 7087c804472Sopenharmony_ci returnData = `${returnType.returnKindName.split('<')[1].split('>')[0]}`; 7097c804472Sopenharmony_ci } 7107c804472Sopenharmony_ci if (checkIsGenericSymbol(returnType.returnKindName)) { 7117c804472Sopenharmony_ci returnData = `'[PC Preview] unknown iterableiterator_${returnType.returnKindName}'`; 7127c804472Sopenharmony_ci } 7137c804472Sopenharmony_ci } 7147c804472Sopenharmony_ci return returnData; 7157c804472Sopenharmony_ci} 7167c804472Sopenharmony_ci 7177c804472Sopenharmony_ci/** 7187c804472Sopenharmony_ci * generate more function name return statement; 7197c804472Sopenharmony_ci * @param isReturnPromise 7207c804472Sopenharmony_ci * @param returnType 7217c804472Sopenharmony_ci * @param sourceFile 7227c804472Sopenharmony_ci * @param mockApi 7237c804472Sopenharmony_ci * @returns 7247c804472Sopenharmony_ci */ 7257c804472Sopenharmony_ciexport function getReturnData( 7267c804472Sopenharmony_ci isCallBack: boolean, 7277c804472Sopenharmony_ci isReturnPromise: boolean, 7287c804472Sopenharmony_ci returnType: ReturnTypeEntity, 7297c804472Sopenharmony_ci sourceFile: SourceFile, 7307c804472Sopenharmony_ci mockApi: string 7317c804472Sopenharmony_ci): string { 7327c804472Sopenharmony_ci // If the return value is an iterator IterableIterator, then iteratorEntriesMock is directly returned 7337c804472Sopenharmony_ci if (returnType.returnKindName.startsWith('IterableIterator')) { 7347c804472Sopenharmony_ci return returnType.returnKindName.includes(',') ? iteratorEntriesMock : iteratorStringMock; 7357c804472Sopenharmony_ci } 7367c804472Sopenharmony_ci // If it is a promise, intercept the content of x in promise<x>, which may have the following formats: 7377c804472Sopenharmony_ci // fun(): y | Promise<y>、 fun(): Promise<x | y | z>、 fun(): Promise<x>、 fun(): Promise<x.y> 7387c804472Sopenharmony_ci // If it is not a promise, the returned type may be x, x | y | z, x.y 7397c804472Sopenharmony_ci let returnPromiseParams = returnType.returnKindName; 7407c804472Sopenharmony_ci if (isReturnPromise) { 7417c804472Sopenharmony_ci if (returnType.returnKind === SyntaxKind.UnionType) { 7427c804472Sopenharmony_ci // fun(): y | Promise<y> 7437c804472Sopenharmony_ci const returnNames = returnPromiseParams.split('|'); 7447c804472Sopenharmony_ci returnPromiseParams = loopReturnNames(returnNames, returnPromiseParams); 7457c804472Sopenharmony_ci } 7467c804472Sopenharmony_ci // At this point, obtain the values in these formats: Promise<x | y | z>, Promise<y>, Promise<x.y>, Promise<x> 7477c804472Sopenharmony_ci const kindName = returnPromiseParams; 7487c804472Sopenharmony_ci returnPromiseParams = kindName.slice(0, kindName.length - 1).slice(8).trim(); 7497c804472Sopenharmony_ci } 7507c804472Sopenharmony_ci // At this point, the value type of param in promise<param>may be x, x | y | z, x.y 7517c804472Sopenharmony_ci if (returnPromiseParams.includes('|')) { 7527c804472Sopenharmony_ci returnPromiseParams = getSeparatorParam(returnPromiseParams); 7537c804472Sopenharmony_ci } 7547c804472Sopenharmony_ci 7557c804472Sopenharmony_ci // At this point, the possible types of promiseParam are x, x.y x [] Array<x> 7567c804472Sopenharmony_ci // Check if it was imported 7577c804472Sopenharmony_ci let returnData = '"[PC Preview] unknown type"'; 7587c804472Sopenharmony_ci const importType = isInImportType(mockApi, returnPromiseParams); 7597c804472Sopenharmony_ci if (importType === 'isHasDotImportMock') { 7607c804472Sopenharmony_ci const upperWord = firstLetterWord(returnPromiseParams); // Image.PixelMap 7617c804472Sopenharmony_ci const firstWord = hasDotFirstWord(upperWord); // Image 7627c804472Sopenharmony_ci returnData = `mock${firstWord}()${upperWord.slice(firstWord.length)}`; 7637c804472Sopenharmony_ci } else if (importType === 'isNoHasDotImportMock') { 7647c804472Sopenharmony_ci returnData = returnPromiseParams; 7657c804472Sopenharmony_ci } else if (importType === 'isImportMock') { 7667c804472Sopenharmony_ci returnData = `mock${firstLetterWord(returnPromiseParams)}()`; 7677c804472Sopenharmony_ci } else if (importType === 'isImport') { 7687c804472Sopenharmony_ci returnData = returnPromiseParams; 7697c804472Sopenharmony_ci } else if (importType === 'noImport') { 7707c804472Sopenharmony_ci returnData = handleReturnDataNoImportType(returnPromiseParams, returnType); 7717c804472Sopenharmony_ci } else { 7727c804472Sopenharmony_ci returnData = '"[PC Preview] unknown type"'; 7737c804472Sopenharmony_ci } 7747c804472Sopenharmony_ci const data = 7757c804472Sopenharmony_ci typeof returnData === 'string' && returnData.startsWith('[PC Preview] unknown') 7767c804472Sopenharmony_ci ? `'${returnData}'` 7777c804472Sopenharmony_ci : `${returnData}`; 7787c804472Sopenharmony_ci if (isReturnPromise) { 7797c804472Sopenharmony_ci return ` 7807c804472Sopenharmony_ci return new Promise((resolve, reject) => { 7817c804472Sopenharmony_ci resolve(${data}); 7827c804472Sopenharmony_ci }) 7837c804472Sopenharmony_ci `; 7847c804472Sopenharmony_ci } else { 7857c804472Sopenharmony_ci return `return ${data}`; 7867c804472Sopenharmony_ci } 7877c804472Sopenharmony_ci} 7887c804472Sopenharmony_ci 7897c804472Sopenharmony_ci/** 7907c804472Sopenharmony_ci * loop ReturnNames 7917c804472Sopenharmony_ci * @param returnNames 7927c804472Sopenharmony_ci * @param returnPromiseParams 7937c804472Sopenharmony_ci * @returns 7947c804472Sopenharmony_ci */ 7957c804472Sopenharmony_cifunction loopReturnNames(returnNames: string[], returnPromiseParams: string): string { 7967c804472Sopenharmony_ci for (let i = 0; i < returnNames.length; i++) { 7977c804472Sopenharmony_ci if (returnNames[i].trim().startsWith('Promise<')) { 7987c804472Sopenharmony_ci // Promise<y> 7997c804472Sopenharmony_ci returnPromiseParams = returnNames[i].trim(); 8007c804472Sopenharmony_ci break; 8017c804472Sopenharmony_ci } 8027c804472Sopenharmony_ci } 8037c804472Sopenharmony_ci return returnPromiseParams; 8047c804472Sopenharmony_ci} 8057c804472Sopenharmony_ci 8067c804472Sopenharmony_ci/** 8077c804472Sopenharmony_ci * 8087c804472Sopenharmony_ci * @param returnPromiseParams 8097c804472Sopenharmony_ci * @returns 8107c804472Sopenharmony_ci */ 8117c804472Sopenharmony_cifunction getSeparatorParam(returnPromiseParams: string): string { 8127c804472Sopenharmony_ci let hasObj = ''; 8137c804472Sopenharmony_ci let hasArr = ''; 8147c804472Sopenharmony_ci let hasUint8Array = ''; 8157c804472Sopenharmony_ci let hasArrayBuffer = ''; 8167c804472Sopenharmony_ci let otherValue = ''; 8177c804472Sopenharmony_ci const paramsArr = returnPromiseParams.split('|'); 8187c804472Sopenharmony_ci for (let i = 0; i < paramsArr.length; i++) { 8197c804472Sopenharmony_ci const param = paramsArr[i].trim(); 8207c804472Sopenharmony_ci if (param.startsWith('{') || param.startsWith('Object')) { 8217c804472Sopenharmony_ci hasObj = '{}'; 8227c804472Sopenharmony_ci } else if (param.endsWith(']') || param.startsWith('[') || param.startsWith('Array<')) { 8237c804472Sopenharmony_ci hasArr = '[]'; 8247c804472Sopenharmony_ci } else if (param.startsWith('Uint8Array')) { 8257c804472Sopenharmony_ci hasUint8Array = 'Uint8Array'; 8267c804472Sopenharmony_ci } else if (param.startsWith('ArrayBuffer')) { 8277c804472Sopenharmony_ci hasArrayBuffer = 'ArrayBuffer'; 8287c804472Sopenharmony_ci } else { 8297c804472Sopenharmony_ci if (param !== null) { 8307c804472Sopenharmony_ci otherValue = param; 8317c804472Sopenharmony_ci } 8327c804472Sopenharmony_ci } 8337c804472Sopenharmony_ci } 8347c804472Sopenharmony_ci if (hasObj) { 8357c804472Sopenharmony_ci return hasObj; 8367c804472Sopenharmony_ci } 8377c804472Sopenharmony_ci if (hasArr) { 8387c804472Sopenharmony_ci return hasArr; 8397c804472Sopenharmony_ci } 8407c804472Sopenharmony_ci if (hasUint8Array) { 8417c804472Sopenharmony_ci return hasUint8Array; 8427c804472Sopenharmony_ci } 8437c804472Sopenharmony_ci if (hasArrayBuffer) { 8447c804472Sopenharmony_ci return hasArrayBuffer; 8457c804472Sopenharmony_ci } 8467c804472Sopenharmony_ci return otherValue; 8477c804472Sopenharmony_ci} 8487c804472Sopenharmony_ci 8497c804472Sopenharmony_ci/** 8507c804472Sopenharmony_ci * 8517c804472Sopenharmony_ci * @param mockName string 8527c804472Sopenharmony_ci * @param sourceFile SourceFile 8537c804472Sopenharmony_ci * @returns boolean 8547c804472Sopenharmony_ci */ 8557c804472Sopenharmony_ciexport function hasExportDefaultKeyword(mockName: string, sourceFile: SourceFile): boolean { 8567c804472Sopenharmony_ci let fileContent = sourceFile.getText(); 8577c804472Sopenharmony_ci const removeNoteRegx = /\/\*[\s\S]*?\*\//g; 8587c804472Sopenharmony_ci fileContent = fileContent.replace(removeNoteRegx, ''); 8597c804472Sopenharmony_ci if ( 8607c804472Sopenharmony_ci fileContent.includes(`export default class ${firstCharacterToUppercase(mockName)} `) || 8617c804472Sopenharmony_ci fileContent.includes(`export default interface ${firstCharacterToUppercase(mockName)} `) || 8627c804472Sopenharmony_ci fileContent.includes(`export default ${firstCharacterToUppercase(mockName)}`) 8637c804472Sopenharmony_ci ) { 8647c804472Sopenharmony_ci return false; 8657c804472Sopenharmony_ci } 8667c804472Sopenharmony_ci return true; 8677c804472Sopenharmony_ci} 8687c804472Sopenharmony_ci 8697c804472Sopenharmony_ciexport const overloadedFunctionArr = ['on', 'off']; 8707c804472Sopenharmony_ci 8717c804472Sopenharmony_ciexport const needToAddBrace = ['ViewData', 'AutoFillType']; 8727c804472Sopenharmony_ci 8737c804472Sopenharmony_ciexport interface MockFunctionElementEntity { 8747c804472Sopenharmony_ci elementName: string; 8757c804472Sopenharmony_ci type: string; 8767c804472Sopenharmony_ci} 8777c804472Sopenharmony_ciexport interface ReturnDataParams { 8787c804472Sopenharmony_ci mockData: string; 8797c804472Sopenharmony_ci mockFunctionElements: Array<MockFunctionElementEntity>; 8807c804472Sopenharmony_ci} 881