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 {
177c804472Sopenharmony_ci  ExportAssignment,
187c804472Sopenharmony_ci  ExportDeclaration,
197c804472Sopenharmony_ci  ImportDeclaration,
207c804472Sopenharmony_ci  ImportEqualsDeclaration,
217c804472Sopenharmony_ci  Node,
227c804472Sopenharmony_ci  SourceFile
237c804472Sopenharmony_ci} from 'typescript';
247c804472Sopenharmony_ciimport { isImportDeclaration } from 'typescript';
257c804472Sopenharmony_ci
267c804472Sopenharmony_ci/**
277c804472Sopenharmony_ci * get current sourceFile all imports
287c804472Sopenharmony_ci * @param sourceFile
297c804472Sopenharmony_ci * @returns
307c804472Sopenharmony_ci */
317c804472Sopenharmony_ciexport function getImportDeclarationArray(sourceFile: SourceFile): Array<ImportElementEntity> {
327c804472Sopenharmony_ci  const importDeclarations: Array<ImportElementEntity> = [];
337c804472Sopenharmony_ci  sourceFile.forEachChild(node => {
347c804472Sopenharmony_ci    if (isImportDeclaration(node)) {
357c804472Sopenharmony_ci      importDeclarations.push(getImportDeclaration(node, sourceFile));
367c804472Sopenharmony_ci    }
377c804472Sopenharmony_ci  });
387c804472Sopenharmony_ci  return importDeclarations;
397c804472Sopenharmony_ci}
407c804472Sopenharmony_ci
417c804472Sopenharmony_ci/**
427c804472Sopenharmony_ci * get module inner import info
437c804472Sopenharmony_ci * @param importEqualNode
447c804472Sopenharmony_ci * @param sourceFile
457c804472Sopenharmony_ci * @returns
467c804472Sopenharmony_ci */
477c804472Sopenharmony_ciexport function getModuleImportEqual(
487c804472Sopenharmony_ci  importEqualNode: ImportEqualsDeclaration,
497c804472Sopenharmony_ci  sourceFile: SourceFile
507c804472Sopenharmony_ci): ImportEuqalEntity {
517c804472Sopenharmony_ci  const fileText = sourceFile.getFullText();
527c804472Sopenharmony_ci  const textRange = importEqualNode.moduleReference;
537c804472Sopenharmony_ci  return {
547c804472Sopenharmony_ci    importEqualName: importEqualNode.name.escapedText.toString(),
557c804472Sopenharmony_ci    importEqualTypeName: fileText.slice(textRange.pos, textRange.end).trim(),
567c804472Sopenharmony_ci    importEqualTypeKind: importEqualNode.moduleReference.kind
577c804472Sopenharmony_ci  };
587c804472Sopenharmony_ci}
597c804472Sopenharmony_ci
607c804472Sopenharmony_ci/**
617c804472Sopenharmony_ci * get export info
627c804472Sopenharmony_ci * @param exportNode
637c804472Sopenharmony_ci * @param sourceFile
647c804472Sopenharmony_ci * @returns
657c804472Sopenharmony_ci */
667c804472Sopenharmony_ciexport function getExportDeclaration(exportNode: ExportDeclaration, sourceFile: SourceFile): string {
677c804472Sopenharmony_ci  return sourceFile.text.substring(exportNode.pos, exportNode.end).trim();
687c804472Sopenharmony_ci}
697c804472Sopenharmony_ci
707c804472Sopenharmony_ci/**
717c804472Sopenharmony_ci * get import info
727c804472Sopenharmony_ci * @param node
737c804472Sopenharmony_ci * @param sourceFile
747c804472Sopenharmony_ci * @returns
757c804472Sopenharmony_ci */
767c804472Sopenharmony_ciexport function getImportDeclaration(node: Node, sourceFile: SourceFile): ImportElementEntity {
777c804472Sopenharmony_ci  let importElements = '';
787c804472Sopenharmony_ci  const importNode = node as ImportDeclaration;
797c804472Sopenharmony_ci  const fileText = sourceFile.getFullText();
807c804472Sopenharmony_ci  const moduleSpecifier = importNode.moduleSpecifier;
817c804472Sopenharmony_ci  const importPath = fileText.substring(moduleSpecifier.pos, moduleSpecifier.end).trim();
827c804472Sopenharmony_ci  const importClause = importNode.importClause;
837c804472Sopenharmony_ci  if (importClause !== undefined) {
847c804472Sopenharmony_ci    importElements = fileText.substring(importClause.pos, importClause.end).trim();
857c804472Sopenharmony_ci    if (importElements.startsWith('type ')) {
867c804472Sopenharmony_ci      importElements = importElements.replace('type ', '');
877c804472Sopenharmony_ci    }
887c804472Sopenharmony_ci  }
897c804472Sopenharmony_ci
907c804472Sopenharmony_ci  return {
917c804472Sopenharmony_ci    importPath: importPath,
927c804472Sopenharmony_ci    importElements: importElements
937c804472Sopenharmony_ci  };
947c804472Sopenharmony_ci}
957c804472Sopenharmony_ci
967c804472Sopenharmony_ci/**
977c804472Sopenharmony_ci * get export info
987c804472Sopenharmony_ci * @param exportAssigment
997c804472Sopenharmony_ci * @param sourceFile
1007c804472Sopenharmony_ci * @returns
1017c804472Sopenharmony_ci */
1027c804472Sopenharmony_ciexport function getExportAssignment(exportAssigment: ExportAssignment, sourceFile: SourceFile): Array<string> {
1037c804472Sopenharmony_ci  const exportAssignments: Array<string> = [];
1047c804472Sopenharmony_ci  if (exportAssigment.expression !== undefined) {
1057c804472Sopenharmony_ci    exportAssignments.push(
1067c804472Sopenharmony_ci      sourceFile.text.substring(exportAssigment.expression.pos, exportAssigment.expression.end).trim()
1077c804472Sopenharmony_ci    );
1087c804472Sopenharmony_ci  }
1097c804472Sopenharmony_ci  return exportAssignments;
1107c804472Sopenharmony_ci}
1117c804472Sopenharmony_ci
1127c804472Sopenharmony_ciexport interface ImportElementEntity {
1137c804472Sopenharmony_ci  importPath: string;
1147c804472Sopenharmony_ci  importElements: string;
1157c804472Sopenharmony_ci}
1167c804472Sopenharmony_ci
1177c804472Sopenharmony_ciexport interface ExportElementEntity {
1187c804472Sopenharmony_ci  exportName: string;
1197c804472Sopenharmony_ci}
1207c804472Sopenharmony_ci
1217c804472Sopenharmony_ciexport interface ImportEuqalEntity {
1227c804472Sopenharmony_ci  importEqualName: string;
1237c804472Sopenharmony_ci  importEqualTypeName: string;
1247c804472Sopenharmony_ci  importEqualTypeKind: number;
1257c804472Sopenharmony_ci}
126