1/* 2 * Copyright (c) 2024-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import ts from 'ohos-typescript'; 17import { LineColPosition } from '../../base/Position'; 18import { ImportInfo } from '../ArkImport'; 19import { buildModifiers } from './builderUtils'; 20import { IRUtils } from '../../common/IRUtils'; 21import { ArkFile } from '../ArkFile'; 22 23export function buildImportInfo(node: ts.ImportEqualsDeclaration | ts.ImportDeclaration, sourceFile: ts.SourceFile, arkFile: ArkFile): ImportInfo[] { 24 if (ts.isImportDeclaration(node)) { 25 return buildImportDeclarationNode(node, sourceFile, arkFile); 26 } else if (ts.isImportEqualsDeclaration(node)) { 27 return buildImportEqualsDeclarationNode(node, sourceFile, arkFile); 28 } 29 return []; 30} 31 32function buildImportDeclarationNode(node: ts.ImportDeclaration, sourceFile: ts.SourceFile, arkFile: ArkFile): ImportInfo[] { 33 const originTsPosition = LineColPosition.buildFromNode(node, sourceFile); 34 const tsSourceCode = node.getText(sourceFile); 35 36 let importInfos: ImportInfo[] = []; 37 let importFrom: string = ''; 38 if (ts.isStringLiteral(node.moduleSpecifier)) { 39 importFrom = node.moduleSpecifier.text; 40 } 41 42 let modifiers = 0; 43 if (node.modifiers) { 44 modifiers = buildModifiers(node); 45 } 46 47 // just like: import '../xxx' 48 if (!node.importClause) { 49 let importClauseName = ''; 50 let importType = ''; 51 let importInfo = new ImportInfo(); 52 importInfo.build(importClauseName, importType, importFrom, originTsPosition, modifiers); 53 importInfo.setTsSourceCode(tsSourceCode); 54 IRUtils.setComments(importInfo, node, sourceFile, arkFile.getScene().getOptions()); 55 importInfos.push(importInfo); 56 } 57 58 //just like: import fs from 'fs' 59 if (node.importClause && node.importClause.name && ts.isIdentifier(node.importClause.name)) { 60 let importClauseName = node.importClause.name.text; 61 const pos = LineColPosition.buildFromNode(node.importClause.name, sourceFile); 62 let importType = 'Identifier'; 63 let importInfo = new ImportInfo(); 64 importInfo.build(importClauseName, importType, importFrom, pos, modifiers); 65 importInfo.setTsSourceCode(tsSourceCode); 66 IRUtils.setComments(importInfo, node, sourceFile, arkFile.getScene().getOptions()); 67 importInfos.push(importInfo); 68 } 69 70 // just like: import {xxx} from './yyy' 71 if (node.importClause && node.importClause.namedBindings && ts.isNamedImports(node.importClause.namedBindings)) { 72 let importType = 'NamedImports'; 73 if (node.importClause.namedBindings.elements) { 74 node.importClause.namedBindings.elements.forEach(element => { 75 if (element.name && ts.isIdentifier(element.name)) { 76 let importClauseName = element.name.text; 77 const pos = LineColPosition.buildFromNode(element, sourceFile); 78 if (element.propertyName && ts.isIdentifier(element.propertyName)) { 79 let importInfo = new ImportInfo(); 80 importInfo.build(importClauseName, importType, importFrom, pos, modifiers, element.propertyName.text); 81 importInfo.setTsSourceCode(tsSourceCode); 82 IRUtils.setComments(importInfo, node, sourceFile, arkFile.getScene().getOptions()); 83 importInfos.push(importInfo); 84 } else { 85 let importInfo = new ImportInfo(); 86 importInfo.build(importClauseName, importType, importFrom, pos, modifiers); 87 importInfo.setTsSourceCode(tsSourceCode); 88 IRUtils.setComments(importInfo, node, sourceFile, arkFile.getScene().getOptions()); 89 importInfos.push(importInfo); 90 } 91 } 92 }); 93 } 94 } 95 96 // just like: import * as ts from 'ohos-typescript' 97 if (node.importClause && node.importClause.namedBindings && ts.isNamespaceImport(node.importClause.namedBindings)) { 98 let importType = 'NamespaceImport'; 99 if (node.importClause.namedBindings.name && ts.isIdentifier(node.importClause.namedBindings.name)) { 100 let importClauseName = node.importClause.namedBindings.name.text; 101 let importInfo = new ImportInfo(); 102 let nameBeforeAs = '*'; 103 const pos = LineColPosition.buildFromNode(node.importClause.namedBindings.name, sourceFile); 104 importInfo.build(importClauseName, importType, importFrom, pos, modifiers, nameBeforeAs); 105 importInfo.setTsSourceCode(tsSourceCode); 106 IRUtils.setComments(importInfo, node, sourceFile, arkFile.getScene().getOptions()); 107 importInfos.push(importInfo); 108 } 109 } 110 111 return importInfos; 112} 113 114function buildImportEqualsDeclarationNode(node: ts.ImportEqualsDeclaration, sourceFile: ts.SourceFile, arkFile: ArkFile): ImportInfo[] { 115 const originTsPosition = LineColPosition.buildFromNode(node, sourceFile); 116 const tsSourceCode = node.getText(sourceFile); 117 118 let importInfos: ImportInfo[] = []; 119 let importType = 'EqualsImport'; 120 let modifiers = 0; 121 if (node.modifiers) { 122 modifiers = buildModifiers(node); 123 } 124 if ( 125 node.moduleReference && 126 ts.isExternalModuleReference(node.moduleReference) && 127 node.moduleReference.expression && 128 ts.isStringLiteral(node.moduleReference.expression) 129 ) { 130 let importFrom = node.moduleReference.expression.text; 131 let importClauseName = node.name.text; 132 let importInfo = new ImportInfo(); 133 importInfo.build(importClauseName, importType, importFrom, originTsPosition, modifiers); 134 importInfo.setTsSourceCode(tsSourceCode); 135 IRUtils.setComments(importInfo, node, sourceFile, arkFile.getScene().getOptions()); 136 importInfos.push(importInfo); 137 } 138 return importInfos; 139} 140