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 path from 'path'; 177c804472Sopenharmony_ciimport { SyntaxKind } from 'typescript'; 187c804472Sopenharmony_ciimport type { SourceFile } from 'typescript'; 197c804472Sopenharmony_ciimport { firstCharacterToUppercase } from '../common/commonUtils'; 207c804472Sopenharmony_ciimport type { ModuleBlockEntity } from '../declaration-node/moduleDeclaration'; 217c804472Sopenharmony_ciimport { 227c804472Sopenharmony_ci getDefaultExportClassDeclaration, 237c804472Sopenharmony_ci getSourceFileFunctions, 247c804472Sopenharmony_ci getSourceFileVariableStatements 257c804472Sopenharmony_ci} from '../declaration-node/sourceFileElementsAssemply'; 267c804472Sopenharmony_ciimport { generateClassDeclaration } from './generateClassDeclaration'; 277c804472Sopenharmony_ciimport { generateCommonFunction } from './generateCommonFunction'; 287c804472Sopenharmony_ciimport { generateEnumDeclaration } from './generateEnumDeclaration'; 297c804472Sopenharmony_ciimport { generateImportEqual } from './generateImportEqual'; 307c804472Sopenharmony_ciimport { addToIndexArray } from './generateIndex'; 317c804472Sopenharmony_ciimport { generateInterfaceDeclaration } from './generateInterfaceDeclaration'; 327c804472Sopenharmony_ciimport { generateStaticFunction } from './generateStaticFunction'; 337c804472Sopenharmony_ciimport { addToSystemIndexArray } from './generateSystemIndex'; 347c804472Sopenharmony_ciimport { generateTypeAliasDeclaration } from './generateTypeAlias'; 357c804472Sopenharmony_ciimport { generateVariableStatementDelcatation } from './generateVariableStatementDeclaration'; 367c804472Sopenharmony_ciimport type { ImportElementEntity } from '../declaration-node/importAndExportDeclaration'; 377c804472Sopenharmony_ciimport { ClassEntity } from '../declaration-node/classDeclaration'; 387c804472Sopenharmony_ci 397c804472Sopenharmony_ciinterface ModuleExportEntity { 407c804472Sopenharmony_ci type: string; 417c804472Sopenharmony_ci name: string; 427c804472Sopenharmony_ci} 437c804472Sopenharmony_ci 447c804472Sopenharmony_ciinterface DefaultExportClassProps { 457c804472Sopenharmony_ci moduleBody: string; 467c804472Sopenharmony_ci outBody: string; 477c804472Sopenharmony_ci filename: string; 487c804472Sopenharmony_ci sourceFile: SourceFile; 497c804472Sopenharmony_ci mockApi: string; 507c804472Sopenharmony_ci} 517c804472Sopenharmony_ci 527c804472Sopenharmony_ciinterface DefaultExportClassBack { 537c804472Sopenharmony_ci moduleBody: string; 547c804472Sopenharmony_ci outBody: string; 557c804472Sopenharmony_ci} 567c804472Sopenharmony_ci 577c804472Sopenharmony_ciinterface JudgmentModuleEntityProps { 587c804472Sopenharmony_ci moduleEntity: ModuleBlockEntity; 597c804472Sopenharmony_ci moduleBody: string; 607c804472Sopenharmony_ci outBody: string; 617c804472Sopenharmony_ci enumBody: string; 627c804472Sopenharmony_ci sourceFile: SourceFile; 637c804472Sopenharmony_ci mockApi: string; 647c804472Sopenharmony_ci extraImport: string[]; 657c804472Sopenharmony_ci moduleName: string; 667c804472Sopenharmony_ci importDeclarations: ImportElementEntity[]; 677c804472Sopenharmony_ci} 687c804472Sopenharmony_ci 697c804472Sopenharmony_ciinterface JudgmentModuleEntityBack { 707c804472Sopenharmony_ci moduleBody: string; 717c804472Sopenharmony_ci outBody: string; 727c804472Sopenharmony_ci enumBody: string; 737c804472Sopenharmony_ci} 747c804472Sopenharmony_ci 757c804472Sopenharmony_ciinterface ModuleEntityLoopProps { 767c804472Sopenharmony_ci moduleEntity: ModuleBlockEntity; 777c804472Sopenharmony_ci innerOutBody: string; 787c804472Sopenharmony_ci moduleBody: string; 797c804472Sopenharmony_ci sourceFile: SourceFile; 807c804472Sopenharmony_ci mockApi: string; 817c804472Sopenharmony_ci extraImport: string[]; 827c804472Sopenharmony_ci innerModuleName: string; 837c804472Sopenharmony_ci importDeclarations: ImportElementEntity[]; 847c804472Sopenharmony_ci} 857c804472Sopenharmony_ci 867c804472Sopenharmony_ciinterface ModuleEntityLoopBack { 877c804472Sopenharmony_ci innerOutBody: string; 887c804472Sopenharmony_ci moduleBody: string; 897c804472Sopenharmony_ci} 907c804472Sopenharmony_ci 917c804472Sopenharmony_ciinterface ModuleEntityNextProps { 927c804472Sopenharmony_ci moduleEntity: ModuleBlockEntity; 937c804472Sopenharmony_ci innerFunctionBody: string; 947c804472Sopenharmony_ci innerModuleBody: string; 957c804472Sopenharmony_ci filename: string; 967c804472Sopenharmony_ci moduleBody: string; 977c804472Sopenharmony_ci sourceFile: SourceFile; 987c804472Sopenharmony_ci mockApi: string; 997c804472Sopenharmony_ci extraImport: string[]; 1007c804472Sopenharmony_ci innerModuleName: string; 1017c804472Sopenharmony_ci importDeclarations: ImportElementEntity[]; 1027c804472Sopenharmony_ci} 1037c804472Sopenharmony_ci 1047c804472Sopenharmony_ciinterface ModuleEntityNextBack { 1057c804472Sopenharmony_ci innerModuleName: string; 1067c804472Sopenharmony_ci moduleBody: string; 1077c804472Sopenharmony_ci} 1087c804472Sopenharmony_ci 1097c804472Sopenharmony_ci/** 1107c804472Sopenharmony_ci * generate declare 1117c804472Sopenharmony_ci * @param moduleEntity 1127c804472Sopenharmony_ci * @param sourceFile 1137c804472Sopenharmony_ci * @param filename 1147c804472Sopenharmony_ci * @param extraImport 1157c804472Sopenharmony_ci * @returns 1167c804472Sopenharmony_ci */ 1177c804472Sopenharmony_ciexport function generateModuleDeclaration( 1187c804472Sopenharmony_ci moduleEntity: ModuleBlockEntity, 1197c804472Sopenharmony_ci sourceFile: SourceFile, 1207c804472Sopenharmony_ci filename: string, 1217c804472Sopenharmony_ci mockApi: string, 1227c804472Sopenharmony_ci extraImport: string[], 1237c804472Sopenharmony_ci importDeclarations: ImportElementEntity[] 1247c804472Sopenharmony_ci): string { 1257c804472Sopenharmony_ci const innerModuleBody = ''; 1267c804472Sopenharmony_ci const moduleName = moduleEntity.moduleName.replace(/["']/g, ''); 1277c804472Sopenharmony_ci let moduleBody = `export function mock${firstCharacterToUppercase(moduleName)}() {\n`; 1287c804472Sopenharmony_ci let enumBody = ''; 1297c804472Sopenharmony_ci if ( 1307c804472Sopenharmony_ci !( 1317c804472Sopenharmony_ci moduleEntity.exportModifiers.includes(SyntaxKind.DeclareKeyword) && 1327c804472Sopenharmony_ci (moduleEntity.moduleName.startsWith('"') || moduleEntity.moduleName.startsWith('\'')) 1337c804472Sopenharmony_ci ) && 1347c804472Sopenharmony_ci path.basename(sourceFile.fileName).startsWith('@ohos') 1357c804472Sopenharmony_ci ) { 1367c804472Sopenharmony_ci addToIndexArray({ fileName: filename, mockFunctionName: `mock${firstCharacterToUppercase(moduleName)}` }); 1377c804472Sopenharmony_ci } 1387c804472Sopenharmony_ci let outBody = ''; 1397c804472Sopenharmony_ci const defaultExportClassBack = defaultExportClassForEach({ moduleBody, outBody, filename, sourceFile, mockApi }); 1407c804472Sopenharmony_ci moduleBody = defaultExportClassBack.moduleBody; 1417c804472Sopenharmony_ci outBody = defaultExportClassBack.outBody; 1427c804472Sopenharmony_ci const judgmentModuleEntityProps = { 1437c804472Sopenharmony_ci moduleEntity, 1447c804472Sopenharmony_ci moduleBody: defaultExportClassBack.moduleBody, 1457c804472Sopenharmony_ci outBody: defaultExportClassBack.outBody, 1467c804472Sopenharmony_ci sourceFile, 1477c804472Sopenharmony_ci mockApi, 1487c804472Sopenharmony_ci enumBody, 1497c804472Sopenharmony_ci extraImport, 1507c804472Sopenharmony_ci moduleName, 1517c804472Sopenharmony_ci importDeclarations 1527c804472Sopenharmony_ci }; 1537c804472Sopenharmony_ci const judgmentModuleEntityBack = judgmentModuleEntity(judgmentModuleEntityProps); 1547c804472Sopenharmony_ci moduleBody = judgmentModuleEntityBack.moduleBody; 1557c804472Sopenharmony_ci outBody = judgmentModuleEntityBack.outBody; 1567c804472Sopenharmony_ci enumBody = judgmentModuleEntityBack.enumBody; 1577c804472Sopenharmony_ci moduleBody = moduleEntityForEach(judgmentModuleEntityProps, innerModuleBody, filename); 1587c804472Sopenharmony_ci 1597c804472Sopenharmony_ci const exportString = getExportBody(moduleEntity); 1607c804472Sopenharmony_ci if (exportString !== '') { 1617c804472Sopenharmony_ci moduleBody += '\t' + exportString; 1627c804472Sopenharmony_ci } 1637c804472Sopenharmony_ci 1647c804472Sopenharmony_ci moduleBody += '\t};'; 1657c804472Sopenharmony_ci moduleBody += `\n\treturn ${moduleName};}\n`; 1667c804472Sopenharmony_ci moduleBody += outBody; 1677c804472Sopenharmony_ci moduleBody = enumBody + moduleBody; 1687c804472Sopenharmony_ci return moduleBody; 1697c804472Sopenharmony_ci} 1707c804472Sopenharmony_ci 1717c804472Sopenharmony_ci/** 1727c804472Sopenharmony_ci * Obtain the variables to be exported. 1737c804472Sopenharmony_ci * 1747c804472Sopenharmony_ci * @param moduleEntity ModuleBlockEntity 1757c804472Sopenharmony_ci * @returns string 1767c804472Sopenharmony_ci */ 1777c804472Sopenharmony_cifunction getExportBody(moduleEntity: ModuleBlockEntity): string { 1787c804472Sopenharmony_ci let exportString = ''; 1797c804472Sopenharmony_ci const exports = getModuleExportElements(moduleEntity); 1807c804472Sopenharmony_ci exports.forEach(value => { 1817c804472Sopenharmony_ci if (value.type === 'module' && !value.name.startsWith("'") && !value.name.startsWith('"')) { 1827c804472Sopenharmony_ci exportString += `${value.name}: mock${value.name}(),\n`; 1837c804472Sopenharmony_ci } else { 1847c804472Sopenharmony_ci exportString += `${value.name}: ${value.name},\n`; 1857c804472Sopenharmony_ci } 1867c804472Sopenharmony_ci }); 1877c804472Sopenharmony_ci return exportString; 1887c804472Sopenharmony_ci} 1897c804472Sopenharmony_ci 1907c804472Sopenharmony_ci/** 1917c804472Sopenharmony_ci * judgment ModuleEntityLength 1927c804472Sopenharmony_ci * @param props 1937c804472Sopenharmony_ci * @param innerModuleBody 1947c804472Sopenharmony_ci * @param filename 1957c804472Sopenharmony_ci * @returns 1967c804472Sopenharmony_ci */ 1977c804472Sopenharmony_cifunction moduleEntityForEach(props: JudgmentModuleEntityProps, innerModuleBody: string, filename: string): string { 1987c804472Sopenharmony_ci let functionBody = ''; 1997c804472Sopenharmony_ci if (props.moduleEntity.functionDeclarations.size > 0) { 2007c804472Sopenharmony_ci props.moduleEntity.functionDeclarations.forEach(value => { 2017c804472Sopenharmony_ci functionBody += '\t' + generateCommonFunction(props.moduleName, value, props.sourceFile, 2027c804472Sopenharmony_ci props.mockApi, false) + '\n'; 2037c804472Sopenharmony_ci }); 2047c804472Sopenharmony_ci } 2057c804472Sopenharmony_ci if (props.moduleEntity.moduleDeclarations.length > 0) { 2067c804472Sopenharmony_ci props.moduleEntity.moduleDeclarations.forEach(value => { 2077c804472Sopenharmony_ci if (!value.moduleName.startsWith("'") && !value.moduleName.startsWith('"')) { 2087c804472Sopenharmony_ci innerModuleBody += generateInnerModuleDeclaration(value, props.sourceFile, filename, props.mockApi, 2097c804472Sopenharmony_ci props.extraImport, props.importDeclarations); 2107c804472Sopenharmony_ci } 2117c804472Sopenharmony_ci }); 2127c804472Sopenharmony_ci } 2137c804472Sopenharmony_ci if (innerModuleBody) { 2147c804472Sopenharmony_ci props.moduleBody += innerModuleBody + '\n'; 2157c804472Sopenharmony_ci } 2167c804472Sopenharmony_ci props.moduleBody += '\t' + `const ${props.moduleName} = {`; 2177c804472Sopenharmony_ci if (props.moduleEntity.variableStatements.length > 0) { 2187c804472Sopenharmony_ci props.moduleEntity.variableStatements.forEach(value => { 2197c804472Sopenharmony_ci value.forEach(val => { 2207c804472Sopenharmony_ci props.moduleBody += generateVariableStatementDelcatation(val, false) + '\n'; 2217c804472Sopenharmony_ci }); 2227c804472Sopenharmony_ci }); 2237c804472Sopenharmony_ci } 2247c804472Sopenharmony_ci const sourceFileFunctions = getSourceFileFunctions(props.sourceFile); 2257c804472Sopenharmony_ci let sourceFileFunctionBody = ''; 2267c804472Sopenharmony_ci if (sourceFileFunctions.size > 0) { 2277c804472Sopenharmony_ci sourceFileFunctions.forEach(value => { 2287c804472Sopenharmony_ci sourceFileFunctionBody += '\n' + generateCommonFunction(props.moduleName, value, 2297c804472Sopenharmony_ci props.sourceFile, props.mockApi, false); 2307c804472Sopenharmony_ci }); 2317c804472Sopenharmony_ci } 2327c804472Sopenharmony_ci const sourceFileVariableStatements = getSourceFileVariableStatements(props.sourceFile); 2337c804472Sopenharmony_ci let sourceFileStatementBody = ''; 2347c804472Sopenharmony_ci if (sourceFileVariableStatements.length > 0) { 2357c804472Sopenharmony_ci sourceFileVariableStatements.forEach(value => { 2367c804472Sopenharmony_ci value.forEach(val => { 2377c804472Sopenharmony_ci sourceFileStatementBody += '\n' + generateVariableStatementDelcatation(val, false); 2387c804472Sopenharmony_ci }); 2397c804472Sopenharmony_ci }); 2407c804472Sopenharmony_ci } 2417c804472Sopenharmony_ci props.moduleBody += sourceFileFunctionBody + '\n'; 2427c804472Sopenharmony_ci props.moduleBody += sourceFileStatementBody + '\n'; 2437c804472Sopenharmony_ci props.moduleBody += functionBody + '\n'; 2447c804472Sopenharmony_ci return props.moduleBody; 2457c804472Sopenharmony_ci} 2467c804472Sopenharmony_ci 2477c804472Sopenharmony_ci/** 2487c804472Sopenharmony_ci * handle extra class declaration body 2497c804472Sopenharmony_ci * @param value 2507c804472Sopenharmony_ci * @param fileName 2517c804472Sopenharmony_ci * @returns 2527c804472Sopenharmony_ci */ 2537c804472Sopenharmony_cifunction handleExtraClassDeclarationBody(value: ClassEntity, fileName: string): boolean { 2547c804472Sopenharmony_ci if (fileName.includes('@ohos.util.stream.d.ts') && value.className === 'Transform') { 2557c804472Sopenharmony_ci return true; 2567c804472Sopenharmony_ci } 2577c804472Sopenharmony_ci return false; 2587c804472Sopenharmony_ci} 2597c804472Sopenharmony_ci 2607c804472Sopenharmony_ci/** 2617c804472Sopenharmony_ci * judgment ModuleEntity 2627c804472Sopenharmony_ci * @param props 2637c804472Sopenharmony_ci * @returns 2647c804472Sopenharmony_ci */ 2657c804472Sopenharmony_cifunction judgmentModuleEntity(props: JudgmentModuleEntityProps): JudgmentModuleEntityBack { 2667c804472Sopenharmony_ci if (props.moduleEntity.typeAliasDeclarations.length > 0) { 2677c804472Sopenharmony_ci props.moduleEntity.typeAliasDeclarations.forEach(value => { 2687c804472Sopenharmony_ci props.outBody += 2697c804472Sopenharmony_ci generateTypeAliasDeclaration(value, true, props.sourceFile, props.extraImport, props.mockApi) + '\n'; 2707c804472Sopenharmony_ci }); 2717c804472Sopenharmony_ci } 2727c804472Sopenharmony_ci if (props.moduleEntity.moduleImportEquaqls.length > 0) { 2737c804472Sopenharmony_ci props.moduleEntity.moduleImportEquaqls.forEach(value => { 2747c804472Sopenharmony_ci props.outBody += generateImportEqual(value) + '\n'; 2757c804472Sopenharmony_ci }); 2767c804472Sopenharmony_ci } 2777c804472Sopenharmony_ci if (props.moduleEntity.classDeclarations.length > 0) { 2787c804472Sopenharmony_ci props.outBody = generateClassDeclarations(props); 2797c804472Sopenharmony_ci } 2807c804472Sopenharmony_ci if (props.moduleEntity.interfaceDeclarations.length > 0) { 2817c804472Sopenharmony_ci props.moduleEntity.interfaceDeclarations.forEach(value => { 2827c804472Sopenharmony_ci props.outBody += generateInterfaceDeclaration(value, props.sourceFile, false, props.mockApi, 2837c804472Sopenharmony_ci props.moduleEntity.interfaceDeclarations, props.importDeclarations, props.extraImport) + ';\n'; 2847c804472Sopenharmony_ci }); 2857c804472Sopenharmony_ci } 2867c804472Sopenharmony_ci if (props.moduleEntity.enumDeclarations.length > 0) { 2877c804472Sopenharmony_ci props.moduleEntity.enumDeclarations.forEach(value => { 2887c804472Sopenharmony_ci props.enumBody += generateEnumDeclaration(props.moduleName, value) + '\n'; 2897c804472Sopenharmony_ci }); 2907c804472Sopenharmony_ci } 2917c804472Sopenharmony_ci return { 2927c804472Sopenharmony_ci outBody: props.outBody, 2937c804472Sopenharmony_ci moduleBody: props.moduleBody, 2947c804472Sopenharmony_ci enumBody: props.enumBody 2957c804472Sopenharmony_ci }; 2967c804472Sopenharmony_ci} 2977c804472Sopenharmony_ci 2987c804472Sopenharmony_ci/** 2997c804472Sopenharmony_ci * generate classDeclarations 3007c804472Sopenharmony_ci * @param props 3017c804472Sopenharmony_ci * @returns 3027c804472Sopenharmony_ci */ 3037c804472Sopenharmony_cifunction generateClassDeclarations(props: JudgmentModuleEntityProps): string { 3047c804472Sopenharmony_ci let extraOutBody = ''; 3057c804472Sopenharmony_ci props.moduleEntity.classDeclarations.forEach(value => { 3067c804472Sopenharmony_ci const body = 3077c804472Sopenharmony_ci generateClassDeclaration(props.moduleName, value, false, '', '', props.sourceFile, false, props.mockApi) + '\n'; 3087c804472Sopenharmony_ci if (handleExtraClassDeclarationBody(value, props.sourceFile.fileName)) { 3097c804472Sopenharmony_ci extraOutBody = body; 3107c804472Sopenharmony_ci } else { 3117c804472Sopenharmony_ci props.outBody += body; 3127c804472Sopenharmony_ci } 3137c804472Sopenharmony_ci }); 3147c804472Sopenharmony_ci props.outBody += extraOutBody; 3157c804472Sopenharmony_ci return props.outBody; 3167c804472Sopenharmony_ci} 3177c804472Sopenharmony_ci 3187c804472Sopenharmony_ci/** 3197c804472Sopenharmony_ci * defaultExportClass ForEach 3207c804472Sopenharmony_ci * @param props 3217c804472Sopenharmony_ci * @returns 3227c804472Sopenharmony_ci */ 3237c804472Sopenharmony_cifunction defaultExportClassForEach(props: DefaultExportClassProps): DefaultExportClassBack { 3247c804472Sopenharmony_ci const defaultExportClass = getDefaultExportClassDeclaration(props.sourceFile); 3257c804472Sopenharmony_ci 3267c804472Sopenharmony_ci if (defaultExportClass.length > 0) { 3277c804472Sopenharmony_ci defaultExportClass.forEach(value => { 3287c804472Sopenharmony_ci if ( 3297c804472Sopenharmony_ci value.exportModifiers.includes(SyntaxKind.DefaultKeyword) && 3307c804472Sopenharmony_ci value.exportModifiers.includes(SyntaxKind.ExportKeyword) 3317c804472Sopenharmony_ci ) { 3327c804472Sopenharmony_ci const moduleBodyAndOutBodyBack = getModuleBodyAndOutBody(props, value); 3337c804472Sopenharmony_ci props.outBody = moduleBodyAndOutBodyBack.outBody; 3347c804472Sopenharmony_ci props.moduleBody = moduleBodyAndOutBodyBack.moduleBody; 3357c804472Sopenharmony_ci } 3367c804472Sopenharmony_ci }); 3377c804472Sopenharmony_ci } 3387c804472Sopenharmony_ci return { 3397c804472Sopenharmony_ci outBody: props.outBody, 3407c804472Sopenharmony_ci moduleBody: props.moduleBody 3417c804472Sopenharmony_ci }; 3427c804472Sopenharmony_ci} 3437c804472Sopenharmony_ci 3447c804472Sopenharmony_ci/** 3457c804472Sopenharmony_ci * get ModuleBodyAndOutBody 3467c804472Sopenharmony_ci * @param props 3477c804472Sopenharmony_ci * @param value 3487c804472Sopenharmony_ci * @returns 3497c804472Sopenharmony_ci */ 3507c804472Sopenharmony_cifunction getModuleBodyAndOutBody(props: DefaultExportClassProps, value: ClassEntity): DefaultExportClassBack { 3517c804472Sopenharmony_ci if (props.filename.startsWith('system_')) { 3527c804472Sopenharmony_ci const mockNameArr = props.filename.split('_'); 3537c804472Sopenharmony_ci const mockName = mockNameArr[mockNameArr.length - 1]; 3547c804472Sopenharmony_ci addToSystemIndexArray({ 3557c804472Sopenharmony_ci filename: props.filename, 3567c804472Sopenharmony_ci mockFunctionName: `mock${firstCharacterToUppercase(mockName)}` 3577c804472Sopenharmony_ci }); 3587c804472Sopenharmony_ci 3597c804472Sopenharmony_ci props.moduleBody += `global.systemplugin.${mockName} = {`; 3607c804472Sopenharmony_ci if (value.staticMethods.length > 0) { 3617c804472Sopenharmony_ci let staticMethodBody = ''; 3627c804472Sopenharmony_ci value.staticMethods.forEach(val => { 3637c804472Sopenharmony_ci staticMethodBody += generateStaticFunction(val, true, props.sourceFile, props.mockApi) + '\n'; 3647c804472Sopenharmony_ci }); 3657c804472Sopenharmony_ci props.moduleBody += staticMethodBody; 3667c804472Sopenharmony_ci } 3677c804472Sopenharmony_ci props.moduleBody += '}'; 3687c804472Sopenharmony_ci } else { 3697c804472Sopenharmony_ci props.outBody += generateClassDeclaration( 3707c804472Sopenharmony_ci '', 3717c804472Sopenharmony_ci value, 3727c804472Sopenharmony_ci false, 3737c804472Sopenharmony_ci '', 3747c804472Sopenharmony_ci props.filename, 3757c804472Sopenharmony_ci props.sourceFile, 3767c804472Sopenharmony_ci false, 3777c804472Sopenharmony_ci props.mockApi 3787c804472Sopenharmony_ci ); 3797c804472Sopenharmony_ci } 3807c804472Sopenharmony_ci return { 3817c804472Sopenharmony_ci outBody: props.outBody, 3827c804472Sopenharmony_ci moduleBody: props.moduleBody 3837c804472Sopenharmony_ci }; 3847c804472Sopenharmony_ci} 3857c804472Sopenharmony_ci 3867c804472Sopenharmony_cifunction generateInnerModuleDeclaration( 3877c804472Sopenharmony_ci moduleEntity: ModuleBlockEntity, 3887c804472Sopenharmony_ci sourceFile: SourceFile, 3897c804472Sopenharmony_ci filename: string, 3907c804472Sopenharmony_ci mockApi: string, 3917c804472Sopenharmony_ci extraImport: string[], 3927c804472Sopenharmony_ci importDeclarations: ImportElementEntity[] 3937c804472Sopenharmony_ci): string { 3947c804472Sopenharmony_ci const innerModuleBody = ''; 3957c804472Sopenharmony_ci let innerModuleName = moduleEntity.moduleName.replace(/["']/g, ''); 3967c804472Sopenharmony_ci let moduleBody = `function mock${innerModuleName}() {\n`; 3977c804472Sopenharmony_ci let innerOutBody = ''; 3987c804472Sopenharmony_ci const innerFunctionBody = ''; 3997c804472Sopenharmony_ci const moduleEntityLoopBack = moduleEntityLoop({ 4007c804472Sopenharmony_ci moduleEntity, 4017c804472Sopenharmony_ci innerOutBody, 4027c804472Sopenharmony_ci moduleBody, 4037c804472Sopenharmony_ci sourceFile, 4047c804472Sopenharmony_ci mockApi, 4057c804472Sopenharmony_ci extraImport, 4067c804472Sopenharmony_ci innerModuleName, 4077c804472Sopenharmony_ci importDeclarations 4087c804472Sopenharmony_ci }); 4097c804472Sopenharmony_ci innerOutBody = moduleEntityLoopBack.innerOutBody; 4107c804472Sopenharmony_ci moduleBody = moduleEntityLoopBack.moduleBody; 4117c804472Sopenharmony_ci const moduleEntityNextBack = moduleEntityNext({ 4127c804472Sopenharmony_ci moduleEntity, 4137c804472Sopenharmony_ci innerFunctionBody, 4147c804472Sopenharmony_ci innerModuleBody, 4157c804472Sopenharmony_ci filename, 4167c804472Sopenharmony_ci moduleBody, 4177c804472Sopenharmony_ci sourceFile, 4187c804472Sopenharmony_ci mockApi, 4197c804472Sopenharmony_ci extraImport, 4207c804472Sopenharmony_ci innerModuleName, 4217c804472Sopenharmony_ci importDeclarations 4227c804472Sopenharmony_ci }); 4237c804472Sopenharmony_ci innerModuleName = moduleEntityNextBack.innerModuleName; 4247c804472Sopenharmony_ci moduleBody = moduleEntityNextBack.moduleBody; 4257c804472Sopenharmony_ci moduleBody += '\t};'; 4267c804472Sopenharmony_ci moduleBody += `\n\treturn ${innerModuleName};}\n`; 4277c804472Sopenharmony_ci moduleBody += innerOutBody; 4287c804472Sopenharmony_ci return moduleBody; 4297c804472Sopenharmony_ci} 4307c804472Sopenharmony_ci 4317c804472Sopenharmony_ci/** 4327c804472Sopenharmony_ci * moduleEntity judgment 4337c804472Sopenharmony_ci * @param props 4347c804472Sopenharmony_ci * @returns 4357c804472Sopenharmony_ci */ 4367c804472Sopenharmony_cifunction moduleEntityLoop(props: ModuleEntityLoopProps): ModuleEntityLoopBack { 4377c804472Sopenharmony_ci if (props.moduleEntity.typeAliasDeclarations.length) { 4387c804472Sopenharmony_ci props.moduleEntity.typeAliasDeclarations.forEach(value => { 4397c804472Sopenharmony_ci props.innerOutBody += 4407c804472Sopenharmony_ci generateTypeAliasDeclaration(value, true, props.sourceFile, props.extraImport, props.mockApi) + '\n'; 4417c804472Sopenharmony_ci }); 4427c804472Sopenharmony_ci } 4437c804472Sopenharmony_ci if (props.moduleEntity.moduleImportEquaqls.length) { 4447c804472Sopenharmony_ci props.moduleEntity.moduleImportEquaqls.forEach(value => { 4457c804472Sopenharmony_ci props.innerOutBody += generateImportEqual(value) + '\n'; 4467c804472Sopenharmony_ci }); 4477c804472Sopenharmony_ci } 4487c804472Sopenharmony_ci 4497c804472Sopenharmony_ci if (props.moduleEntity.classDeclarations.length) { 4507c804472Sopenharmony_ci props.moduleEntity.classDeclarations.forEach(value => { 4517c804472Sopenharmony_ci if (value.exportModifiers.length && value.exportModifiers.includes(SyntaxKind.ExportKeyword)) { 4527c804472Sopenharmony_ci props.innerOutBody += generateClassDeclaration(props.innerModuleName, value, false, '', '', props.sourceFile, false, props.mockApi) + '\n'; 4537c804472Sopenharmony_ci } else { 4547c804472Sopenharmony_ci props.moduleBody += '\t' + generateClassDeclaration(props.innerModuleName, value, false, '', '', props.sourceFile, true, props.mockApi) + '\n'; 4557c804472Sopenharmony_ci } 4567c804472Sopenharmony_ci }); 4577c804472Sopenharmony_ci } 4587c804472Sopenharmony_ci if (props.moduleEntity.interfaceDeclarations.length) { 4597c804472Sopenharmony_ci props.moduleEntity.interfaceDeclarations.forEach(value => { 4607c804472Sopenharmony_ci if (value.exportModifiers.length) { 4617c804472Sopenharmony_ci props.innerOutBody += generateInterfaceDeclaration(value, props.sourceFile, false, props.mockApi, 4627c804472Sopenharmony_ci props.moduleEntity.interfaceDeclarations, props.importDeclarations, props.extraImport) + ';\n'; 4637c804472Sopenharmony_ci } else { 4647c804472Sopenharmony_ci props.moduleBody += '\t' + generateInterfaceDeclaration(value, props.sourceFile, false, props.mockApi, 4657c804472Sopenharmony_ci props.moduleEntity.interfaceDeclarations, props.importDeclarations, props.extraImport) + ';\n'; 4667c804472Sopenharmony_ci } 4677c804472Sopenharmony_ci }); 4687c804472Sopenharmony_ci } 4697c804472Sopenharmony_ci if (props.moduleEntity.enumDeclarations.length) { 4707c804472Sopenharmony_ci props.moduleEntity.enumDeclarations.forEach(value => { 4717c804472Sopenharmony_ci if (value.exportModifiers.length) { 4727c804472Sopenharmony_ci props.innerOutBody += generateEnumDeclaration(props.innerModuleName, value) + '\n'; 4737c804472Sopenharmony_ci } else { 4747c804472Sopenharmony_ci props.moduleBody += generateEnumDeclaration(props.innerModuleName, value); 4757c804472Sopenharmony_ci } 4767c804472Sopenharmony_ci }); 4777c804472Sopenharmony_ci } 4787c804472Sopenharmony_ci return { 4797c804472Sopenharmony_ci moduleBody: props.moduleBody, 4807c804472Sopenharmony_ci innerOutBody: props.innerOutBody 4817c804472Sopenharmony_ci }; 4827c804472Sopenharmony_ci} 4837c804472Sopenharmony_ci 4847c804472Sopenharmony_ci/** 4857c804472Sopenharmony_ci * Next moduleEntity judgment 4867c804472Sopenharmony_ci * @param props 4877c804472Sopenharmony_ci * @returns 4887c804472Sopenharmony_ci */ 4897c804472Sopenharmony_cifunction moduleEntityNext(props: ModuleEntityNextProps): ModuleEntityNextBack { 4907c804472Sopenharmony_ci if (props.moduleEntity.functionDeclarations.size) { 4917c804472Sopenharmony_ci props.moduleEntity.functionDeclarations.forEach(value => { 4927c804472Sopenharmony_ci props.innerFunctionBody += '\n' + generateCommonFunction(props.innerModuleName, value, 4937c804472Sopenharmony_ci props.sourceFile, props.mockApi, false) + '\n'; 4947c804472Sopenharmony_ci }); 4957c804472Sopenharmony_ci } 4967c804472Sopenharmony_ci 4977c804472Sopenharmony_ci if (props.moduleEntity.moduleDeclarations.length) { 4987c804472Sopenharmony_ci props.moduleEntity.moduleDeclarations.forEach(value => { 4997c804472Sopenharmony_ci if (!value.moduleName.startsWith("'") && !value.moduleName.startsWith('"')) { 5007c804472Sopenharmony_ci props.innerModuleBody += generateInnerModuleDeclaration(value, props.sourceFile, props.filename, 5017c804472Sopenharmony_ci props.mockApi, props.extraImport, props.importDeclarations); 5027c804472Sopenharmony_ci } 5037c804472Sopenharmony_ci }); 5047c804472Sopenharmony_ci } 5057c804472Sopenharmony_ci if (props.innerModuleBody) { 5067c804472Sopenharmony_ci props.moduleBody += props.innerModuleBody + '\n'; 5077c804472Sopenharmony_ci } 5087c804472Sopenharmony_ci 5097c804472Sopenharmony_ci props.moduleBody += `const ${props.innerModuleName} = {\n`; 5107c804472Sopenharmony_ci if (props.moduleEntity.variableStatements.length) { 5117c804472Sopenharmony_ci props.moduleEntity.variableStatements.forEach(value => { 5127c804472Sopenharmony_ci value.forEach(val => { 5137c804472Sopenharmony_ci props.moduleBody += generateVariableStatementDelcatation(val, false) + '\n'; 5147c804472Sopenharmony_ci }); 5157c804472Sopenharmony_ci }); 5167c804472Sopenharmony_ci } 5177c804472Sopenharmony_ci 5187c804472Sopenharmony_ci props.moduleBody += props.innerFunctionBody + '\n'; 5197c804472Sopenharmony_ci 5207c804472Sopenharmony_ci const exportArr = getModuleExportElements(props.moduleEntity); 5217c804472Sopenharmony_ci let innerExportString = ''; 5227c804472Sopenharmony_ci exportArr.forEach(value => { 5237c804472Sopenharmony_ci if (value.type === 'module' && !value.name.startsWith("'") && !value.name.startsWith('"')) { 5247c804472Sopenharmony_ci innerExportString += `${value.name}: mock${value.name}(),\n`; 5257c804472Sopenharmony_ci } else { 5267c804472Sopenharmony_ci innerExportString += `${value.name}: ${value.name},\n`; 5277c804472Sopenharmony_ci } 5287c804472Sopenharmony_ci }); 5297c804472Sopenharmony_ci if (innerExportString !== '') { 5307c804472Sopenharmony_ci props.moduleBody += '\t' + innerExportString; 5317c804472Sopenharmony_ci } 5327c804472Sopenharmony_ci return { 5337c804472Sopenharmony_ci innerModuleName: props.innerModuleName, 5347c804472Sopenharmony_ci moduleBody: props.moduleBody 5357c804472Sopenharmony_ci }; 5367c804472Sopenharmony_ci} 5377c804472Sopenharmony_ci 5387c804472Sopenharmony_ci/** 5397c804472Sopenharmony_ci * generate inner module for declare module 5407c804472Sopenharmony_ci * @param moduleEntity 5417c804472Sopenharmony_ci * @returns 5427c804472Sopenharmony_ci */ 5437c804472Sopenharmony_cifunction generateInnerDeclareModule(moduleEntity: ModuleBlockEntity): string { 5447c804472Sopenharmony_ci const moduleName = '$' + moduleEntity.moduleName.replace(/["']/g, ''); 5457c804472Sopenharmony_ci let module = `\n\texport const ${moduleName} = `; 5467c804472Sopenharmony_ci if (moduleEntity.exportDeclarations.length > 0) { 5477c804472Sopenharmony_ci moduleEntity.exportDeclarations.forEach(value => { 5487c804472Sopenharmony_ci module += value.match(/{[^{}]*}/g)[0] + '\n'; 5497c804472Sopenharmony_ci }); 5507c804472Sopenharmony_ci } 5517c804472Sopenharmony_ci return module; 5527c804472Sopenharmony_ci} 5537c804472Sopenharmony_ci 5547c804472Sopenharmony_ci/** 5557c804472Sopenharmony_ci * generate inner module 5567c804472Sopenharmony_ci * @param moduleEntity 5577c804472Sopenharmony_ci * @param sourceFile 5587c804472Sopenharmony_ci * @param extraImport 5597c804472Sopenharmony_ci * @returns 5607c804472Sopenharmony_ci */ 5617c804472Sopenharmony_cifunction generateInnerModule( 5627c804472Sopenharmony_ci moduleEntity: ModuleBlockEntity, 5637c804472Sopenharmony_ci sourceFile: SourceFile, 5647c804472Sopenharmony_ci extraImport: string[], 5657c804472Sopenharmony_ci mockApi: string 5667c804472Sopenharmony_ci): string { 5677c804472Sopenharmony_ci const moduleName = moduleEntity.moduleName; 5687c804472Sopenharmony_ci let innerModuleBody = `const ${moduleName} = (()=> {`; 5697c804472Sopenharmony_ci 5707c804472Sopenharmony_ci if (moduleEntity.enumDeclarations.length > 0) { 5717c804472Sopenharmony_ci moduleEntity.enumDeclarations.forEach(value => { 5727c804472Sopenharmony_ci innerModuleBody += generateEnumDeclaration(moduleName, value) + '\n'; 5737c804472Sopenharmony_ci }); 5747c804472Sopenharmony_ci } 5757c804472Sopenharmony_ci 5767c804472Sopenharmony_ci if (moduleEntity.typeAliasDeclarations.length > 0) { 5777c804472Sopenharmony_ci moduleEntity.typeAliasDeclarations.forEach(value => { 5787c804472Sopenharmony_ci innerModuleBody += generateTypeAliasDeclaration(value, true, sourceFile, extraImport, mockApi) + '\n'; 5797c804472Sopenharmony_ci }); 5807c804472Sopenharmony_ci } 5817c804472Sopenharmony_ci 5827c804472Sopenharmony_ci if (moduleEntity.moduleImportEquaqls.length > 0) { 5837c804472Sopenharmony_ci moduleEntity.moduleImportEquaqls.forEach(value => { 5847c804472Sopenharmony_ci innerModuleBody += generateImportEqual(value) + '\n'; 5857c804472Sopenharmony_ci }); 5867c804472Sopenharmony_ci } 5877c804472Sopenharmony_ci 5887c804472Sopenharmony_ci if (moduleEntity.interfaceDeclarations.length > 0) { 5897c804472Sopenharmony_ci moduleEntity.interfaceDeclarations.forEach(value => { 5907c804472Sopenharmony_ci innerModuleBody += generateInterfaceDeclaration(value, sourceFile, false, '', moduleEntity.interfaceDeclarations) + '\n'; 5917c804472Sopenharmony_ci }); 5927c804472Sopenharmony_ci } 5937c804472Sopenharmony_ci 5947c804472Sopenharmony_ci let functionBody = 'return {'; 5957c804472Sopenharmony_ci if (moduleEntity.functionDeclarations.size > 0) { 5967c804472Sopenharmony_ci moduleEntity.functionDeclarations.forEach(value => { 5977c804472Sopenharmony_ci functionBody += generateCommonFunction(moduleName, value, sourceFile, '', false) + '\n'; 5987c804472Sopenharmony_ci }); 5997c804472Sopenharmony_ci } 6007c804472Sopenharmony_ci 6017c804472Sopenharmony_ci if (moduleEntity.variableStatements.length > 0) { 6027c804472Sopenharmony_ci moduleEntity.variableStatements.forEach(value => { 6037c804472Sopenharmony_ci value.forEach(val => { 6047c804472Sopenharmony_ci innerModuleBody += generateVariableStatementDelcatation(val, true) + '\n'; 6057c804472Sopenharmony_ci }); 6067c804472Sopenharmony_ci }); 6077c804472Sopenharmony_ci } 6087c804472Sopenharmony_ci innerModuleBody += functionBody + '\n'; 6097c804472Sopenharmony_ci 6107c804472Sopenharmony_ci const exports = getModuleExportElements(moduleEntity); 6117c804472Sopenharmony_ci let exportString = ''; 6127c804472Sopenharmony_ci exports.forEach(value => { 6137c804472Sopenharmony_ci exportString += `${value.name}: ${value.name},\n`; 6147c804472Sopenharmony_ci }); 6157c804472Sopenharmony_ci if (exportString !== '') { 6167c804472Sopenharmony_ci innerModuleBody += '\t' + exportString; 6177c804472Sopenharmony_ci } 6187c804472Sopenharmony_ci innerModuleBody += '\t};})();'; 6197c804472Sopenharmony_ci return innerModuleBody; 6207c804472Sopenharmony_ci} 6217c804472Sopenharmony_ci 6227c804472Sopenharmony_ci/** 6237c804472Sopenharmony_ci * get all export elements 6247c804472Sopenharmony_ci * @param moduleEntity 6257c804472Sopenharmony_ci * @returns 6267c804472Sopenharmony_ci */ 6277c804472Sopenharmony_cifunction getModuleExportElements(moduleEntity: ModuleBlockEntity): Array<ModuleExportEntity> { 6287c804472Sopenharmony_ci const exportElements: Array<ModuleExportEntity> = []; 6297c804472Sopenharmony_ci if (moduleEntity.moduleName.startsWith('"') && moduleEntity.moduleName.endsWith('"')) { 6307c804472Sopenharmony_ci return exportElements; 6317c804472Sopenharmony_ci } 6327c804472Sopenharmony_ci if (moduleEntity.classDeclarations.length > 0) { 6337c804472Sopenharmony_ci moduleEntity.classDeclarations.forEach(value => { 6347c804472Sopenharmony_ci exportElements.push({ name: firstCharacterToUppercase(value.className), type: 'class' }); 6357c804472Sopenharmony_ci }); 6367c804472Sopenharmony_ci } 6377c804472Sopenharmony_ci 6387c804472Sopenharmony_ci if (moduleEntity.interfaceDeclarations.length > 0) { 6397c804472Sopenharmony_ci moduleEntity.interfaceDeclarations.forEach(value => { 6407c804472Sopenharmony_ci exportElements.push({ name: value.interfaceName, type: 'interface' }); 6417c804472Sopenharmony_ci }); 6427c804472Sopenharmony_ci } 6437c804472Sopenharmony_ci 6447c804472Sopenharmony_ci if (moduleEntity.enumDeclarations.length > 0) { 6457c804472Sopenharmony_ci moduleEntity.enumDeclarations.forEach(value => { 6467c804472Sopenharmony_ci exportElements.push({ name: value.enumName, type: 'enum' }); 6477c804472Sopenharmony_ci }); 6487c804472Sopenharmony_ci } 6497c804472Sopenharmony_ci 6507c804472Sopenharmony_ci if (moduleEntity.moduleDeclarations.length > 0) { 6517c804472Sopenharmony_ci moduleEntity.moduleDeclarations.forEach(value => { 6527c804472Sopenharmony_ci exportElements.push({ name: value.moduleName, type: 'module' }); 6537c804472Sopenharmony_ci }); 6547c804472Sopenharmony_ci } 6557c804472Sopenharmony_ci 6567c804472Sopenharmony_ci if (moduleEntity.typeAliasDeclarations.length > 0) { 6577c804472Sopenharmony_ci moduleEntity.typeAliasDeclarations.forEach(value => { 6587c804472Sopenharmony_ci exportElements.push({ name: value.typeAliasName, type: 'type' }); 6597c804472Sopenharmony_ci }); 6607c804472Sopenharmony_ci } 6617c804472Sopenharmony_ci return exportElements; 6627c804472Sopenharmony_ci} 663