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 { ClassDeclaration, SourceFile } from 'typescript';
177c804472Sopenharmony_ciimport {
187c804472Sopenharmony_ci  isConstructorDeclaration,
197c804472Sopenharmony_ci  isGetAccessor,
207c804472Sopenharmony_ci  isMethodDeclaration,
217c804472Sopenharmony_ci  isPropertyDeclaration,
227c804472Sopenharmony_ci  isTypeParameterDeclaration,
237c804472Sopenharmony_ci  SyntaxKind
247c804472Sopenharmony_ci} from 'typescript';
257c804472Sopenharmony_ciimport { getExportKeyword } from '../common/commonUtils';
267c804472Sopenharmony_ciimport { getConstructorDeclaration } from './constructorDeclaration';
277c804472Sopenharmony_ciimport type { ConstructorEntity } from './constructorDeclaration';
287c804472Sopenharmony_ciimport { getHeritageClauseDeclaration } from './heritageClauseDeclaration';
297c804472Sopenharmony_ciimport type { HeritageClauseEntity } from './heritageClauseDeclaration';
307c804472Sopenharmony_ciimport { getMethodDeclaration } from './methodDeclaration';
317c804472Sopenharmony_ciimport type { MethodEntity, StaticMethodEntity } from './methodDeclaration';
327c804472Sopenharmony_ciimport { getGetDeclaration, getPropertyDeclaration } from './propertyDeclaration';
337c804472Sopenharmony_ciimport type { PropertyEntity } from './propertyDeclaration';
347c804472Sopenharmony_ciimport { getTypeParameterDeclaration } from './typeParameterDeclaration';
357c804472Sopenharmony_ciimport type { TypeParameterEntity } from './typeParameterDeclaration';
367c804472Sopenharmony_ci
377c804472Sopenharmony_ciinterface SubstepClassEntity {
387c804472Sopenharmony_ci  className: string;
397c804472Sopenharmony_ci  typeParameters: Array<TypeParameterEntity>;
407c804472Sopenharmony_ci  classConstructor: Array<Array<ConstructorEntity>>;
417c804472Sopenharmony_ci  classMethod: Map<string, Array<MethodEntity>>;
427c804472Sopenharmony_ci  classProperty: Array<PropertyEntity>;
437c804472Sopenharmony_ci  staticMethods: Array<StaticMethodEntity>;
447c804472Sopenharmony_ci}
457c804472Sopenharmony_ci
467c804472Sopenharmony_ciexport interface ClassEntity {
477c804472Sopenharmony_ci  className: string;
487c804472Sopenharmony_ci  typeParameters: Array<TypeParameterEntity>;
497c804472Sopenharmony_ci  heritageClauses: Array<HeritageClauseEntity>;
507c804472Sopenharmony_ci  classConstructor: Array<Array<ConstructorEntity>>;
517c804472Sopenharmony_ci  classMethod: Map<string, Array<MethodEntity>>;
527c804472Sopenharmony_ci  classProperty: Array<PropertyEntity>;
537c804472Sopenharmony_ci  exportModifiers: Array<number>;
547c804472Sopenharmony_ci  staticMethods: Array<StaticMethodEntity>;
557c804472Sopenharmony_ci}
567c804472Sopenharmony_ci
577c804472Sopenharmony_ci/**
587c804472Sopenharmony_ci * get class info
597c804472Sopenharmony_ci * @param classNode
607c804472Sopenharmony_ci * @param sourceFile
617c804472Sopenharmony_ci * @returns
627c804472Sopenharmony_ci */
637c804472Sopenharmony_ciexport function getClassDeclaration(classNode: ClassDeclaration, sourceFile: SourceFile): ClassEntity {
647c804472Sopenharmony_ci  let exportModifiers: Array<number> = [];
657c804472Sopenharmony_ci  if (classNode.modifiers !== undefined) {
667c804472Sopenharmony_ci    exportModifiers = getExportKeyword(classNode.modifiers);
677c804472Sopenharmony_ci  }
687c804472Sopenharmony_ci
697c804472Sopenharmony_ci  const heritageClauses: Array<HeritageClauseEntity> = [];
707c804472Sopenharmony_ci
717c804472Sopenharmony_ci  if (classNode.heritageClauses !== undefined) {
727c804472Sopenharmony_ci    classNode.heritageClauses.forEach(value => {
737c804472Sopenharmony_ci      heritageClauses.push(getHeritageClauseDeclaration(value, sourceFile));
747c804472Sopenharmony_ci    });
757c804472Sopenharmony_ci  }
767c804472Sopenharmony_ci
777c804472Sopenharmony_ci  const substepClassEntitys: SubstepClassEntity = substepGetClass(classNode, sourceFile);
787c804472Sopenharmony_ci  return {
797c804472Sopenharmony_ci    ...substepClassEntitys,
807c804472Sopenharmony_ci    exportModifiers,
817c804472Sopenharmony_ci    heritageClauses
827c804472Sopenharmony_ci  };
837c804472Sopenharmony_ci}
847c804472Sopenharmony_ci
857c804472Sopenharmony_ci/**
867c804472Sopenharmony_ci *get some class info
877c804472Sopenharmony_ci * @param classNode
887c804472Sopenharmony_ci * @param sourceFile
897c804472Sopenharmony_ci * @returns
907c804472Sopenharmony_ci */
917c804472Sopenharmony_cifunction substepGetClass(classNode: ClassDeclaration, sourceFile: SourceFile): SubstepClassEntity {
927c804472Sopenharmony_ci  const className = classNode.name === undefined ? '' : classNode.name.escapedText.toString();
937c804472Sopenharmony_ci  const classConstructor: Array<Array<ConstructorEntity>> = [];
947c804472Sopenharmony_ci  const classMethod: Map<string, Array<MethodEntity>> = new Map<string, Array<MethodEntity>>();
957c804472Sopenharmony_ci  const classProperty: Array<PropertyEntity> = [];
967c804472Sopenharmony_ci  const typeParameters: Array<TypeParameterEntity> = [];
977c804472Sopenharmony_ci  const staticMethods: Array<StaticMethodEntity> = [];
987c804472Sopenharmony_ci  classNode.members.forEach(value => {
997c804472Sopenharmony_ci    if (isMethodDeclaration(value)) {
1007c804472Sopenharmony_ci      const methodEntity = getMethodDeclaration(value, sourceFile);
1017c804472Sopenharmony_ci      if (methodEntity.modifiers.includes(SyntaxKind.StaticKeyword)) {
1027c804472Sopenharmony_ci        staticMethods.push({ className: className, methodEntity: methodEntity });
1037c804472Sopenharmony_ci      } else {
1047c804472Sopenharmony_ci        if (classMethod.get(methodEntity.functionName.name) !== undefined) {
1057c804472Sopenharmony_ci          classMethod.get(methodEntity.functionName.name)?.push(methodEntity);
1067c804472Sopenharmony_ci        } else {
1077c804472Sopenharmony_ci          const methodArray: Array<MethodEntity> = [];
1087c804472Sopenharmony_ci          methodArray.push(methodEntity);
1097c804472Sopenharmony_ci          classMethod.set(methodEntity.functionName.name, methodArray);
1107c804472Sopenharmony_ci        }
1117c804472Sopenharmony_ci      }
1127c804472Sopenharmony_ci    } else if (isPropertyDeclaration(value)) {
1137c804472Sopenharmony_ci      classProperty.push(getPropertyDeclaration(value, sourceFile));
1147c804472Sopenharmony_ci    } else if (isConstructorDeclaration(value)) {
1157c804472Sopenharmony_ci      classConstructor.push(getConstructorDeclaration(value, sourceFile));
1167c804472Sopenharmony_ci    } else if (isTypeParameterDeclaration(value)) {
1177c804472Sopenharmony_ci      typeParameters.push(getTypeParameterDeclaration(value, sourceFile));
1187c804472Sopenharmony_ci    } else if (isGetAccessor(value)) {
1197c804472Sopenharmony_ci      classProperty.push(getGetDeclaration(value, sourceFile));
1207c804472Sopenharmony_ci    } else {
1217c804472Sopenharmony_ci      console.log('--------------------------- uncaught class type start -----------------------');
1227c804472Sopenharmony_ci      console.log('className: ' + className);
1237c804472Sopenharmony_ci      console.log(value);
1247c804472Sopenharmony_ci      console.log('--------------------------- uncaught class type end -----------------------');
1257c804472Sopenharmony_ci    }
1267c804472Sopenharmony_ci  });
1277c804472Sopenharmony_ci  return {
1287c804472Sopenharmony_ci    className,
1297c804472Sopenharmony_ci    typeParameters,
1307c804472Sopenharmony_ci    classConstructor,
1317c804472Sopenharmony_ci    classMethod,
1327c804472Sopenharmony_ci    classProperty,
1337c804472Sopenharmony_ci    staticMethods
1347c804472Sopenharmony_ci  };
1357c804472Sopenharmony_ci}
136