Path: blob/main/src/vs/workbench/contrib/debug/browser/debugProgress.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Event } from '../../../../base/common/event.js';6import { IDisposable, dispose } from '../../../../base/common/lifecycle.js';7import { IProgressService, ProgressLocation } from '../../../../platform/progress/common/progress.js';8import { IWorkbenchContribution } from '../../../common/contributions.js';9import { IDebugService, IDebugSession, VIEWLET_ID } from '../common/debug.js';10import { IViewsService } from '../../../services/views/common/viewsService.js';1112export class DebugProgressContribution implements IWorkbenchContribution {1314private toDispose: IDisposable[] = [];1516constructor(17@IDebugService debugService: IDebugService,18@IProgressService progressService: IProgressService,19@IViewsService viewsService: IViewsService20) {21let progressListener: IDisposable | undefined;22const listenOnProgress = (session: IDebugSession | undefined) => {23if (progressListener) {24progressListener.dispose();25progressListener = undefined;26}27if (session) {28progressListener = session.onDidProgressStart(async progressStartEvent => {29const promise = new Promise<void>(r => {30// Show progress until a progress end event comes or the session ends31const listener = Event.any(Event.filter(session.onDidProgressEnd, e => e.body.progressId === progressStartEvent.body.progressId),32session.onDidEndAdapter)(() => {33listener.dispose();34r();35});36});3738if (viewsService.isViewContainerVisible(VIEWLET_ID)) {39progressService.withProgress({ location: VIEWLET_ID }, () => promise);40}41const source = debugService.getAdapterManager().getDebuggerLabel(session.configuration.type);42progressService.withProgress({43location: ProgressLocation.Notification,44title: progressStartEvent.body.title,45cancellable: progressStartEvent.body.cancellable,46source,47delay: 50048}, progressStep => {49let total = 0;50const reportProgress = (progress: { message?: string; percentage?: number }) => {51let increment = undefined;52if (typeof progress.percentage === 'number') {53increment = progress.percentage - total;54total += increment;55}56progressStep.report({57message: progress.message,58increment,59total: typeof increment === 'number' ? 100 : undefined,60});61};6263if (progressStartEvent.body.message) {64reportProgress(progressStartEvent.body);65}66const progressUpdateListener = session.onDidProgressUpdate(e => {67if (e.body.progressId === progressStartEvent.body.progressId) {68reportProgress(e.body);69}70});7172return promise.then(() => progressUpdateListener.dispose());73}, () => session.cancel(progressStartEvent.body.progressId));74});75}76};77this.toDispose.push(debugService.getViewModel().onDidFocusSession(listenOnProgress));78listenOnProgress(debugService.getViewModel().focusedSession);79this.toDispose.push(debugService.onWillNewSession(session => {80if (!progressListener) {81listenOnProgress(session);82}83}));84}8586dispose(): void {87dispose(this.toDispose);88}89}909192