@@ -12,15 +12,14 @@ import { IConfigurationService } from '../../../../../platform/configuration/com
1212import { IFileService } from '../../../../../platform/files/common/files.js' ;
1313import { createDecorator } from '../../../../../platform/instantiation/common/instantiation.js' ;
1414import { TerminalCapability , type ITerminalCapabilityStore } from '../../../../../platform/terminal/common/capabilities/capabilities.js' ;
15- import { GeneralShellType , TerminalShellType , WindowsShellType } from '../../../../../platform/terminal/common/terminal.js' ;
15+ import { GeneralShellType , ITerminalLogService , TerminalShellType , WindowsShellType } from '../../../../../platform/terminal/common/terminal.js' ;
1616import { TerminalSuggestSettingId } from '../common/terminalSuggestConfiguration.js' ;
1717import { TerminalCompletionItemKind , type ITerminalCompletion } from './terminalCompletionItem.js' ;
1818import { env as processEnv } from '../../../../../base/common/process.js' ;
1919import type { IProcessEnvironment } from '../../../../../base/common/platform.js' ;
2020import { timeout } from '../../../../../base/common/async.js' ;
2121import { gitBashToWindowsPath } from './terminalGitBashHelpers.js' ;
2222import { isEqual } from '../../../../../base/common/resources.js' ;
23- import { ILogService } from '../../../../../platform/log/common/log.js' ;
2423
2524export const ITerminalCompletionService = createDecorator < ITerminalCompletionService > ( 'terminalCompletionService' ) ;
2625
@@ -104,7 +103,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
104103 constructor (
105104 @IConfigurationService private readonly _configurationService : IConfigurationService ,
106105 @IFileService private readonly _fileService : IFileService ,
107- @ILogService private readonly _logService : ILogService
106+ @ITerminalLogService private readonly _logService : ITerminalLogService
108107 ) {
109108 super ( ) ;
110109 }
@@ -132,6 +131,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
132131 }
133132
134133 async provideCompletions ( promptValue : string , cursorPosition : number , allowFallbackCompletions : boolean , shellType : TerminalShellType | undefined , capabilities : ITerminalCapabilityStore , token : CancellationToken , triggerCharacter ?: boolean , skipExtensionCompletions ?: boolean , explicitlyInvoked ?: boolean ) : Promise < ITerminalCompletion [ ] | undefined > {
134+ this . _logService . trace ( 'TerminalCompletionService#provideCompletions' ) ;
135135 if ( ! this . _providers || ! this . _providers . values || cursorPosition < 0 ) {
136136 return undefined ;
137137 }
@@ -178,6 +178,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
178178 }
179179
180180 private async _collectCompletions ( providers : ITerminalCompletionProvider [ ] , shellType : TerminalShellType | undefined , promptValue : string , cursorPosition : number , allowFallbackCompletions : boolean , capabilities : ITerminalCapabilityStore , token : CancellationToken , explicitlyInvoked ?: boolean ) : Promise < ITerminalCompletion [ ] | undefined > {
181+ this . _logService . trace ( 'TerminalCompletionService#_collectCompletions' ) ;
181182 const completionPromises = providers . map ( async provider => {
182183 if ( provider . shellTypes && shellType && ! provider . shellTypes . includes ( shellType ) ) {
183184 return undefined ;
@@ -187,7 +188,10 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
187188 let completions ;
188189 try {
189190 completions = await Promise . race ( [
190- provider . provideCompletions ( promptValue , cursorPosition , allowFallbackCompletions , token ) ,
191+ provider . provideCompletions ( promptValue , cursorPosition , allowFallbackCompletions , token ) . then ( result => {
192+ this . _logService . trace ( `TerminalCompletionService#_collectCompletions provider ${ provider . id } finished` ) ;
193+ return result ;
194+ } ) ,
191195 ( async ( ) => { await timeout ( timeoutMs ) ; timedOut = true ; return undefined ; } ) ( )
192196 ] ) ;
193197 } catch ( e ) {
@@ -202,6 +206,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
202206 return undefined ;
203207 }
204208 const completionItems = Array . isArray ( completions ) ? completions : completions . items ?? [ ] ;
209+ this . _logService . trace ( `TerminalCompletionService#_collectCompletions amend ${ completionItems . length } completion items` ) ;
205210 if ( shellType === GeneralShellType . PowerShell ) {
206211 for ( const completion of completionItems ) {
207212 completion . isFileOverride ??= completion . kind === TerminalCompletionItemKind . Method && completion . replacementIndex === 0 ;
@@ -218,24 +223,29 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
218223 }
219224 if ( completions . resourceRequestConfig ) {
220225 const resourceCompletions = await this . resolveResources ( completions . resourceRequestConfig , promptValue , cursorPosition , `core:path:ext:${ provider . id } ` , capabilities , shellType ) ;
226+ this . _logService . trace ( `TerminalCompletionService#_collectCompletions dedupe` ) ;
221227 if ( resourceCompletions ) {
228+ const labels = new Set ( completionItems . map ( c => c . label ) ) ;
222229 for ( const item of resourceCompletions ) {
223- const labels = new Set ( completionItems . map ( c => c . label ) ) ;
224230 // Ensure no duplicates such as .
225231 if ( ! labels . has ( item . label ) ) {
226232 completionItems . push ( item ) ;
227233 }
228234 }
229235 }
236+ this . _logService . trace ( `TerminalCompletionService#_collectCompletions dedupe done` ) ;
230237 }
231238 return completionItems ;
232239 } ) ;
233240
234241 const results = await Promise . all ( completionPromises ) ;
242+ this . _logService . trace ( 'TerminalCompletionService#_collectCompletions done' ) ;
235243 return results . filter ( result => ! ! result ) . flat ( ) ;
236244 }
237245
238246 async resolveResources ( resourceRequestConfig : TerminalResourceRequestConfig , promptValue : string , cursorPosition : number , provider : string , capabilities : ITerminalCapabilityStore , shellType ?: TerminalShellType ) : Promise < ITerminalCompletion [ ] | undefined > {
247+ this . _logService . trace ( `TerminalCompletionService#resolveResources` ) ;
248+
239249 const useWindowsStylePath = resourceRequestConfig . pathSeparator === '\\' ;
240250 if ( useWindowsStylePath ) {
241251 // for tests, make sure the right path separator is used
@@ -360,6 +370,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
360370 // - (absolute) `/src/|` -> `/src/`
361371 // - (tilde) `~/|` -> `~/`
362372 // - (tilde) `~/src/|` -> `~/src/`
373+ this . _logService . trace ( `TerminalCompletionService#resolveResources cwd` ) ;
363374 if ( foldersRequested ) {
364375 let label : string ;
365376 switch ( type ) {
@@ -394,7 +405,8 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
394405 // - (relative) `cd ./src/` -> `cd ./src/folder1/`, ...
395406 // - (absolute) `cd c:/src/` -> `cd c:/src/folder1/`, ...
396407 // - (tilde) `cd ~/src/` -> `cd ~/src/folder1/`, ...
397- for ( const child of stat . children ) {
408+ this . _logService . trace ( `TerminalCompletionService#resolveResources direct children` ) ;
409+ await Promise . all ( stat . children . map ( child => ( async ( ) => {
398410 let kind : TerminalCompletionItemKind | undefined ;
399411 let detail : string | undefined = undefined ;
400412 if ( foldersRequested && child . isDirectory ) {
@@ -411,7 +423,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
411423 }
412424 }
413425 if ( kind === undefined ) {
414- continue ;
426+ return ;
415427 }
416428
417429 let label = lastWordFolder ;
@@ -431,7 +443,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
431443 if ( child . isFile && fileExtensions ) {
432444 const extension = child . name . split ( '.' ) . length > 1 ? child . name . split ( '.' ) . at ( - 1 ) : undefined ;
433445 if ( extension && ! fileExtensions . includes ( extension ) ) {
434- continue ;
446+ return ;
435447 }
436448 }
437449
@@ -455,11 +467,12 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
455467 replacementIndex : cursorPosition - lastWord . length ,
456468 replacementLength : lastWord . length
457469 } ) ;
458- }
470+ } ) ( ) ) ) ;
459471
460472 // Support $CDPATH specially for the `cd` command only
461473 //
462474 // - (relative) `|` -> `/foo/vscode` (CDPATH has /foo which contains vscode folder)
475+ this . _logService . trace ( `TerminalCompletionService#resolveResources CDPATH` ) ;
463476 if ( type === 'relative' && foldersRequested ) {
464477 if ( promptValue . startsWith ( 'cd ' ) ) {
465478 const config = this . _configurationService . getValue ( TerminalSuggestSettingId . CdPath ) ;
@@ -500,6 +513,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
500513 //
501514 // - (relative) `|` -> `../`
502515 // - (relative) `./src/|` -> `./src/../`
516+ this . _logService . trace ( `TerminalCompletionService#resolveResources parent dir` ) ;
503517 if ( type === 'relative' && foldersRequested ) {
504518 let label = `..${ resourceRequestConfig . pathSeparator } ` ;
505519 if ( lastWordFolder . length > 0 ) {
@@ -520,6 +534,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
520534 // input.
521535 //
522536 // - (relative) `|` -> `~`
537+ this . _logService . trace ( `TerminalCompletionService#resolveResources tilde` ) ;
523538 if ( type === 'relative' && ! lastWordFolder . match ( / [ \\ \/ ] / ) ) {
524539 let homeResource : URI | string | undefined ;
525540 const home = this . _getHomeDir ( useWindowsStylePath , capabilities ) ;
@@ -541,6 +556,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
541556 } ) ;
542557 }
543558
559+ this . _logService . trace ( `TerminalCompletionService#resolveResources done` ) ;
544560 return resourceCompletions ;
545561 }
546562
0 commit comments