diff --git a/src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts b/src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts index c38cc7bcc0993..762f9f6f57814 100644 --- a/src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts +++ b/src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts @@ -38,7 +38,7 @@ const INFO_TASK_STATUS: ITerminalStatus = { id: TASK_TERMINAL_STATUS_ID, icon: C const INFO_INACTIVE_TASK_STATUS: ITerminalStatus = { id: TASK_TERMINAL_STATUS_ID, icon: Codicon.info, severity: Severity.Info, tooltip: nls.localize('taskTerminalStatus.infosInactive', "Task has infos and is waiting...") }; export class TaskTerminalStatus extends Disposable { - private terminalMap: Map = new Map(); + private terminalMap: Map = new Map(); private _marker: IMarker | undefined; constructor(@ITaskService taskService: ITaskService, @IAudioCueService private readonly _audioCueService: IAudioCueService) { super(); @@ -67,15 +67,15 @@ export class TaskTerminalStatus extends Disposable { this._marker?.dispose(); this._marker = undefined; }); - this.terminalMap.set(task._id, { terminal, task, status, problemMatcher, taskRunEnded: false }); + + this.terminalMap.set(terminal.instanceId, { terminal, task, status, problemMatcher, taskRunEnded: false }); } private terminalFromEvent(event: ITaskEvent): ITerminalData | undefined { - if (!event.__task) { + if (!event.terminalId) { return undefined; } - - return this.terminalMap.get(event.__task._id); + return this.terminalMap.get(event.terminalId); } private eventEnd(event: ITaskEvent) { @@ -130,7 +130,10 @@ export class TaskTerminalStatus extends Disposable { } if (!terminalData.disposeListener) { terminalData.disposeListener = terminalData.terminal.onDisposed(() => { - this.terminalMap.delete(event.__task?._id!); + if (!event.terminalId) { + return; + } + this.terminalMap.delete(event.terminalId); terminalData.disposeListener?.dispose(); }); } diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index dc3382088132b..0a35133ca7d92 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -468,13 +468,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { return new Promise((resolve, reject) => { const terminal = activeTerminal.terminal; terminal.onDisposed(terminal => { - this._fireTaskEvent({ kind: TaskEventKind.Terminated, __task: task, exitReason: terminal.exitReason }); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task, terminal.instanceId, terminal.exitReason)); }); const onExit = terminal.onExit(() => { const task = activeTerminal.task; try { onExit.dispose(); - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task, terminal.instanceId, terminal.exitReason)); } catch (error) { // Do nothing. } @@ -494,7 +494,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { const task = terminalData.task; try { onExit.dispose(); - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task, terminal.instanceId, terminal.exitReason)); } catch (error) { // Do nothing. } @@ -843,13 +843,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { if (event.kind === ProblemCollectorEventKind.BackgroundProcessingBegins) { eventCounter++; this._busyTasks[mapKey] = task; - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Active, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Active, task, terminal?.instanceId)); } else if (event.kind === ProblemCollectorEventKind.BackgroundProcessingEnds) { eventCounter--; if (this._busyTasks[mapKey]) { delete this._busyTasks[mapKey]; } - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task, terminal?.instanceId)); if (eventCounter === 0) { if ((watchingProblemMatcher.numberOfMatches > 0) && watchingProblemMatcher.maxMarkerSeverity && (watchingProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error)) { @@ -880,13 +880,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { let processStartedSignaled = false; terminal.processReady.then(() => { if (!processStartedSignaled) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.instanceId, terminal!.processId!)); processStartedSignaled = true; } }, (_error) => { this._logService.error('Task terminal process never got ready'); }); - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Start, task, terminal.instanceId)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Start, task, terminal.instanceId, resolver.values)); const onData = terminal.onLineData((line) => { watchingProblemMatcher.processLine(line); if (!delayer) { @@ -933,13 +933,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { watchingProblemMatcher.done(); watchingProblemMatcher.dispose(); if (!processStartedSignaled) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.instanceId, terminal!.processId!)); processStartedSignaled = true; } - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, exitCode ?? undefined)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, terminal!.instanceId, exitCode)); for (let i = 0; i < eventCounter; i++) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task, terminal!.instanceId)); } eventCounter = 0; this._fireTaskEvent(TaskEvent.create(TaskEventKind.End, task)); @@ -975,7 +975,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { let processStartedSignaled = false; terminal.processReady.then(() => { if (!processStartedSignaled) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.instanceId, terminal!.processId!)); processStartedSignaled = true; } }, (_error) => { @@ -984,7 +984,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { this._fireTaskEvent(TaskEvent.create(TaskEventKind.Start, task, terminal.instanceId, resolver.values)); const mapKey = task.getMapKey(); this._busyTasks[mapKey] = task; - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Active, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Active, task, terminal.instanceId)); const problemMatchers = await this._resolveMatchers(resolver, task.configurationProperties.problemMatchers); const startStopProblemMatcher = new StartStopProblemCollector(problemMatchers, this._markerService, this._modelService, ProblemHandlingStrategy.Clean, this._fileService); this._terminalStatusManager.addTerminal(task, terminal, startStopProblemMatcher); @@ -1031,16 +1031,16 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { startStopProblemMatcher.dispose(); }, 100); if (!processStartedSignaled && terminal) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal.processId!)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal.instanceId, terminal.processId!)); processStartedSignaled = true; } - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, exitCode ?? undefined)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, terminal?.instanceId, exitCode ?? undefined)); if (this._busyTasks[mapKey]) { delete this._busyTasks[mapKey]; } - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task)); - this._fireTaskEvent(TaskEvent.create(TaskEventKind.End, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task, terminal?.instanceId)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.End, task, terminal?.instanceId)); resolve({ exitCode: exitCode ?? undefined }); }); }); diff --git a/src/vs/workbench/contrib/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts index b6a5922064ec7..5901b5321a094 100644 --- a/src/vs/workbench/contrib/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -1139,11 +1139,11 @@ export const enum TaskRunSource { } export namespace TaskEvent { - export function create(kind: TaskEventKind.ProcessStarted | TaskEventKind.ProcessEnded, task: Task, processIdOrExitCode?: number): ITaskEvent; + export function create(kind: TaskEventKind.ProcessStarted | TaskEventKind.ProcessEnded, task: Task, terminalId?: number, processIdOrExitCode?: number): ITaskEvent; export function create(kind: TaskEventKind.Start, task: Task, terminalId?: number, resolvedVariables?: Map): ITaskEvent; - export function create(kind: TaskEventKind.AcquiredInput | TaskEventKind.DependsOnStarted | TaskEventKind.Start | TaskEventKind.Active | TaskEventKind.Inactive | TaskEventKind.Terminated | TaskEventKind.End, task: Task, exitReason?: TerminalExitReason): ITaskEvent; + export function create(kind: TaskEventKind.AcquiredInput | TaskEventKind.DependsOnStarted | TaskEventKind.Active | TaskEventKind.Inactive | TaskEventKind.Terminated | TaskEventKind.End, task: Task, terminalId?: number, exitReason?: TerminalExitReason): ITaskEvent; export function create(kind: TaskEventKind.Changed): ITaskEvent; - export function create(kind: TaskEventKind, task?: Task, processIdOrExitCodeOrTerminalId?: number, resolvedVariables?: Map, exitReason?: TerminalExitReason): ITaskEvent { + export function create(kind: TaskEventKind, task?: Task, terminalId?: number, resolvedVariablesORProcessIdOrExitCodeOrExitReason?: number | Map | TerminalExitReason): ITaskEvent { if (task) { const result: ITaskEvent = { kind: kind, @@ -1153,16 +1153,15 @@ export namespace TaskEvent { group: task.configurationProperties.group, processId: undefined as number | undefined, exitCode: undefined as number | undefined, - terminalId: undefined as number | undefined, + terminalId, __task: task }; if (kind === TaskEventKind.Start) { - result.terminalId = processIdOrExitCodeOrTerminalId; - result.resolvedVariables = resolvedVariables; + result.resolvedVariables = resolvedVariablesORProcessIdOrExitCodeOrExitReason as Map; } else if (kind === TaskEventKind.ProcessStarted) { - result.processId = processIdOrExitCodeOrTerminalId; + result.processId = resolvedVariablesORProcessIdOrExitCodeOrExitReason as number; } else if (kind === TaskEventKind.ProcessEnded) { - result.exitCode = processIdOrExitCodeOrTerminalId; + result.exitCode = resolvedVariablesORProcessIdOrExitCodeOrExitReason as number; } return Object.freeze(result); } else {