diff --git a/compiler/main.js b/compiler/main.js index 90ad08c0c591bf3eaeb175d203106a3f14de4d90..45e9319dc4238fc569c09eb0d17f53fc6f5cd082 100644 --- a/compiler/main.js +++ b/compiler/main.js @@ -96,6 +96,7 @@ function initProjectConfig(projectConfig) { projectConfig.packageJson = 'package.json'; projectConfig.packageManagerType = 'npm'; projectConfig.cardEntryObj = {}; + projectConfig.compilerTypes = []; } function loadEntryObj(projectConfig) { diff --git a/compiler/src/ets_checker.ts b/compiler/src/ets_checker.ts index 7c8cb1dc713c778c201f570a2b4493161d0ad8b0..d57bac66781b5512d0312f880f8e21725b075892 100644 --- a/compiler/src/ets_checker.ts +++ b/compiler/src/ets_checker.ts @@ -104,7 +104,8 @@ function setCompilerOptions(resolveModulePaths: string[]) { }, 'lib': [ 'lib.es2020.d.ts' - ] + ], + 'types': projectConfig.compilerTypes }); if (projectConfig.compileMode === ESMODULE) { Object.assign(compilerOptions, { @@ -152,6 +153,7 @@ export function createLanguageService(rootFileNames: string[], resolveModulePath readFile: ts.sys.readFile, readDirectory: ts.sys.readDirectory, resolveModuleNames: resolveModuleNames, + resolveTypeReferenceDirectives: resolveTypeReferenceDirectives, directoryExists: ts.sys.directoryExists, getDirectories: ts.sys.getDirectories, getTagNameNeededCheckByFile: (fileName, sourceFileName) => { @@ -368,6 +370,44 @@ function checkNeedUpdateFiles(file: string, needUpdate: NeedUpdateFlag, alreadyC } } +const moduleResolutionHost: ts.ModuleResolutionHost = { + fileExists(fileName: string): boolean { + return ts.sys.fileExists(fileName); + }, + readFile(fileName: string): string | undefined { + return ts.sys.readFile(fileName); + }, + realpath(path: string): string { + return ts.sys.realpath(path); + }, + trace(s: string): void { + console.info(s); + } +} + +export function resolveTypeReferenceDirectives(typeDirectiveNames: string[]): ts.ResolvedTypeReferenceDirective[] { + if (typeDirectiveNames.length === 0) { + return []; + } + + const resolvedTypeReferenceCache: ts.ResolvedTypeReferenceDirective[] = []; + const cache: Map = new Map(); + const containingFile: string = path.join(projectConfig.modulePath, "build-profile.json5"); + + for (const typeName of typeDirectiveNames) { + if (!cache.has(typeName)) { + const resolvedFile = ts.resolveTypeReferenceDirective(typeName, containingFile, compilerOptions, moduleResolutionHost); + if (!resolvedFile || !resolvedFile.resolvedTypeReferenceDirective) { + logger.error('\u001b[31m', `ArkTS:Caonnot find type definition file for: ${typeName}\n`); + } + const result: ts.ResolvedTypeReferenceDirective = resolvedFile.resolvedTypeReferenceDirective; + cache.set(typeName, result); + resolvedTypeReferenceCache.push(result); + } + } + return resolvedTypeReferenceCache; +} + const resolvedModulesCache: Map = new Map(); export function resolveModuleNames(moduleNames: string[], containingFile: string): ts.ResolvedModuleFull[] { @@ -376,17 +416,7 @@ export function resolveModuleNames(moduleNames: string[], containingFile: string || !(resolvedModulesCache[path.resolve(containingFile)] && resolvedModulesCache[path.resolve(containingFile)].length === moduleNames.length)) { for (const moduleName of moduleNames) { - const result = ts.resolveModuleName(moduleName, containingFile, compilerOptions, { - fileExists(fileName: string): boolean { - return ts.sys.fileExists(fileName); - }, - readFile(fileName: string): string | undefined { - return ts.sys.readFile(fileName); - }, - realpath(path: string): string { - return ts.sys.realpath(path); - } - }); + const result = ts.resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost); if (result.resolvedModule) { if (result.resolvedModule.resolvedFileName && path.extname(result.resolvedModule.resolvedFileName) === EXTNAME_JS) { @@ -541,6 +571,7 @@ export function createWatchCompilerHost(rootFileNames: string[], return fs.readFileSync(fileName).toString(); }; host.resolveModuleNames = resolveModuleNames; + host.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives; return host; } diff --git a/compiler/src/fast_build/ets_ui/rollup-plugin-ets-typescript.ts b/compiler/src/fast_build/ets_ui/rollup-plugin-ets-typescript.ts index 40db5b0831e17fff0a931ce126c64ac82016f2a6..28ba60e1085b388a00b90866db6cd960026f6de6 100644 --- a/compiler/src/fast_build/ets_ui/rollup-plugin-ets-typescript.ts +++ b/compiler/src/fast_build/ets_ui/rollup-plugin-ets-typescript.ts @@ -53,7 +53,8 @@ import { import { appComponentCollection, compilerOptions as etsCheckerCompilerOptions, - resolveModuleNames + resolveModuleNames, + resolveTypeReferenceDirectives } from '../../ets_checker'; import { CUSTOM_BUILDER_METHOD, @@ -167,6 +168,7 @@ compilerHost.writeFile = () => {}; compilerHost.resolveModuleNames = resolveModuleNames; compilerHost.getCurrentDirectory = () => process.cwd(); compilerHost.getDefaultLibFileName = options => ts.getDefaultLibFilePath(options); +compilerHost.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives; async function transform(code: string, id: string) { if (!filter(id)) {