@@ -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