Fix incorrect mode calculation in typereference resolution (#60049)

This commit is contained in:
Sheetal Nandi
2024-09-24 13:23:41 -07:00
committed by GitHub
parent 9ad213fa8f
commit aa9df4d687

View File

@@ -2120,7 +2120,11 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
}
function getResolvedTypeReferenceDirectiveFromTypeReferenceDirective(typeRef: FileReference, sourceFile: SourceFile) {
return getResolvedTypeReferenceDirective(sourceFile, typeRef.fileName, typeRef.resolutionMode || sourceFile.impliedNodeFormat);
return getResolvedTypeReferenceDirective(
sourceFile,
typeRef.fileName,
getModeForTypeReferenceDirectiveInFile(typeRef, sourceFile),
);
}
function forEachResolvedModule(
@@ -2648,11 +2652,12 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
const moduleNames = getModuleNames(newSourceFile);
const resolutions = resolveModuleNamesReusingOldState(moduleNames, newSourceFile);
(resolvedModulesProcessing ??= new Map()).set(newSourceFile.path, resolutions);
const optionsForFile = getCompilerOptionsForFile(newSourceFile);
// ensure that module resolution results are still correct
const resolutionsChanged = hasChangesInResolutions(
moduleNames,
resolutions,
name => oldProgram.getResolvedModule(newSourceFile, name.text, getModeForUsageLocation(newSourceFile, name)),
name => oldProgram.getResolvedModule(newSourceFile, name.text, getModeForUsageLocationWorker(newSourceFile, name, optionsForFile)),
moduleResolutionIsEqualTo,
);
if (resolutionsChanged) structureIsReused = StructureIsReused.SafeModules;
@@ -2663,7 +2668,12 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
const typeReferenceResolutionsChanged = hasChangesInResolutions(
typesReferenceDirectives,
typeReferenceResolutions,
name => oldProgram.getResolvedTypeReferenceDirective(newSourceFile, getTypeReferenceResolutionName(name), getModeForFileReference(name, newSourceFile.impliedNodeFormat)),
name =>
oldProgram.getResolvedTypeReferenceDirective(
newSourceFile,
getTypeReferenceResolutionName(name),
getModeForTypeReferenceDirectiveInFile(name, newSourceFile),
),
typeDirectiveIsEqualTo,
);
if (typeReferenceResolutionsChanged) structureIsReused = StructureIsReused.SafeModules;
@@ -4044,8 +4054,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
const resolvedTypeReferenceDirective = resolutions[index];
// store resolved type directive on the file
const fileName = ref.fileName;
resolutionsInFile.set(fileName, getModeForFileReference(ref, file.impliedNodeFormat), resolvedTypeReferenceDirective);
const mode = ref.resolutionMode || getDefaultResolutionModeForFile(file);
const mode = getModeForTypeReferenceDirectiveInFile(ref, file);
resolutionsInFile.set(fileName, mode, resolvedTypeReferenceDirective);
processTypeReferenceDirective(fileName, mode, resolvedTypeReferenceDirective, { kind: FileIncludeKind.TypeReferenceDirective, file: file.path, index });
}
}
@@ -5224,6 +5234,10 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
function shouldTransformImportCall(sourceFile: SourceFile): boolean {
return shouldTransformImportCallWorker(sourceFile, getCompilerOptionsForFile(sourceFile));
}
function getModeForTypeReferenceDirectiveInFile(ref: FileReference, sourceFile: SourceFile) {
return ref.resolutionMode || getDefaultResolutionModeForFile(sourceFile);
}
}
function shouldTransformImportCallWorker(sourceFile: Pick<SourceFile, "fileName" | "impliedNodeFormat" | "packageJsonScope">, options: CompilerOptions): boolean {