6
6
import { Emitter } from '../../../../../base/common/event.js' ;
7
7
import { IDisposable , toDisposable } from '../../../../../base/common/lifecycle.js' ;
8
8
import { localize } from '../../../../../nls.js' ;
9
- import { ILogService } from '../../../../../platform/log/common/log.js' ;
10
9
import { ITerminalCommandSelector } from '../../../../../platform/terminal/common/terminal.js' ;
11
10
import { ITerminalQuickFixService , ITerminalQuickFixProvider , ITerminalQuickFixProviderSelector } from './quickFix.js' ;
12
11
import { isProposedApiEnabled } from '../../../../services/extensions/common/extensions.js' ;
@@ -20,6 +19,8 @@ export class TerminalQuickFixService implements ITerminalQuickFixService {
20
19
private _providers : Map < string , ITerminalQuickFixProvider > = new Map ( ) ;
21
20
get providers ( ) : Map < string , ITerminalQuickFixProvider > { return this . _providers ; }
22
21
22
+ private _pendingProviders : Map < string , ITerminalQuickFixProvider > = new Map ( ) ;
23
+
23
24
private readonly _onDidRegisterProvider = new Emitter < ITerminalQuickFixProviderSelector > ( ) ;
24
25
readonly onDidRegisterProvider = this . _onDidRegisterProvider . event ;
25
26
private readonly _onDidRegisterCommandSelector = new Emitter < ITerminalCommandSelector > ( ) ;
@@ -29,9 +30,7 @@ export class TerminalQuickFixService implements ITerminalQuickFixService {
29
30
30
31
readonly extensionQuickFixes : Promise < Array < ITerminalCommandSelector > > ;
31
32
32
- constructor (
33
- @ILogService private readonly _logService : ILogService ,
34
- ) {
33
+ constructor ( ) {
35
34
this . extensionQuickFixes = new Promise ( ( r ) => quickFixExtensionPoint . setHandler ( fixes => {
36
35
r ( fixes . filter ( c => isProposedApiEnabled ( c . description , 'terminalQuickFixProvider' ) ) . map ( c => {
37
36
if ( ! c . value ) {
@@ -50,6 +49,14 @@ export class TerminalQuickFixService implements ITerminalQuickFixService {
50
49
registerCommandSelector ( selector : ITerminalCommandSelector ) : void {
51
50
this . _selectors . set ( selector . id , selector ) ;
52
51
this . _onDidRegisterCommandSelector . fire ( selector ) ;
52
+
53
+ // Check if there's a pending provider for this selector
54
+ const pendingProvider = this . _pendingProviders . get ( selector . id ) ;
55
+ if ( pendingProvider ) {
56
+ this . _pendingProviders . delete ( selector . id ) ;
57
+ this . _providers . set ( selector . id , pendingProvider ) ;
58
+ this . _onDidRegisterProvider . fire ( { selector, provider : pendingProvider } ) ;
59
+ }
53
60
}
54
61
55
62
registerQuickFixProvider ( id : string , provider : ITerminalQuickFixProvider ) : IDisposable {
@@ -61,17 +68,20 @@ export class TerminalQuickFixService implements ITerminalQuickFixService {
61
68
if ( disposed ) {
62
69
return ;
63
70
}
64
- this . _providers . set ( id , provider ) ;
65
71
const selector = this . _selectors . get ( id ) ;
66
- if ( ! selector ) {
67
- this . _logService . error ( `No registered selector for ID: ${ id } ` ) ;
68
- return ;
72
+ if ( selector ) {
73
+ // Selector is already available, register immediately
74
+ this . _providers . set ( id , provider ) ;
75
+ this . _onDidRegisterProvider . fire ( { selector, provider } ) ;
76
+ } else {
77
+ // Selector not yet available, store provider as pending
78
+ this . _pendingProviders . set ( id , provider ) ;
69
79
}
70
- this . _onDidRegisterProvider . fire ( { selector, provider } ) ;
71
80
} ) ;
72
81
return toDisposable ( ( ) => {
73
82
disposed = true ;
74
83
this . _providers . delete ( id ) ;
84
+ this . _pendingProviders . delete ( id ) ;
75
85
const selector = this . _selectors . get ( id ) ;
76
86
if ( selector ) {
77
87
this . _selectors . delete ( id ) ;
0 commit comments