Skip to content

Commit 524456f

Browse files
authored
Fix incorrect usage of getResolvedTypeReferenceDirectives and some refactoring (#58527)
1 parent d8fd9fd commit 524456f

File tree

10 files changed

+27
-22
lines changed

10 files changed

+27
-22
lines changed

src/compiler/program.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,11 +1243,11 @@ export function isReferenceFileLocation(location: ReferenceFileLocation | Synthe
12431243
export function getReferencedFileLocation(program: Program, ref: ReferencedFile): ReferenceFileLocation | SyntheticReferenceFileLocation {
12441244
const file = Debug.checkDefined(program.getSourceFileByPath(ref.file));
12451245
const { kind, index } = ref;
1246-
let pos: number | undefined, end: number | undefined, packageId: PackageId | undefined, resolutionMode: FileReference["resolutionMode"] | undefined;
1246+
let pos: number | undefined, end: number | undefined, packageId: PackageId | undefined;
12471247
switch (kind) {
12481248
case FileIncludeKind.Import:
12491249
const importLiteral = getModuleNameStringLiteralAt(file, index);
1250-
packageId = program.getResolvedModule(file, importLiteral.text, program.getModeForUsageLocation(file, importLiteral))?.resolvedModule?.packageId;
1250+
packageId = program.getResolvedModuleFromModuleSpecifier(importLiteral, file)?.resolvedModule?.packageId;
12511251
if (importLiteral.pos === -1) return { file, packageId, text: importLiteral.text };
12521252
pos = skipTrivia(file.text, importLiteral.pos);
12531253
end = importLiteral.end;
@@ -1256,8 +1256,8 @@ export function getReferencedFileLocation(program: Program, ref: ReferencedFile)
12561256
({ pos, end } = file.referencedFiles[index]);
12571257
break;
12581258
case FileIncludeKind.TypeReferenceDirective:
1259-
({ pos, end, resolutionMode } = file.typeReferenceDirectives[index]);
1260-
packageId = program.getResolvedTypeReferenceDirective(file, toFileNameLowerCase(file.typeReferenceDirectives[index].fileName), resolutionMode || file.impliedNodeFormat)?.resolvedTypeReferenceDirective?.packageId;
1259+
({ pos, end } = file.typeReferenceDirectives[index]);
1260+
packageId = program.getResolvedTypeReferenceDirectiveFromTypeReferenceDirective(file.typeReferenceDirectives[index], file)?.resolvedTypeReferenceDirective?.packageId;
12611261
break;
12621262
case FileIncludeKind.LibReferenceDirective:
12631263
({ pos, end } = file.libReferenceDirectives[index]);
@@ -1930,6 +1930,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
19301930
resolvedLibProcessing = undefined;
19311931
resolvedModulesProcessing = undefined;
19321932
resolvedTypeReferenceDirectiveNamesProcessing = undefined;
1933+
resolvedTypeReferenceDirectives = undefined!;
19331934

19341935
const program: Program = {
19351936
getRootFileNames: () => rootNames,
@@ -1961,7 +1962,6 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
19611962
getInstantiationCount: () => getTypeChecker().getInstantiationCount(),
19621963
getRelationCacheSizes: () => getTypeChecker().getRelationCacheSizes(),
19631964
getFileProcessingDiagnostics: () => fileProcessingDiagnostics,
1964-
getResolvedTypeReferenceDirectives: () => resolvedTypeReferenceDirectives,
19651965
getAutomaticTypeDirectiveNames: () => automaticTypeDirectiveNames!,
19661966
getAutomaticTypeDirectiveResolutions: () => automaticTypeDirectiveResolutions,
19671967
isSourceFileFromExternalLibrary,
@@ -1980,6 +1980,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
19801980
getResolvedModule,
19811981
getResolvedModuleFromModuleSpecifier,
19821982
getResolvedTypeReferenceDirective,
1983+
getResolvedTypeReferenceDirectiveFromTypeReferenceDirective,
19831984
forEachResolvedModule,
19841985
forEachResolvedTypeReferenceDirective,
19851986
getCurrentPackagesMap: () => packageMap,
@@ -2076,8 +2077,8 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
20762077
return resolvedModules?.get(file.path)?.get(moduleName, mode);
20772078
}
20782079

2079-
function getResolvedModuleFromModuleSpecifier(moduleSpecifier: StringLiteralLike): ResolvedModuleWithFailedLookupLocations | undefined {
2080-
const sourceFile = getSourceFileOfNode(moduleSpecifier);
2080+
function getResolvedModuleFromModuleSpecifier(moduleSpecifier: StringLiteralLike, sourceFile?: SourceFile): ResolvedModuleWithFailedLookupLocations | undefined {
2081+
sourceFile ??= getSourceFileOfNode(moduleSpecifier);
20812082
Debug.assertIsDefined(sourceFile, "`moduleSpecifier` must have a `SourceFile` ancestor. Use `program.getResolvedModule` instead to provide the containing file and resolution mode.");
20822083
return getResolvedModule(sourceFile, moduleSpecifier.text, getModeForUsageLocation(sourceFile, moduleSpecifier));
20832084
}
@@ -2086,6 +2087,10 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
20862087
return resolvedTypeReferenceDirectiveNames?.get(file.path)?.get(typeDirectiveName, mode);
20872088
}
20882089

2090+
function getResolvedTypeReferenceDirectiveFromTypeReferenceDirective(typeRef: FileReference, sourceFile: SourceFile) {
2091+
return getResolvedTypeReferenceDirective(sourceFile, toFileNameLowerCase(typeRef.fileName), typeRef.resolutionMode || sourceFile.impliedNodeFormat);
2092+
}
2093+
20892094
function forEachResolvedModule(
20902095
callback: (resolution: ResolvedModuleWithFailedLookupLocations, moduleName: string, mode: ResolutionMode, filePath: Path) => void,
20912096
file?: SourceFile,
@@ -2718,7 +2723,6 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
27182723
files = newSourceFiles;
27192724
fileReasons = oldProgram.getFileIncludeReasons();
27202725
fileProcessingDiagnostics = oldProgram.getFileProcessingDiagnostics();
2721-
resolvedTypeReferenceDirectives = oldProgram.getResolvedTypeReferenceDirectives();
27222726
automaticTypeDirectiveNames = oldProgram.getAutomaticTypeDirectiveNames();
27232727
automaticTypeDirectiveResolutions = oldProgram.getAutomaticTypeDirectiveResolutions();
27242728

src/compiler/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4679,10 +4679,12 @@ export interface Program extends ScriptReferenceHost {
46794679
/** @internal */
46804680
getResolvedModule(f: SourceFile, moduleName: string, mode: ResolutionMode): ResolvedModuleWithFailedLookupLocations | undefined;
46814681
/** @internal */
4682-
getResolvedModuleFromModuleSpecifier(moduleSpecifier: StringLiteralLike): ResolvedModuleWithFailedLookupLocations | undefined;
4682+
getResolvedModuleFromModuleSpecifier(moduleSpecifier: StringLiteralLike, sourceFile?: SourceFile): ResolvedModuleWithFailedLookupLocations | undefined;
46834683
/** @internal */
46844684
getResolvedTypeReferenceDirective(f: SourceFile, typeDirectiveName: string, mode: ResolutionMode): ResolvedTypeReferenceDirectiveWithFailedLookupLocations | undefined;
46854685
/** @internal */
4686+
getResolvedTypeReferenceDirectiveFromTypeReferenceDirective(typedRef: FileReference, sourceFile: SourceFile): ResolvedTypeReferenceDirectiveWithFailedLookupLocations | undefined;
4687+
/** @internal */
46864688
forEachResolvedModule(
46874689
callback: (resolution: ResolvedModuleWithFailedLookupLocations, moduleName: string, mode: ResolutionMode, filePath: Path) => void,
46884690
file?: SourceFile,
@@ -4738,7 +4740,6 @@ export interface Program extends ScriptReferenceHost {
47384740
getRelationCacheSizes(): { assignable: number; identity: number; subtype: number; strictSubtype: number; };
47394741

47404742
/** @internal */ getFileProcessingDiagnostics(): FilePreprocessingDiagnostics[] | undefined;
4741-
/** @internal */ getResolvedTypeReferenceDirectives(): ModeAwareCache<ResolvedTypeReferenceDirectiveWithFailedLookupLocations>;
47424743
/** @internal */ getAutomaticTypeDirectiveNames(): string[];
47434744
/** @internal */ getAutomaticTypeDirectiveResolutions(): ModeAwareCache<ResolvedTypeReferenceDirectiveWithFailedLookupLocations>;
47444745
isSourceFileFromExternalLibrary(file: SourceFile): boolean;

src/services/codefixes/convertToEsModule.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ function fixImportOfModuleExports(
106106
quotePreference: QuotePreference,
107107
) {
108108
for (const moduleSpecifier of importingFile.imports) {
109-
const imported = program.getResolvedModuleFromModuleSpecifier(moduleSpecifier)?.resolvedModule;
109+
const imported = program.getResolvedModuleFromModuleSpecifier(moduleSpecifier, importingFile)?.resolvedModule;
110110
if (!imported || imported.resolvedFileName !== exportingFile.fileName) {
111111
continue;
112112
}

src/services/codefixes/fixImportNonExportedMember.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ function getInfo(sourceFile: SourceFile, pos: number, program: Program): Info |
119119
const moduleSpecifier = isStringLiteral(importDeclaration.moduleSpecifier) ? importDeclaration.moduleSpecifier : undefined;
120120
if (moduleSpecifier === undefined) return undefined;
121121

122-
const resolvedModule = program.getResolvedModuleFromModuleSpecifier(moduleSpecifier)?.resolvedModule;
122+
const resolvedModule = program.getResolvedModuleFromModuleSpecifier(moduleSpecifier, sourceFile)?.resolvedModule;
123123
if (resolvedModule === undefined) return undefined;
124124

125125
const moduleSourceFile = program.getSourceFile(resolvedModule.resolvedFileName);

src/services/codefixes/fixSpelling.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ function getInfo(sourceFile: SourceFile, pos: number, context: CodeFixContextBas
118118
else if (isImportSpecifier(parent) && parent.name === node) {
119119
Debug.assertNode(node, isIdentifier, "Expected an identifier for spelling (import)");
120120
const importDeclaration = findAncestor(node, isImportDeclaration)!;
121-
const resolvedSourceFile = getResolvedSourceFileFromImportDeclaration(context, importDeclaration);
121+
const resolvedSourceFile = getResolvedSourceFileFromImportDeclaration(context, importDeclaration, sourceFile);
122122
if (resolvedSourceFile && resolvedSourceFile.symbol) {
123123
suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(node, resolvedSourceFile.symbol);
124124
}
@@ -177,10 +177,10 @@ function convertSemanticMeaningToSymbolFlags(meaning: SemanticMeaning): SymbolFl
177177
return flags;
178178
}
179179

180-
function getResolvedSourceFileFromImportDeclaration(context: CodeFixContextBase, importDeclaration: ImportDeclaration): SourceFile | undefined {
180+
function getResolvedSourceFileFromImportDeclaration(context: CodeFixContextBase, importDeclaration: ImportDeclaration, importingFile: SourceFile): SourceFile | undefined {
181181
if (!importDeclaration || !isStringLiteralLike(importDeclaration.moduleSpecifier)) return undefined;
182182

183-
const resolvedModule = context.program.getResolvedModuleFromModuleSpecifier(importDeclaration.moduleSpecifier)?.resolvedModule;
183+
const resolvedModule = context.program.getResolvedModuleFromModuleSpecifier(importDeclaration.moduleSpecifier, importingFile)?.resolvedModule;
184184
if (!resolvedModule) return undefined;
185185

186186
return context.program.getSourceFile(resolvedModule.resolvedFileName);

src/services/codefixes/importFixes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1715,7 +1715,7 @@ function promoteFromTypeOnly(
17151715
// Change .ts extension to .js if necessary
17161716
if (!compilerOptions.allowImportingTsExtensions) {
17171717
const moduleSpecifier = tryGetModuleSpecifierFromDeclaration(importClause.parent);
1718-
const resolvedModule = moduleSpecifier && program.getResolvedModuleFromModuleSpecifier(moduleSpecifier)?.resolvedModule;
1718+
const resolvedModule = moduleSpecifier && program.getResolvedModuleFromModuleSpecifier(moduleSpecifier, sourceFile)?.resolvedModule;
17191719
if (resolvedModule?.resolvedUsingTsExtension) {
17201720
const changedExtension = changeAnyExtension(moduleSpecifier!.text, getOutputExtension(moduleSpecifier!.text, compilerOptions));
17211721
changes.replaceNode(sourceFile, moduleSpecifier!, factory.createStringLiteral(changedExtension));

src/services/getEditsForFileRename.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ function getSourceFileToImport(
247247
else {
248248
const mode = program.getModeForUsageLocation(importingSourceFile, importLiteral);
249249
const resolved = host.resolveModuleNameLiterals || !host.resolveModuleNames ?
250-
program.getResolvedModuleFromModuleSpecifier(importLiteral) :
250+
program.getResolvedModuleFromModuleSpecifier(importLiteral, importingSourceFile) :
251251
host.getResolvedModuleWithFailedLookupLocationsFromCache && host.getResolvedModuleWithFailedLookupLocationsFromCache(importLiteral.text, importingSourceFile.fileName, mode);
252252
return getSourceFileToImportFromResolved(importLiteral, resolved, oldToNew, program.getSourceFiles());
253253
}

src/services/goToDefinition.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ export function getDefinitionAtPosition(program: Program, sourceFile: SourceFile
199199
if (!symbol && isModuleSpecifierLike(fallbackNode)) {
200200
// We couldn't resolve the module specifier as an external module, but it could
201201
// be that module resolution succeeded but the target was not a module.
202-
const ref = program.getResolvedModuleFromModuleSpecifier(fallbackNode)?.resolvedModule;
202+
const ref = program.getResolvedModuleFromModuleSpecifier(fallbackNode, sourceFile)?.resolvedModule;
203203
if (ref) {
204204
return [{
205205
name: fallbackNode.text,
@@ -341,7 +341,7 @@ export function getReferenceAtPosition(sourceFile: SourceFile, position: number,
341341

342342
const typeReferenceDirective = findReferenceInPosition(sourceFile.typeReferenceDirectives, position);
343343
if (typeReferenceDirective) {
344-
const reference = program.getResolvedTypeReferenceDirectives().get(typeReferenceDirective.fileName, typeReferenceDirective.resolutionMode || program.getDefaultResolutionModeForFile(sourceFile))?.resolvedTypeReferenceDirective;
344+
const reference = program.getResolvedTypeReferenceDirectiveFromTypeReferenceDirective(typeReferenceDirective, sourceFile)?.resolvedTypeReferenceDirective;
345345
const file = reference && program.getSourceFile(reference.resolvedFileName!); // TODO:GH#18217
346346
return file && { reference: typeReferenceDirective, fileName: file.fileName, file, unverified: false };
347347
}
@@ -355,7 +355,7 @@ export function getReferenceAtPosition(sourceFile: SourceFile, position: number,
355355
if (sourceFile.imports.length || sourceFile.moduleAugmentations.length) {
356356
const node = getTouchingToken(sourceFile, position);
357357
let resolution: ResolvedModuleWithFailedLookupLocations | undefined;
358-
if (isModuleSpecifierLike(node) && isExternalModuleNameRelative(node.text) && (resolution = program.getResolvedModuleFromModuleSpecifier(node))) {
358+
if (isModuleSpecifierLike(node) && isExternalModuleNameRelative(node.text) && (resolution = program.getResolvedModuleFromModuleSpecifier(node, sourceFile))) {
359359
const verifiedFileName = resolution.resolvedModule?.resolvedFileName;
360360
const fileName = verifiedFileName || resolvePath(getDirectoryPath(sourceFile.fileName), node.text);
361361
return {

src/services/importTracker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ export function findModuleReferences(program: Program, sourceFiles: readonly Sou
480480
}
481481
}
482482
for (const ref of referencingFile.typeReferenceDirectives) {
483-
const referenced = program.getResolvedTypeReferenceDirectives().get(ref.fileName, ref.resolutionMode || program.getDefaultResolutionModeForFile(referencingFile))?.resolvedTypeReferenceDirective;
483+
const referenced = program.getResolvedTypeReferenceDirectiveFromTypeReferenceDirective(ref, referencingFile)?.resolvedTypeReferenceDirective;
484484
if (referenced !== undefined && referenced.resolvedFileName === (searchSourceFile as SourceFile).fileName) {
485485
refs.push({ kind: "reference", referencingFile, ref });
486486
}

src/services/suggestionDiagnostics.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export function computeSuggestionDiagnostics(sourceFile: SourceFile, program: Pr
8787
const importNode = importFromModuleSpecifier(moduleSpecifier);
8888
const name = importNameForConvertToDefaultImport(importNode);
8989
if (!name) continue;
90-
const module = program.getResolvedModuleFromModuleSpecifier(moduleSpecifier)?.resolvedModule;
90+
const module = program.getResolvedModuleFromModuleSpecifier(moduleSpecifier, sourceFile)?.resolvedModule;
9191
const resolvedFile = module && program.getSourceFile(module.resolvedFileName);
9292
if (resolvedFile && resolvedFile.externalModuleIndicator && resolvedFile.externalModuleIndicator !== true && isExportAssignment(resolvedFile.externalModuleIndicator) && resolvedFile.externalModuleIndicator.isExportEquals) {
9393
diags.push(createDiagnosticForNode(name, Diagnostics.Import_may_be_converted_to_a_default_import));

0 commit comments

Comments
 (0)