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