@@ -74,13 +74,13 @@ export class SearchService extends Disposable implements ISearchService {
7474 const localResults = this . getLocalResults ( query ) ;
7575
7676 if ( onProgress ) {
77- arrays . coalesce ( localResults . values ( ) ) . forEach ( onProgress ) ;
77+ arrays . coalesce ( localResults . results . values ( ) ) . forEach ( onProgress ) ;
7878 }
7979
8080 const onProviderProgress = ( progress : ISearchProgressItem ) => {
8181 if ( isFileMatch ( progress ) ) {
8282 // Match
83- if ( ! localResults . has ( progress . resource ) && onProgress ) { // don't override local results
83+ if ( ! localResults . results . has ( progress . resource ) && onProgress ) { // don't override local results
8484 onProgress ( progress ) ;
8585 }
8686 } else if ( onProgress ) {
@@ -96,7 +96,10 @@ export class SearchService extends Disposable implements ISearchService {
9696 const otherResults = await this . doSearch ( query , token , onProviderProgress ) ;
9797 return {
9898 ...otherResults ,
99- results : [ ...otherResults . results , ...arrays . coalesce ( localResults . values ( ) ) ]
99+ ...{
100+ limitHit : otherResults . limitHit || localResults . limitHit
101+ } ,
102+ results : [ ...otherResults . results , ...arrays . coalesce ( localResults . results . values ( ) ) ]
100103 } ;
101104 }
102105
@@ -407,8 +410,9 @@ export class SearchService extends Disposable implements ISearchService {
407410 }
408411 }
409412
410- private getLocalResults ( query : ITextQuery ) : ResourceMap < IFileMatch | null > {
413+ private getLocalResults ( query : ITextQuery ) : { results : ResourceMap < IFileMatch | null > ; limitHit : boolean } {
411414 const localResults = new ResourceMap < IFileMatch | null > ( ) ;
415+ let limitHit = false ;
412416
413417 if ( query . type === QueryType . Text ) {
414418 const models = this . modelService . getModels ( ) ;
@@ -418,6 +422,10 @@ export class SearchService extends Disposable implements ISearchService {
418422 return ;
419423 }
420424
425+ if ( limitHit ) {
426+ return ;
427+ }
428+
421429 // Skip files that are not opened as text file
422430 if ( ! this . editorService . isOpen ( { resource } ) ) {
423431 return ;
@@ -444,8 +452,14 @@ export class SearchService extends Disposable implements ISearchService {
444452 }
445453
446454 // Use editor API to find matches
447- const matches = model . findMatches ( query . contentPattern . pattern , false , ! ! query . contentPattern . isRegExp , ! ! query . contentPattern . isCaseSensitive , query . contentPattern . isWordMatch ? query . contentPattern . wordSeparators ! : null , false , query . maxResults ) ;
455+ const askMax = typeof query . maxResults === 'number' ? query . maxResults + 1 : undefined ;
456+ let matches = model . findMatches ( query . contentPattern . pattern , false , ! ! query . contentPattern . isRegExp , ! ! query . contentPattern . isCaseSensitive , query . contentPattern . isWordMatch ? query . contentPattern . wordSeparators ! : null , false , askMax ) ;
448457 if ( matches . length ) {
458+ if ( askMax && matches . length >= askMax ) {
459+ limitHit = true ;
460+ matches = matches . slice ( 0 , askMax - 1 ) ;
461+ }
462+
449463 const fileMatch = new FileMatch ( resource ) ;
450464 localResults . set ( resource , fileMatch ) ;
451465
@@ -457,7 +471,10 @@ export class SearchService extends Disposable implements ISearchService {
457471 } ) ;
458472 }
459473
460- return localResults ;
474+ return {
475+ results : localResults ,
476+ limitHit
477+ } ;
461478 }
462479
463480 private matches ( resource : uri , query : ITextQuery ) : boolean {
0 commit comments