@@ -426,12 +426,7 @@ export function forEachExternalModuleToImportFrom(
426426 cb : ( module : Symbol , moduleFile : SourceFile | undefined , program : Program , isFromPackageJson : boolean ) => void ,
427427) {
428428 const useCaseSensitiveFileNames = hostUsesCaseSensitiveFileNames ( host ) ;
429- const excludePatterns = preferences . autoImportFileExcludePatterns && mapDefined ( preferences . autoImportFileExcludePatterns , spec => {
430- // The client is expected to send rooted path specs since we don't know
431- // what directory a relative path is relative to.
432- const pattern = getSubPatternFromSpec ( spec , "" , "exclude" ) ;
433- return pattern ? getRegexFromPattern ( pattern , useCaseSensitiveFileNames ) : undefined ;
434- } ) ;
429+ const excludePatterns = preferences . autoImportFileExcludePatterns && getIsExcludedPatterns ( preferences , useCaseSensitiveFileNames ) ;
435430
436431 forEachExternalModule ( program . getTypeChecker ( ) , program . getSourceFiles ( ) , excludePatterns , host , ( module , file ) => cb ( module , file , program , /*isFromPackageJson*/ false ) ) ;
437432 const autoImportProvider = useAutoImportProvider && host . getPackageJsonAutoImportProvider ?.( ) ;
@@ -451,9 +446,33 @@ export function forEachExternalModuleToImportFrom(
451446 }
452447}
453448
449+ function getIsExcludedPatterns ( preferences : UserPreferences , useCaseSensitiveFileNames : boolean ) {
450+ return mapDefined ( preferences . autoImportFileExcludePatterns , spec => {
451+ // The client is expected to send rooted path specs since we don't know
452+ // what directory a relative path is relative to.
453+ const pattern = getSubPatternFromSpec ( spec , "" , "exclude" ) ;
454+ return pattern ? getRegexFromPattern ( pattern , useCaseSensitiveFileNames ) : undefined ;
455+ } ) ;
456+ }
457+
454458function forEachExternalModule ( checker : TypeChecker , allSourceFiles : readonly SourceFile [ ] , excludePatterns : readonly RegExp [ ] | undefined , host : LanguageServiceHost , cb : ( module : Symbol , sourceFile : SourceFile | undefined ) => void ) {
459+ const isExcluded = excludePatterns && getIsExcluded ( excludePatterns , host ) ;
460+
461+ for ( const ambient of checker . getAmbientModules ( ) ) {
462+ if ( ! ambient . name . includes ( "*" ) && ! ( excludePatterns && ambient . declarations ?. every ( d => isExcluded ! ( d . getSourceFile ( ) ) ) ) ) {
463+ cb ( ambient , /*sourceFile*/ undefined ) ;
464+ }
465+ }
466+ for ( const sourceFile of allSourceFiles ) {
467+ if ( isExternalOrCommonJsModule ( sourceFile ) && ! isExcluded ?.( sourceFile ) ) {
468+ cb ( checker . getMergedSymbol ( sourceFile . symbol ) , sourceFile ) ;
469+ }
470+ }
471+ }
472+
473+ function getIsExcluded ( excludePatterns : readonly RegExp [ ] , host : LanguageServiceHost ) {
455474 const realpathsWithSymlinks = host . getSymlinkCache ?.( ) . getSymlinkedDirectoriesByRealpath ( ) ;
456- const isExcluded = excludePatterns && ( ( { fileName, path } : SourceFile ) => {
475+ return ( ( { fileName, path } : SourceFile ) => {
457476 if ( excludePatterns . some ( p => p . test ( fileName ) ) ) return true ;
458477 if ( realpathsWithSymlinks ?. size && pathContainsNodeModules ( fileName ) ) {
459478 let dir = getDirectoryPath ( fileName ) ;
@@ -467,17 +486,12 @@ function forEachExternalModule(checker: TypeChecker, allSourceFiles: readonly So
467486 }
468487 return false ;
469488 } ) ;
489+ }
470490
471- for ( const ambient of checker . getAmbientModules ( ) ) {
472- if ( ! ambient . name . includes ( "*" ) && ! ( excludePatterns && ambient . declarations ?. every ( d => isExcluded ! ( d . getSourceFile ( ) ) ) ) ) {
473- cb ( ambient , /*sourceFile*/ undefined ) ;
474- }
475- }
476- for ( const sourceFile of allSourceFiles ) {
477- if ( isExternalOrCommonJsModule ( sourceFile ) && ! isExcluded ?.( sourceFile ) ) {
478- cb ( checker . getMergedSymbol ( sourceFile . symbol ) , sourceFile ) ;
479- }
480- }
491+ /** @internal */
492+ export function getIsFileExcluded ( host : LanguageServiceHost , preferences : UserPreferences ) {
493+ if ( ! preferences . autoImportFileExcludePatterns ) return ( ) => false ;
494+ return getIsExcluded ( getIsExcludedPatterns ( preferences , hostUsesCaseSensitiveFileNames ( host ) ) , host ) ;
481495}
482496
483497/** @internal */
0 commit comments