@@ -336,32 +336,42 @@ namespace ts {
336
336
export function forEachExternalModuleToImportFrom (
337
337
program : Program ,
338
338
host : LanguageServiceHost ,
339
+ preferences : UserPreferences ,
339
340
useAutoImportProvider : boolean ,
340
341
cb : ( module : Symbol , moduleFile : SourceFile | undefined , program : Program , isFromPackageJson : boolean ) => void ,
341
342
) {
342
- forEachExternalModule ( program . getTypeChecker ( ) , program . getSourceFiles ( ) , ( module , file ) => cb ( module , file , program , /*isFromPackageJson*/ false ) ) ;
343
+ const useCaseSensitiveFileNames = hostUsesCaseSensitiveFileNames ( host ) ;
344
+ const excludePatterns = preferences . autoImportFileExcludePatterns && mapDefined ( preferences . autoImportFileExcludePatterns , spec => {
345
+ // The client is expected to send rooted path specs since we don't know
346
+ // what directory a relative path is relative to.
347
+ const pattern = getPatternFromSpec ( spec , "" , "exclude" ) ;
348
+ return pattern ? getRegexFromPattern ( pattern , useCaseSensitiveFileNames ) : undefined ;
349
+ } ) ;
350
+
351
+ forEachExternalModule ( program . getTypeChecker ( ) , program . getSourceFiles ( ) , excludePatterns , ( module , file ) => cb ( module , file , program , /*isFromPackageJson*/ false ) ) ;
343
352
const autoImportProvider = useAutoImportProvider && host . getPackageJsonAutoImportProvider ?.( ) ;
344
353
if ( autoImportProvider ) {
345
354
const start = timestamp ( ) ;
346
- forEachExternalModule ( autoImportProvider . getTypeChecker ( ) , autoImportProvider . getSourceFiles ( ) , ( module , file ) => cb ( module , file , autoImportProvider , /*isFromPackageJson*/ true ) ) ;
355
+ forEachExternalModule ( autoImportProvider . getTypeChecker ( ) , autoImportProvider . getSourceFiles ( ) , excludePatterns , ( module , file ) => cb ( module , file , autoImportProvider , /*isFromPackageJson*/ true ) ) ;
347
356
host . log ?.( `forEachExternalModuleToImportFrom autoImportProvider: ${ timestamp ( ) - start } ` ) ;
348
357
}
349
358
}
350
359
351
- function forEachExternalModule ( checker : TypeChecker , allSourceFiles : readonly SourceFile [ ] , cb : ( module : Symbol , sourceFile : SourceFile | undefined ) => void ) {
360
+ function forEachExternalModule ( checker : TypeChecker , allSourceFiles : readonly SourceFile [ ] , excludePatterns : readonly RegExp [ ] | undefined , cb : ( module : Symbol , sourceFile : SourceFile | undefined ) => void ) {
361
+ const isExcluded = ( fileName : string ) => excludePatterns ?. some ( p => p . test ( fileName ) ) ;
352
362
for ( const ambient of checker . getAmbientModules ( ) ) {
353
- if ( ! stringContains ( ambient . name , "*" ) ) {
363
+ if ( ! stringContains ( ambient . name , "*" ) && ! ( excludePatterns && ambient . declarations ?. every ( d => isExcluded ( d . getSourceFile ( ) . fileName ) ) ) ) {
354
364
cb ( ambient , /*sourceFile*/ undefined ) ;
355
365
}
356
366
}
357
367
for ( const sourceFile of allSourceFiles ) {
358
- if ( isExternalOrCommonJsModule ( sourceFile ) ) {
368
+ if ( isExternalOrCommonJsModule ( sourceFile ) && ! isExcluded ( sourceFile . fileName ) ) {
359
369
cb ( checker . getMergedSymbol ( sourceFile . symbol ) , sourceFile ) ;
360
370
}
361
371
}
362
372
}
363
373
364
- export function getExportInfoMap ( importingFile : SourceFile , host : LanguageServiceHost , program : Program , cancellationToken : CancellationToken | undefined ) : ExportInfoMap {
374
+ export function getExportInfoMap ( importingFile : SourceFile , host : LanguageServiceHost , program : Program , preferences : UserPreferences , cancellationToken : CancellationToken | undefined ) : ExportInfoMap {
365
375
const start = timestamp ( ) ;
366
376
// Pulling the AutoImportProvider project will trigger its updateGraph if pending,
367
377
// which will invalidate the export map cache if things change, so pull it before
@@ -382,7 +392,7 @@ namespace ts {
382
392
const compilerOptions = program . getCompilerOptions ( ) ;
383
393
let moduleCount = 0 ;
384
394
try {
385
- forEachExternalModuleToImportFrom ( program , host , /*useAutoImportProvider*/ true , ( moduleSymbol , moduleFile , program , isFromPackageJson ) => {
395
+ forEachExternalModuleToImportFrom ( program , host , preferences , /*useAutoImportProvider*/ true , ( moduleSymbol , moduleFile , program , isFromPackageJson ) => {
386
396
if ( ++ moduleCount % 100 === 0 ) cancellationToken ?. throwIfCancellationRequested ( ) ;
387
397
const seenExports = new Map < __String , true > ( ) ;
388
398
const checker = program . getTypeChecker ( ) ;
0 commit comments