mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Use the module cache to resolve non relative module name as well
This commit is contained in:
@@ -3296,7 +3296,7 @@
|
||||
"category": "Message",
|
||||
"code": 6146
|
||||
},
|
||||
"Resolution for module '{0}' was found in cache.": {
|
||||
"Resolution for module '{0}' was found in cache from location '{1}'.": {
|
||||
"category": "Message",
|
||||
"code": 6147
|
||||
},
|
||||
|
||||
@@ -335,8 +335,20 @@ namespace ts {
|
||||
}
|
||||
|
||||
export function createModuleResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string): ModuleResolutionCache {
|
||||
const directoryToModuleNameMap = createMap<Map<ResolvedModuleWithFailedLookupLocations>>();
|
||||
const moduleNameToDirectoryMap = createMap<PerModuleNameCache>();
|
||||
return createModuleResolutionCacheWithMaps(
|
||||
createMap<Map<ResolvedModuleWithFailedLookupLocations>>(),
|
||||
createMap<PerModuleNameCache>(),
|
||||
currentDirectory,
|
||||
getCanonicalFileName
|
||||
);
|
||||
}
|
||||
|
||||
/*@internal*/
|
||||
export function createModuleResolutionCacheWithMaps(
|
||||
directoryToModuleNameMap: Map<Map<ResolvedModuleWithFailedLookupLocations>>,
|
||||
moduleNameToDirectoryMap: Map<PerModuleNameCache>,
|
||||
currentDirectory: string,
|
||||
getCanonicalFileName: GetCanonicalFileName): ModuleResolutionCache {
|
||||
|
||||
return { getOrCreateCacheForDirectory, getOrCreateCacheForModuleName };
|
||||
|
||||
@@ -445,7 +457,7 @@ namespace ts {
|
||||
|
||||
if (result) {
|
||||
if (traceEnabled) {
|
||||
trace(host, Diagnostics.Resolution_for_module_0_was_found_in_cache, moduleName);
|
||||
trace(host, Diagnostics.Resolution_for_module_0_was_found_in_cache_from_location_1, moduleName, containingDirectory);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -1187,7 +1199,7 @@ namespace ts {
|
||||
const result = cache && cache.get(containingDirectory);
|
||||
if (result) {
|
||||
if (traceEnabled) {
|
||||
trace(host, Diagnostics.Resolution_for_module_0_was_found_in_cache, moduleName);
|
||||
trace(host, Diagnostics.Resolution_for_module_0_was_found_in_cache_from_location_1, moduleName, containingDirectory);
|
||||
}
|
||||
return { value: result.resolvedModule && { path: result.resolvedModule.resolvedFileName, extension: result.resolvedModule.extension, packageId: result.resolvedModule.packageId } };
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ namespace ts {
|
||||
|
||||
export interface ResolutionCacheHost extends ModuleResolutionHost {
|
||||
toPath(fileName: string): Path;
|
||||
getCanonicalFileName: GetCanonicalFileName;
|
||||
getCompilationSettings(): CompilerOptions;
|
||||
watchDirectoryOfFailedLookupLocation(directory: string, cb: DirectoryWatcherCallback, flags: WatchDirectoryFlags): FileWatcher;
|
||||
onInvalidatedResolution(): void;
|
||||
@@ -78,18 +79,25 @@ namespace ts {
|
||||
let filesWithInvalidatedResolutions: Map<true> | undefined;
|
||||
let allFilesHaveInvalidatedResolution = false;
|
||||
|
||||
const getCurrentDirectory = memoize(() => resolutionHost.getCurrentDirectory());
|
||||
const cachedDirectoryStructureHost = resolutionHost.getCachedDirectoryStructureHost();
|
||||
|
||||
// The resolvedModuleNames and resolvedTypeReferenceDirectives are the cache of resolutions per file.
|
||||
// The key in the map is source file's path.
|
||||
// The values are Map of resolutions with key being name lookedup.
|
||||
const resolvedModuleNames = createMap<Map<ResolvedModuleWithFailedLookupLocations>>();
|
||||
const perDirectoryResolvedModuleNames = createMap<Map<ResolvedModuleWithFailedLookupLocations>>();
|
||||
const nonRelaticeModuleNameCache = createMap<PerModuleNameCache>();
|
||||
const moduleResolutionCache = createModuleResolutionCacheWithMaps(
|
||||
perDirectoryResolvedModuleNames,
|
||||
nonRelaticeModuleNameCache,
|
||||
getCurrentDirectory(),
|
||||
resolutionHost.getCanonicalFileName
|
||||
);
|
||||
|
||||
const resolvedTypeReferenceDirectives = createMap<Map<ResolvedTypeReferenceDirectiveWithFailedLookupLocations>>();
|
||||
const perDirectoryResolvedTypeReferenceDirectives = createMap<Map<ResolvedTypeReferenceDirectiveWithFailedLookupLocations>>();
|
||||
|
||||
const getCurrentDirectory = memoize(() => resolutionHost.getCurrentDirectory());
|
||||
const cachedDirectoryStructureHost = resolutionHost.getCachedDirectoryStructureHost();
|
||||
|
||||
/**
|
||||
* These are the extensions that failed lookup files will have by default,
|
||||
* any other extension of failed lookup will be store that path in custom failed lookup path
|
||||
@@ -173,6 +181,7 @@ namespace ts {
|
||||
|
||||
function clearPerDirectoryResolutions() {
|
||||
perDirectoryResolvedModuleNames.clear();
|
||||
nonRelaticeModuleNameCache.clear();
|
||||
perDirectoryResolvedTypeReferenceDirectives.clear();
|
||||
}
|
||||
|
||||
@@ -189,7 +198,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
function resolveModuleName(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations {
|
||||
const primaryResult = ts.resolveModuleName(moduleName, containingFile, compilerOptions, host);
|
||||
const primaryResult = ts.resolveModuleName(moduleName, containingFile, compilerOptions, host, moduleResolutionCache);
|
||||
// return result immediately only if global cache support is not enabled or if it is .ts, .tsx or .d.ts
|
||||
if (!resolutionHost.getGlobalCache) {
|
||||
return primaryResult;
|
||||
|
||||
@@ -7016,9 +7016,13 @@ namespace ts.projectSystem {
|
||||
return foundModule;
|
||||
}
|
||||
|
||||
function getExpectedMissedLocationResolutionTrace(host: TestServerHost, expectedTrace: string[], dirPath: string, module: FileOrFolder, moduleName: string, useNodeModules: boolean) {
|
||||
function getExpectedMissedLocationResolutionTrace(host: TestServerHost, expectedTrace: string[], dirPath: string, module: FileOrFolder, moduleName: string, useNodeModules: boolean, cacheLocation?: string) {
|
||||
let foundModule = false;
|
||||
forEachAncestorDirectory(dirPath, dirPath => {
|
||||
if (dirPath === cacheLocation) {
|
||||
return foundModule;
|
||||
}
|
||||
|
||||
const directory = useNodeModules ? combinePaths(dirPath, nodeModules) : dirPath;
|
||||
if (useNodeModules && !foundModule && !host.directoryExists(directory)) {
|
||||
expectedTrace.push(`Directory '${directory}' does not exist, skipping all lookups in it.`);
|
||||
@@ -7043,8 +7047,10 @@ namespace ts.projectSystem {
|
||||
);
|
||||
}
|
||||
|
||||
function getExpectedResolutionTraceFooter(expectedTrace: string[], module: FileOrFolder, moduleName: string, addRealPathTrace: boolean) {
|
||||
expectedTrace.push(`File '${module.path}' exist - use it as a name resolution result.`);
|
||||
function getExpectedResolutionTraceFooter(expectedTrace: string[], module: FileOrFolder, moduleName: string, addRealPathTrace: boolean, ignoreModuleFileFound?: boolean) {
|
||||
if (!ignoreModuleFileFound) {
|
||||
expectedTrace.push(`File '${module.path}' exist - use it as a name resolution result.`);
|
||||
}
|
||||
if (addRealPathTrace) {
|
||||
expectedTrace.push(`Resolving real path for '${module.path}', result '${module.path}'.`);
|
||||
}
|
||||
@@ -7067,6 +7073,15 @@ namespace ts.projectSystem {
|
||||
return expectedTrace;
|
||||
}
|
||||
|
||||
function getExpectedNonRelativeModuleResolutionFromCacheTrace(host: TestServerHost, file: FileOrFolder, module: FileOrFolder, moduleName: string, cacheLocation: string, expectedTrace: string[] = []) {
|
||||
getExpectedResolutionTraceHeader(expectedTrace, file, moduleName);
|
||||
expectedTrace.push(`Loading module '${moduleName}' from 'node_modules' folder, target file type 'TypeScript'.`);
|
||||
getExpectedMissedLocationResolutionTrace(host, expectedTrace, getDirectoryPath(file.path), module, moduleName, /*useNodeModules*/ true, cacheLocation);
|
||||
expectedTrace.push(`Resolution for module '${moduleName}' was found in cache from location '${cacheLocation}'.`);
|
||||
getExpectedResolutionTraceFooter(expectedTrace, module, moduleName, /*addRealPathTrace*/ true, /*ignoreModuleFileFound*/ true);
|
||||
return expectedTrace;
|
||||
}
|
||||
|
||||
function getExpectedReusingResolutionFromOldProgram(file: FileOrFolder, moduleName: string) {
|
||||
return `Reusing resolution of module '${moduleName}' to file '${file.path}' from old program.`;
|
||||
}
|
||||
@@ -7223,12 +7238,12 @@ namespace ts.projectSystem {
|
||||
service.openClientFile(file1.path);
|
||||
const expectedTrace = getExpectedNonRelativeModuleResolutionTrace(host, file1, module1, module1Name);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file1, module2, module2Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file2, module1, module1Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file2, module2, module2Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file4, module1, module1Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file4, module2, module2Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file3, module1, module1Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file3, module2, module2Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file2, module1, module1Name, getDirectoryPath(file1.path), expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file2, module2, module2Name, getDirectoryPath(file1.path), expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file4, module1, module1Name, `${projectLocation}/product`, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file4, module2, module2Name, `${projectLocation}/product`, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file3, module1, module1Name, getDirectoryPath(file4.path), expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file3, module2, module2Name, getDirectoryPath(file4.path), expectedTrace);
|
||||
verifyTrace(resolutionTrace, expectedTrace);
|
||||
verifyWatchesWithConfigFile(host, files, file1);
|
||||
|
||||
@@ -7266,12 +7281,12 @@ namespace ts.projectSystem {
|
||||
getExpectedRelativeModuleResolutionTrace(host, file1, file3, file3Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file1, module1, module1Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file1, module2, module2Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file2, module1, module1Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file2, module2, module2Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file4, module1, module1Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file4, module2, module2Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file3, module1, module1Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionTrace(host, file3, module2, module2Name, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file2, module1, module1Name, getDirectoryPath(file1.path), expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file2, module2, module2Name, getDirectoryPath(file1.path), expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file4, module1, module1Name, `${projectLocation}/product`, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file4, module2, module2Name, `${projectLocation}/product`, expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file3, module1, module1Name, getDirectoryPath(file4.path), expectedTrace);
|
||||
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file3, module2, module2Name, getDirectoryPath(file4.path), expectedTrace);
|
||||
verifyTrace(resolutionTrace, expectedTrace);
|
||||
|
||||
const currentDirectory = getDirectoryPath(file1.path);
|
||||
|
||||
@@ -210,6 +210,9 @@ namespace ts.server {
|
||||
/*@internal*/
|
||||
public directoryStructureHost: DirectoryStructureHost;
|
||||
|
||||
/*@internal*/
|
||||
public readonly getCanonicalFileName: GetCanonicalFileName;
|
||||
|
||||
/*@internal*/
|
||||
constructor(
|
||||
/*@internal*/readonly projectName: string,
|
||||
@@ -224,6 +227,7 @@ namespace ts.server {
|
||||
currentDirectory: string | undefined) {
|
||||
this.directoryStructureHost = directoryStructureHost;
|
||||
this.currentDirectory = this.projectService.getNormalizedAbsolutePath(currentDirectory || "");
|
||||
this.getCanonicalFileName = this.projectService.toCanonicalFileName;
|
||||
|
||||
this.cancellationToken = new ThrottledCancellationToken(this.projectService.cancellationToken, this.projectService.throttleWaitMilliseconds);
|
||||
if (!this.compilerOptions) {
|
||||
|
||||
@@ -27,9 +27,9 @@
|
||||
"File '/tslib.jsx' does not exist.",
|
||||
"======== Module name 'tslib' was not resolved. ========",
|
||||
"======== Resolving module 'tslib' from '/a/b/c/lib1.ts'. ========",
|
||||
"Resolution for module 'tslib' was found in cache.",
|
||||
"Resolution for module 'tslib' was found in cache from location '/a/b/c'.",
|
||||
"======== Module name 'tslib' was not resolved. ========",
|
||||
"======== Resolving module 'tslib' from '/a/b/c/lib2.ts'. ========",
|
||||
"Resolution for module 'tslib' was found in cache.",
|
||||
"Resolution for module 'tslib' was found in cache from location '/a/b/c'.",
|
||||
"======== Module name 'tslib' was not resolved. ========"
|
||||
]
|
||||
@@ -13,7 +13,7 @@
|
||||
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
|
||||
"Explicitly specified module resolution kind: 'NodeJs'.",
|
||||
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
|
||||
"Resolving real path for '/a/b/node_modules/foo.d.ts', result '/a/b/node_modules/foo.d.ts'.",
|
||||
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========"
|
||||
]
|
||||
@@ -13,7 +13,7 @@
|
||||
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
|
||||
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
|
||||
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
|
||||
"Resolving real path for '/a/b/node_modules/foo.d.ts', result '/a/b/node_modules/foo.d.ts'.",
|
||||
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========"
|
||||
]
|
||||
@@ -16,6 +16,6 @@
|
||||
"======== Module name 'foo' was successfully resolved to '/a/b/foo.d.ts'. ========",
|
||||
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
|
||||
"Explicitly specified module resolution kind: 'Classic'.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
|
||||
"======== Module name 'foo' was successfully resolved to '/a/b/foo.d.ts'. ========"
|
||||
]
|
||||
@@ -16,6 +16,6 @@
|
||||
"File '/a/b/c/d/foo.ts' does not exist.",
|
||||
"File '/a/b/c/d/foo.tsx' does not exist.",
|
||||
"File '/a/b/c/d/foo.d.ts' does not exist.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
|
||||
"======== Module name 'foo' was successfully resolved to '/a/b/foo.d.ts'. ========"
|
||||
]
|
||||
@@ -13,7 +13,7 @@
|
||||
"======== Resolving module 'foo' from '/a/b/lib.ts'. ========",
|
||||
"Explicitly specified module resolution kind: 'NodeJs'.",
|
||||
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b'.",
|
||||
"Resolving real path for '/a/b/node_modules/foo.d.ts', result '/a/b/node_modules/foo.d.ts'.",
|
||||
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========"
|
||||
]
|
||||
@@ -19,6 +19,6 @@
|
||||
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
|
||||
"Explicitly specified module resolution kind: 'NodeJs'.",
|
||||
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
|
||||
"======== Module name 'foo' was not resolved. ========"
|
||||
]
|
||||
@@ -17,6 +17,6 @@
|
||||
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
|
||||
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
|
||||
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
|
||||
"======== Module name 'foo' was not resolved. ========"
|
||||
]
|
||||
@@ -40,6 +40,6 @@
|
||||
"======== Module name 'foo' was not resolved. ========",
|
||||
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
|
||||
"Explicitly specified module resolution kind: 'Classic'.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
|
||||
"======== Module name 'foo' was not resolved. ========"
|
||||
]
|
||||
@@ -34,6 +34,6 @@
|
||||
"File '/a/b/c/d/foo.ts' does not exist.",
|
||||
"File '/a/b/c/d/foo.tsx' does not exist.",
|
||||
"File '/a/b/c/d/foo.d.ts' does not exist.",
|
||||
"Resolution for module 'foo' was found in cache.",
|
||||
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
|
||||
"======== Module name 'foo' was not resolved. ========"
|
||||
]
|
||||
@@ -16,7 +16,7 @@
|
||||
"Resolving real path for '/types/lib/index.d.ts', result '/types/lib/index.d.ts'.",
|
||||
"======== Type reference directive 'lib' was successfully resolved to '/types/lib/index.d.ts', primary: true. ========",
|
||||
"======== Resolving module './main' from '/mod1.ts'. ========",
|
||||
"Resolution for module './main' was found in cache.",
|
||||
"Resolution for module './main' was found in cache from location '/'.",
|
||||
"======== Module name './main' was successfully resolved to '/main.ts'. ========",
|
||||
"======== Resolving type reference directive 'lib', containing file '/__inferred type names__.ts', root directory '/types'. ========",
|
||||
"Resolving with primary search path '/types'.",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"Resolving real path for '/types/lib/index.d.ts', result '/types/lib/index.d.ts'.",
|
||||
"======== Type reference directive 'lib' was successfully resolved to '/types/lib/index.d.ts', primary: true. ========",
|
||||
"======== Resolving module './main' from '/mod1.ts'. ========",
|
||||
"Resolution for module './main' was found in cache.",
|
||||
"Resolution for module './main' was found in cache from location '/'.",
|
||||
"======== Module name './main' was successfully resolved to '/main.ts'. ========",
|
||||
"======== Resolving type reference directive 'lib', containing file '/__inferred type names__.ts', root directory '/types'. ========",
|
||||
"Resolving with primary search path '/types'.",
|
||||
|
||||
Reference in New Issue
Block a user