77 arrayToMap ,
88 BuilderState ,
99 CachedDirectoryStructureHost ,
10+ changeExtension ,
1011 changesAffectModuleResolution ,
1112 clearMap ,
1213 cloneCompilerOptions ,
@@ -16,7 +17,6 @@ import {
1617 comparePaths ,
1718 CompilerHost ,
1819 CompilerOptions ,
19- concatenate ,
2020 containsPath ,
2121 createCacheableExportInfoMap ,
2222 createLanguageService ,
@@ -50,6 +50,7 @@ import {
5050 getAutomaticTypeDirectiveNames ,
5151 getBaseFileName ,
5252 GetCanonicalFileName ,
53+ getCommonSourceDirectoryOfConfig ,
5354 getDeclarationEmitOutputFilePathWorker ,
5455 getDefaultCompilerOptions ,
5556 getDefaultLibFileName ,
@@ -60,6 +61,7 @@ import {
6061 getEntrypointsFromPackageJsonInfo ,
6162 getNormalizedAbsolutePath ,
6263 getOrUpdate ,
64+ getOutputDeclarationFileName ,
6365 GetPackageJsonEntrypointsHost ,
6466 getStringComparer ,
6567 HasInvalidatedLibResolutions ,
@@ -79,6 +81,7 @@ import {
7981 map ,
8082 mapDefined ,
8183 maybeBind ,
84+ memoize ,
8285 ModuleResolutionCache ,
8386 ModuleResolutionHost ,
8487 noop ,
@@ -1316,6 +1319,12 @@ export abstract class Project implements LanguageServiceHost, ModuleResolutionHo
13161319 }
13171320 }
13181321
1322+ /** @internal */
1323+ markAutoImportProviderAsDirty ( ) {
1324+ if ( ! this . autoImportProviderHost ) this . autoImportProviderHost = undefined ;
1325+ this . autoImportProviderHost ?. markAsDirty ( ) ;
1326+ }
1327+
13191328 /** @internal */
13201329 onAutoImportProviderSettingsChanged ( ) {
13211330 if ( this . autoImportProviderHost === false ) {
@@ -1400,8 +1409,7 @@ export abstract class Project implements LanguageServiceHost, ModuleResolutionHo
14001409 this . projectProgramVersion ++ ;
14011410 }
14021411 if ( hasAddedorRemovedFiles ) {
1403- if ( ! this . autoImportProviderHost ) this . autoImportProviderHost = undefined ;
1404- this . autoImportProviderHost ?. markAsDirty ( ) ;
1412+ this . markAutoImportProviderAsDirty ( ) ;
14051413 }
14061414 if ( isFirstProgramLoad ) {
14071415 // Preload auto import provider so it's not created during completions request
@@ -2439,7 +2447,7 @@ export class AutoImportProviderProject extends Project {
24392447
24402448 const start = timestamp ( ) ;
24412449 let dependencyNames : Set < string > | undefined ;
2442- let rootNames : string [ ] | undefined ;
2450+ let rootNames : Set < string > | undefined ;
24432451 const rootFileName = combinePaths ( hostProject . currentDirectory , inferredTypesContainingFile ) ;
24442452 const packageJsons = hostProject . getPackageJsonsForAutoImport ( combinePaths ( hostProject . currentDirectory , rootFileName ) ) ;
24452453 for ( const packageJson of packageJsons ) {
@@ -2471,8 +2479,7 @@ export class AutoImportProviderProject extends Project {
24712479 if ( packageJson ) {
24722480 const entrypoints = getRootNamesFromPackageJson ( packageJson , program , symlinkCache ) ;
24732481 if ( entrypoints ) {
2474- rootNames = concatenate ( rootNames , entrypoints ) ;
2475- dependenciesAdded += entrypoints . length ? 1 : 0 ;
2482+ dependenciesAdded += addRootNames ( entrypoints ) ;
24762483 continue ;
24772484 }
24782485 }
@@ -2490,8 +2497,7 @@ export class AutoImportProviderProject extends Project {
24902497 ) ;
24912498 if ( typesPackageJson ) {
24922499 const entrypoints = getRootNamesFromPackageJson ( typesPackageJson , program , symlinkCache ) ;
2493- rootNames = concatenate ( rootNames , entrypoints ) ;
2494- dependenciesAdded += entrypoints ?. length ? 1 : 0 ;
2500+ dependenciesAdded += addRootNames ( entrypoints ) ;
24952501 return true ;
24962502 }
24972503 }
@@ -2504,16 +2510,56 @@ export class AutoImportProviderProject extends Project {
25042510 // package and load the JS.
25052511 if ( packageJson && compilerOptions . allowJs && compilerOptions . maxNodeModuleJsDepth ) {
25062512 const entrypoints = getRootNamesFromPackageJson ( packageJson , program , symlinkCache , /*resolveJs*/ true ) ;
2507- rootNames = concatenate ( rootNames , entrypoints ) ;
2508- dependenciesAdded += entrypoints ?. length ? 1 : 0 ;
2513+ dependenciesAdded += addRootNames ( entrypoints ) ;
25092514 }
25102515 }
25112516 }
25122517
2513- if ( rootNames ?. length ) {
2514- hostProject . log ( `AutoImportProviderProject: found ${ rootNames . length } root files in ${ dependenciesAdded } dependencies in ${ timestamp ( ) - start } ms` ) ;
2518+ const references = program . getResolvedProjectReferences ( ) ;
2519+ let referencesAddded = 0 ;
2520+ if ( references ?. length && hostProject . projectService . getHostPreferences ( ) . includeCompletionsForModuleExports ) {
2521+ // Add direct referenced projects to rootFiles names
2522+ references . forEach ( ref => {
2523+ if ( ref ?. commandLine . options . outFile ) {
2524+ referencesAddded += addRootNames ( filterEntrypoints ( [
2525+ changeExtension ( ref . commandLine . options . outFile , ".d.ts" ) ,
2526+ ] ) ) ;
2527+ }
2528+ else if ( ref ) {
2529+ const getCommonSourceDirectory = memoize ( ( ) =>
2530+ getCommonSourceDirectoryOfConfig (
2531+ ref . commandLine ,
2532+ ! hostProject . useCaseSensitiveFileNames ( ) ,
2533+ )
2534+ ) ;
2535+ referencesAddded += addRootNames ( filterEntrypoints ( mapDefined (
2536+ ref . commandLine . fileNames ,
2537+ fileName =>
2538+ ! isDeclarationFileName ( fileName ) &&
2539+ ! fileExtensionIs ( fileName , Extension . Json ) &&
2540+ ! program . getSourceFile ( fileName ) ?
2541+ getOutputDeclarationFileName (
2542+ fileName ,
2543+ ref . commandLine ,
2544+ ! hostProject . useCaseSensitiveFileNames ( ) ,
2545+ getCommonSourceDirectory ,
2546+ ) : undefined ,
2547+ ) ) ) ;
2548+ }
2549+ } ) ;
2550+ }
2551+
2552+ if ( rootNames ?. size ) {
2553+ hostProject . log ( `AutoImportProviderProject: found ${ rootNames . size } root files in ${ dependenciesAdded } dependencies ${ referencesAddded } referenced projects in ${ timestamp ( ) - start } ms` ) ;
2554+ }
2555+ return rootNames ? arrayFrom ( rootNames . values ( ) ) : ts . emptyArray ;
2556+
2557+ function addRootNames ( entrypoints : readonly string [ ] | undefined ) {
2558+ if ( ! entrypoints ?. length ) return 0 ;
2559+ rootNames ??= new Set ( ) ;
2560+ entrypoints . forEach ( entry => rootNames ! . add ( entry ) ) ;
2561+ return 1 ;
25152562 }
2516- return rootNames || ts . emptyArray ;
25172563
25182564 function addDependency ( dependency : string ) {
25192565 if ( ! startsWith ( dependency , "@types/" ) ) {
@@ -2540,14 +2586,18 @@ export class AutoImportProviderProject extends Project {
25402586 } ) ;
25412587 }
25422588
2543- return mapDefined ( entrypoints , entrypoint => {
2544- const resolvedFileName = isSymlink ? entrypoint . replace ( packageJson . packageDirectory , real ! ) : entrypoint ;
2545- if ( ! program . getSourceFile ( resolvedFileName ) && ! ( isSymlink && program . getSourceFile ( entrypoint ) ) ) {
2546- return resolvedFileName ;
2547- }
2548- } ) ;
2589+ return filterEntrypoints ( entrypoints , isSymlink ? entrypoint => entrypoint . replace ( packageJson . packageDirectory , real ! ) : undefined ) ;
25492590 }
25502591 }
2592+
2593+ function filterEntrypoints ( entrypoints : readonly string [ ] | undefined , symlinkName ?: ( entrypoint : string ) => string ) {
2594+ return mapDefined ( entrypoints , entrypoint => {
2595+ const resolvedFileName = symlinkName ? symlinkName ( entrypoint ) : entrypoint ;
2596+ if ( ! program ! . getSourceFile ( resolvedFileName ) && ! ( symlinkName && program ! . getSourceFile ( entrypoint ) ) ) {
2597+ return resolvedFileName ;
2598+ }
2599+ } ) ;
2600+ }
25512601 }
25522602
25532603 /** @internal */
0 commit comments