Skip to content

Commit 38def47

Browse files
committed
Fix symlinks discovered by package.json auto-import provider
1 parent cba8f31 commit 38def47

1 file changed

Lines changed: 27 additions & 22 deletions

File tree

src/services/exportInfoMap.ts

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,10 @@ namespace ts {
337337
cb: (module: Symbol, moduleFile: SourceFile | undefined, program: Program, source: AutoImportSource) => void,
338338
) {
339339
const { includePackageJson, includeProjectReferences } = getAutoImportPreferences(preferences);
340-
const seenModules = includeProjectReferences ? new Set<string>() : undefined;
340+
const resolvedReferencedProjects = includeProjectReferences && host.getProgramForReferencedProject
341+
? compact(program.getResolvedProjectReferences() || emptyArray)
342+
: undefined;
343+
const seenModules = some(resolvedReferencedProjects) ? new Set<string>() : undefined;
341344

342345
forEachExternalModule(program.getTypeChecker(), program.getSourceFiles(), (module, file) => {
343346
seenModules?.add(file?.path || module.name);
@@ -347,30 +350,32 @@ namespace ts {
347350
const autoImportProvider = includePackageJson && host.getPackageJsonAutoImportProvider?.();
348351
if (autoImportProvider) {
349352
const start = timestamp();
350-
forEachExternalModule(autoImportProvider.getTypeChecker(), autoImportProvider.getSourceFiles(), (module, file) => cb(module, file, autoImportProvider, AutoImportSourceKind.PackageJson));
353+
forEachExternalModule(autoImportProvider.getTypeChecker(), autoImportProvider.getSourceFiles(), (module, file) => {
354+
// The only reason we have to add files from package.json auto imports to the dedupe
355+
// set for project references is that a referenced project symlinked through node_modules
356+
// can show up here. We could add files only if their path does not contain '/node_modules/';
357+
// I'm not sure whether that would be faster or slower, but probably doesn't make a big difference.
358+
seenModules?.add(file?.path || module.name);
359+
cb(module, file, autoImportProvider, AutoImportSourceKind.PackageJson);
360+
});
351361
host.log?.(`forEachExternalModuleToImportFrom autoImportProvider: ${timestamp() - start}`);
352362
}
353363

354-
if (includeProjectReferences && host.getProgramForReferencedProject) {
355-
const projectReferences = program.getResolvedProjectReferences();
356-
if (projectReferences) {
357-
for (const ref of projectReferences) {
358-
if (ref) {
359-
const referencedProgram = host.getProgramForReferencedProject(ref.sourceFile.fileName);
360-
if (referencedProgram) {
361-
forEachExternalModule(
362-
referencedProgram.getTypeChecker(),
363-
mapDefined(referencedProgram.getRootFileNames(), fileName => {
364-
const file = referencedProgram.getSourceFile(fileName);
365-
return file && !seenModules!.has(file.path) ? file : undefined;
366-
}),
367-
(module, file) => {
368-
cb(module, file, referencedProgram, ref.sourceFile.fileName);
369-
seenModules!.add(file?.path || module.name);
370-
},
371-
);
372-
}
373-
}
364+
if (resolvedReferencedProjects) {
365+
for (const ref of resolvedReferencedProjects) {
366+
const referencedProgram = host.getProgramForReferencedProject!(ref.sourceFile.fileName);
367+
if (referencedProgram) {
368+
forEachExternalModule(
369+
referencedProgram.getTypeChecker(),
370+
mapDefined(referencedProgram.getRootFileNames(), fileName => {
371+
const file = referencedProgram.getSourceFile(fileName);
372+
return file && !seenModules!.has(file.path) ? file : undefined;
373+
}),
374+
(module, file) => {
375+
cb(module, file, referencedProgram, ref.sourceFile.fileName);
376+
seenModules!.add(file?.path || module.name);
377+
},
378+
);
374379
}
375380
}
376381
}

0 commit comments

Comments
 (0)