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 {
177c804472Sopenharmony_ci  isCallSignatureDeclaration,
187c804472Sopenharmony_ci  isConstructorDeclaration,
197c804472Sopenharmony_ci  isHeritageClause,
207c804472Sopenharmony_ci  isIndexSignatureDeclaration,
217c804472Sopenharmony_ci  isMethodSignature,
227c804472Sopenharmony_ci  isPropertySignature,
237c804472Sopenharmony_ci  isTypeParameterDeclaration
247c804472Sopenharmony_ci} from 'typescript';
257c804472Sopenharmony_ciimport type { InterfaceDeclaration, SourceFile } from 'typescript';
267c804472Sopenharmony_ciimport { getExportKeyword } from '../common/commonUtils';
277c804472Sopenharmony_ciimport { getCallSignatureDeclaration } from './callSignatureDeclaration';
287c804472Sopenharmony_ciimport type { CallSignatureEntity } from './callSignatureDeclaration';
297c804472Sopenharmony_ciimport { getConstructorDeclaration } from './constructorDeclaration';
307c804472Sopenharmony_ciimport type { ConstructorEntity } from './constructorDeclaration';
317c804472Sopenharmony_ciimport { getHeritageClauseDeclaration } from './heritageClauseDeclaration';
327c804472Sopenharmony_ciimport type { HeritageClauseEntity } from './heritageClauseDeclaration';
337c804472Sopenharmony_ciimport { getIndexSignatureDeclaration } from './indexSignatureDeclaration';
347c804472Sopenharmony_ciimport type { IndexSignatureEntity } from './indexSignatureDeclaration';
357c804472Sopenharmony_ciimport { getMethodSignatureDeclaration } from './methodSignatureDeclaration';
367c804472Sopenharmony_ciimport type { MethodSignatureEntity } from './methodSignatureDeclaration';
377c804472Sopenharmony_ciimport { getPropertySignatureDeclaration } from './propertySignatureDeclaration';
387c804472Sopenharmony_ciimport type { PropertySignatureEntity } from './propertySignatureDeclaration';
397c804472Sopenharmony_ciimport { getTypeParameterDeclaration } from './typeParameterDeclaration';
407c804472Sopenharmony_ciimport type { TypeParameterEntity } from './typeParameterDeclaration';
417c804472Sopenharmony_ci
427c804472Sopenharmony_ciinterface SubstepInterfaceEntity {
437c804472Sopenharmony_ci  interfaceName: string;
447c804472Sopenharmony_ci  heritageClauses: Array<HeritageClauseEntity>;
457c804472Sopenharmony_ci  typeParameters: Array<TypeParameterEntity>;
467c804472Sopenharmony_ci  interfaceConstructors: Array<Array<ConstructorEntity>>;
477c804472Sopenharmony_ci  interfaceMethodSignature: Map<string, Array<MethodSignatureEntity>>;
487c804472Sopenharmony_ci  interfacePropertySignatures: Array<PropertySignatureEntity>;
497c804472Sopenharmony_ci  callSignatures: Array<CallSignatureEntity>;
507c804472Sopenharmony_ci  indexSignature: Array<IndexSignatureEntity>;
517c804472Sopenharmony_ci}
527c804472Sopenharmony_ci
537c804472Sopenharmony_ciinterface SubstepGetClassparam {
547c804472Sopenharmony_ci  interfaceNode: InterfaceDeclaration;
557c804472Sopenharmony_ci  sourceFile: SourceFile;
567c804472Sopenharmony_ci  heritageClauses: Array<HeritageClauseEntity>;
577c804472Sopenharmony_ci}
587c804472Sopenharmony_ciexport interface InterfaceEntity {
597c804472Sopenharmony_ci  interfaceName: string;
607c804472Sopenharmony_ci  typeParameters: Array<TypeParameterEntity>;
617c804472Sopenharmony_ci  heritageClauses: Array<HeritageClauseEntity>;
627c804472Sopenharmony_ci  interfaceConstructors: Array<Array<ConstructorEntity>>;
637c804472Sopenharmony_ci  interfaceMethodSignature: Map<string, Array<MethodSignatureEntity>>;
647c804472Sopenharmony_ci  interfacePropertySignatures: Array<PropertySignatureEntity>;
657c804472Sopenharmony_ci  callSignatures: Array<CallSignatureEntity>;
667c804472Sopenharmony_ci  exportModifiers: Array<number>;
677c804472Sopenharmony_ci  indexSignature: Array<IndexSignatureEntity>;
687c804472Sopenharmony_ci}
697c804472Sopenharmony_ci
707c804472Sopenharmony_ci/**
717c804472Sopenharmony_ci * get interface info
727c804472Sopenharmony_ci * @param interfaceNode
737c804472Sopenharmony_ci * @param sourceFile
747c804472Sopenharmony_ci * @returns
757c804472Sopenharmony_ci */
767c804472Sopenharmony_ciexport function getInterfaceDeclaration(interfaceNode: InterfaceDeclaration, sourceFile: SourceFile): InterfaceEntity {
777c804472Sopenharmony_ci  let exportModifiers: Array<number> = [];
787c804472Sopenharmony_ci  if (interfaceNode.modifiers !== undefined) {
797c804472Sopenharmony_ci    exportModifiers = getExportKeyword(interfaceNode.modifiers);
807c804472Sopenharmony_ci  }
817c804472Sopenharmony_ci
827c804472Sopenharmony_ci  const heritageClauses: Array<HeritageClauseEntity> = [];
837c804472Sopenharmony_ci
847c804472Sopenharmony_ci  if (interfaceNode.heritageClauses !== undefined) {
857c804472Sopenharmony_ci    interfaceNode.heritageClauses.forEach(value => {
867c804472Sopenharmony_ci      heritageClauses.push(getHeritageClauseDeclaration(value, sourceFile));
877c804472Sopenharmony_ci    });
887c804472Sopenharmony_ci  }
897c804472Sopenharmony_ci  const SubstepInterfaceEntitys: SubstepInterfaceEntity = substepGetInterface({
907c804472Sopenharmony_ci    interfaceNode,
917c804472Sopenharmony_ci    sourceFile,
927c804472Sopenharmony_ci    heritageClauses
937c804472Sopenharmony_ci  });
947c804472Sopenharmony_ci
957c804472Sopenharmony_ci  return {
967c804472Sopenharmony_ci    ...SubstepInterfaceEntitys,
977c804472Sopenharmony_ci    exportModifiers
987c804472Sopenharmony_ci  };
997c804472Sopenharmony_ci}
1007c804472Sopenharmony_ci
1017c804472Sopenharmony_ci/**
1027c804472Sopenharmony_ci * get some interface info
1037c804472Sopenharmony_ci * @param substepGetClassparam
1047c804472Sopenharmony_ci * @returns
1057c804472Sopenharmony_ci */
1067c804472Sopenharmony_cifunction substepGetInterface(substepGetClassparam: SubstepGetClassparam): SubstepInterfaceEntity {
1077c804472Sopenharmony_ci  const { interfaceNode, sourceFile, heritageClauses } = substepGetClassparam;
1087c804472Sopenharmony_ci  const interfaceName = interfaceNode.name.escapedText.toString();
1097c804472Sopenharmony_ci  const interfaceConstructors: Array<Array<ConstructorEntity>> = [];
1107c804472Sopenharmony_ci  const interfaceMethodSignature: Map<string, Array<MethodSignatureEntity>> = new Map<
1117c804472Sopenharmony_ci    string, Array<MethodSignatureEntity>
1127c804472Sopenharmony_ci  >();
1137c804472Sopenharmony_ci  const interfacePropertySignatures: Array<PropertySignatureEntity> = [];
1147c804472Sopenharmony_ci  const callSignature: Array<CallSignatureEntity> = [];
1157c804472Sopenharmony_ci  const typeParameters: Array<TypeParameterEntity> = [];
1167c804472Sopenharmony_ci  const indexSignature: Array<IndexSignatureEntity> = [];
1177c804472Sopenharmony_ci  interfaceNode.members.forEach(value => {
1187c804472Sopenharmony_ci    if (isPropertySignature(value)) {
1197c804472Sopenharmony_ci      interfacePropertySignatures.push(getPropertySignatureDeclaration(value, sourceFile));
1207c804472Sopenharmony_ci    } else if (isMethodSignature(value)) {
1217c804472Sopenharmony_ci      const methodSignature = getMethodSignatureDeclaration(value, sourceFile);
1227c804472Sopenharmony_ci      if (interfaceMethodSignature.get(methodSignature.functionName) !== undefined) {
1237c804472Sopenharmony_ci        interfaceMethodSignature.get(methodSignature.functionName)?.push(methodSignature);
1247c804472Sopenharmony_ci      } else {
1257c804472Sopenharmony_ci        const methodSignatureArray: Array<MethodSignatureEntity> = [];
1267c804472Sopenharmony_ci        methodSignatureArray.push(methodSignature);
1277c804472Sopenharmony_ci        interfaceMethodSignature.set(methodSignature.functionName, methodSignatureArray);
1287c804472Sopenharmony_ci      }
1297c804472Sopenharmony_ci    } else if (isHeritageClause(value)) {
1307c804472Sopenharmony_ci      heritageClauses.push(getHeritageClauseDeclaration(value, sourceFile));
1317c804472Sopenharmony_ci    } else if (isConstructorDeclaration(value)) {
1327c804472Sopenharmony_ci      interfaceConstructors.push(getConstructorDeclaration(value, sourceFile));
1337c804472Sopenharmony_ci    } else if (isCallSignatureDeclaration(value)) {
1347c804472Sopenharmony_ci      callSignature.push(getCallSignatureDeclaration(value, sourceFile));
1357c804472Sopenharmony_ci    } else if (isTypeParameterDeclaration(value)) {
1367c804472Sopenharmony_ci      typeParameters.push(getTypeParameterDeclaration(value, sourceFile));
1377c804472Sopenharmony_ci    } else if (isIndexSignatureDeclaration(value)) {
1387c804472Sopenharmony_ci      indexSignature.push(getIndexSignatureDeclaration(value, sourceFile));
1397c804472Sopenharmony_ci    } else {
1407c804472Sopenharmony_ci      console.log('--------------------------- uncaught interface type start -----------------------');
1417c804472Sopenharmony_ci      console.log('interfaceName: ' + interfaceName);
1427c804472Sopenharmony_ci      console.log(value);
1437c804472Sopenharmony_ci      console.log('--------------------------- uncaught interface type end -----------------------');
1447c804472Sopenharmony_ci    }
1457c804472Sopenharmony_ci  });
1467c804472Sopenharmony_ci  return {
1477c804472Sopenharmony_ci    interfaceName,
1487c804472Sopenharmony_ci    typeParameters,
1497c804472Sopenharmony_ci    heritageClauses,
1507c804472Sopenharmony_ci    interfaceConstructors,
1517c804472Sopenharmony_ci    interfaceMethodSignature,
1527c804472Sopenharmony_ci    interfacePropertySignatures,
1537c804472Sopenharmony_ci    callSignatures: callSignature,
1547c804472Sopenharmony_ci    indexSignature
1557c804472Sopenharmony_ci  };
1567c804472Sopenharmony_ci}
157