From 9979a72abf788fb3b1da2ddbd9378c493de7cb1e Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 18 Oct 2023 14:14:06 -0700 Subject: [PATCH] debug: fix serverReadyAction.killOnServerStop not working (#195944) Fixes #195942 --- .../debug-server-ready/src/extension.ts | 47 +++++++++---------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/extensions/debug-server-ready/src/extension.ts b/extensions/debug-server-ready/src/extension.ts index 307b5e25475..df5c8521c09 100644 --- a/extensions/debug-server-ready/src/extension.ts +++ b/extensions/debug-server-ready/src/extension.ts @@ -53,11 +53,12 @@ class ServerReadyDetector extends vscode.Disposable { private static detectors = new Map(); private static terminalDataListener: vscode.Disposable | undefined; + private readonly stoppedEmitter = new vscode.EventEmitter(); + private readonly onDidSessionStop = this.stoppedEmitter.event; + private readonly disposables = new Set([]); private trigger: Trigger; private shellPid?: number; private regexp: RegExp; - private disposables: vscode.Disposable[] = []; - private lateDisposables = new Set([]); static start(session: vscode.DebugSession): ServerReadyDetector | undefined { if (session.configuration.serverReadyAction) { @@ -75,6 +76,7 @@ class ServerReadyDetector extends vscode.Disposable { const detector = ServerReadyDetector.detectors.get(session); if (detector) { ServerReadyDetector.detectors.delete(session); + detector.sessionStopped(); detector.dispose(); } } @@ -125,12 +127,11 @@ class ServerReadyDetector extends vscode.Disposable { private internalDispose() { this.disposables.forEach(d => d.dispose()); - this.disposables = []; + this.disposables.clear(); } - override dispose() { - this.lateDisposables.forEach(d => d.dispose()); - return super.dispose(); + public sessionStopped() { + this.stoppedEmitter.fire(); } detectPattern(s: string): boolean { @@ -139,7 +140,6 @@ class ServerReadyDetector extends vscode.Disposable { if (matches && matches.length >= 1) { this.openExternalWithString(this.session, matches.length > 1 ? matches[1] : ''); this.trigger.fire(); - this.internalDispose(); return true; } } @@ -147,7 +147,6 @@ class ServerReadyDetector extends vscode.Disposable { } private openExternalWithString(session: vscode.DebugSession, captureString: string) { - const args: ServerReadyAction = session.configuration.serverReadyAction; let uri; @@ -228,14 +227,12 @@ class ServerReadyDetector extends vscode.Disposable { return; } - const stopListener = vscode.debug.onDidTerminateDebugSession(async (terminated) => { - if (terminated === session) { - stopListener.dispose(); - this.lateDisposables.delete(stopListener); - await vscode.debug.stopDebugging(createdSession); - } + const stopListener = this.onDidSessionStop(async () => { + stopListener.dispose(); + this.disposables.delete(stopListener); + await vscode.debug.stopDebugging(createdSession); }); - this.lateDisposables.add(stopListener); + this.disposables.add(stopListener); } private startBrowserDebugSession(type: string, session: vscode.DebugSession, uri: string, trackerId?: string) { @@ -272,14 +269,12 @@ class ServerReadyDetector extends vscode.Disposable { return; } - const stopListener = vscode.debug.onDidTerminateDebugSession(async (terminated) => { - if (terminated === session) { - stopListener.dispose(); - this.lateDisposables.delete(stopListener); - await vscode.debug.stopDebugging(createdSession); - } + const stopListener = this.onDidSessionStop(async () => { + stopListener.dispose(); + this.disposables.delete(stopListener); + await vscode.debug.stopDebugging(createdSession); }); - this.lateDisposables.add(stopListener); + this.disposables.add(stopListener); } private catchStartedDebugSession(predicate: (session: vscode.DebugSession) => boolean, cancellationToken: vscode.CancellationToken): Promise { @@ -287,8 +282,8 @@ class ServerReadyDetector extends vscode.Disposable { const done = (value?: vscode.DebugSession) => { listener.dispose(); cancellationListener.dispose(); - this.lateDisposables.delete(listener); - this.lateDisposables.delete(cancellationListener); + this.disposables.delete(listener); + this.disposables.delete(cancellationListener); _resolve(value); }; @@ -300,8 +295,8 @@ class ServerReadyDetector extends vscode.Disposable { }); // In case the debug session of interest was never caught anyhow. - this.lateDisposables.add(listener); - this.lateDisposables.add(cancellationListener); + this.disposables.add(listener); + this.disposables.add(cancellationListener); }); } }