Skip to content

Commit be221a5

Browse files
CopilotTyriar
andcommitted
Fix race condition in terminal quick fix provider registration
Co-authored-by: Tyriar <[email protected]>
1 parent 9ea637c commit be221a5

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixService.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export class TerminalQuickFixService implements ITerminalQuickFixService {
2020
private _providers: Map<string, ITerminalQuickFixProvider> = new Map();
2121
get providers(): Map<string, ITerminalQuickFixProvider> { return this._providers; }
2222

23+
private _pendingProviders: Map<string, ITerminalQuickFixProvider> = new Map();
24+
2325
private readonly _onDidRegisterProvider = new Emitter<ITerminalQuickFixProviderSelector>();
2426
readonly onDidRegisterProvider = this._onDidRegisterProvider.event;
2527
private readonly _onDidRegisterCommandSelector = new Emitter<ITerminalCommandSelector>();
@@ -50,6 +52,14 @@ export class TerminalQuickFixService implements ITerminalQuickFixService {
5052
registerCommandSelector(selector: ITerminalCommandSelector): void {
5153
this._selectors.set(selector.id, selector);
5254
this._onDidRegisterCommandSelector.fire(selector);
55+
56+
// Check if there's a pending provider for this selector
57+
const pendingProvider = this._pendingProviders.get(selector.id);
58+
if (pendingProvider) {
59+
this._pendingProviders.delete(selector.id);
60+
this._providers.set(selector.id, pendingProvider);
61+
this._onDidRegisterProvider.fire({ selector, provider: pendingProvider });
62+
}
5363
}
5464

5565
registerQuickFixProvider(id: string, provider: ITerminalQuickFixProvider): IDisposable {
@@ -61,17 +71,20 @@ export class TerminalQuickFixService implements ITerminalQuickFixService {
6171
if (disposed) {
6272
return;
6373
}
64-
this._providers.set(id, provider);
6574
const selector = this._selectors.get(id);
66-
if (!selector) {
67-
this._logService.error(`No registered selector for ID: ${id}`);
68-
return;
75+
if (selector) {
76+
// Selector is already available, register immediately
77+
this._providers.set(id, provider);
78+
this._onDidRegisterProvider.fire({ selector, provider });
79+
} else {
80+
// Selector not yet available, store provider as pending
81+
this._pendingProviders.set(id, provider);
6982
}
70-
this._onDidRegisterProvider.fire({ selector, provider });
7183
});
7284
return toDisposable(() => {
7385
disposed = true;
7486
this._providers.delete(id);
87+
this._pendingProviders.delete(id);
7588
const selector = this._selectors.get(id);
7689
if (selector) {
7790
this._selectors.delete(id);

0 commit comments

Comments
 (0)