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