From 88e80b9a18b2cc3de0ca3a02977c3e2d4b088a60 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 4 Dec 2019 16:05:33 -0800 Subject: [PATCH] debug: restart as extension host if any parent is an extension host --- .../contrib/debug/browser/debugService.ts | 12 +++++---- .../contrib/debug/common/debugUtils.ts | 27 ++++++++++++------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugService.ts b/src/vs/workbench/contrib/debug/browser/debugService.ts index 24dc3d59a8c..81841ebec67 100644 --- a/src/vs/workbench/contrib/debug/browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugService.ts @@ -41,7 +41,7 @@ import { deepClone, equals } from 'vs/base/common/objects'; import { DebugSession } from 'vs/workbench/contrib/debug/browser/debugSession'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IDebugService, State, IDebugSession, CONTEXT_DEBUG_TYPE, CONTEXT_DEBUG_STATE, CONTEXT_IN_DEBUG_MODE, IThread, IDebugConfiguration, VIEWLET_ID, REPL_ID, IConfig, ILaunch, IViewModel, IConfigurationManager, IDebugModel, IEnablement, IBreakpoint, IBreakpointData, ICompound, IGlobalConfig, IStackFrame, AdapterEndEvent, getStateLabel, IDebugSessionOptions, CONTEXT_DEBUG_UX } from 'vs/workbench/contrib/debug/common/debug'; -import { isExtensionHostDebugging } from 'vs/workbench/contrib/debug/common/debugUtils'; +import { getExtensionHostDebugSession } from 'vs/workbench/contrib/debug/common/debugUtils'; import { isErrorWithActions, createErrorWithActions } from 'vs/base/common/errorsWithActions'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; @@ -539,8 +539,9 @@ export class DebugService implements IDebugService { } // 'Run without debugging' mode VSCode must terminate the extension host. More details: #3905 - if (isExtensionHostDebugging(session.configuration) && session.state === State.Running && session.configuration.noDebug) { - this.extensionHostDebugService.close(session.getId()); + const extensionDebugSession = getExtensionHostDebugSession(session); + if (extensionDebugSession && extensionDebugSession.state === State.Running && extensionDebugSession.configuration.noDebug) { + this.extensionHostDebugService.close(extensionDebugSession.getId()); } this.telemetryDebugSessionStop(session, adapterExitEvent); @@ -590,10 +591,11 @@ export class DebugService implements IDebugService { return this.runTaskAndCheckErrors(session.root, session.configuration.preLaunchTask); }; - if (isExtensionHostDebugging(session.configuration)) { + const extensionDebugSession = getExtensionHostDebugSession(session); + if (extensionDebugSession) { const taskResult = await runTasks(); if (taskResult === TaskRunResult.Success) { - this.extensionHostDebugService.reload(session.getId()); + this.extensionHostDebugService.reload(extensionDebugSession.getId()); } return; diff --git a/src/vs/workbench/contrib/debug/common/debugUtils.ts b/src/vs/workbench/contrib/debug/common/debugUtils.ts index 38aebf4b083..89c02df8bb7 100644 --- a/src/vs/workbench/contrib/debug/common/debugUtils.ts +++ b/src/vs/workbench/contrib/debug/common/debugUtils.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { equalsIgnoreCase } from 'vs/base/common/strings'; -import { IConfig, IDebuggerContribution, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebuggerContribution, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; import { URI as uri } from 'vs/base/common/uri'; import { isAbsolute } from 'vs/base/common/path'; import { deepClone } from 'vs/base/common/objects'; @@ -24,19 +24,28 @@ export function formatPII(value: string, excludePII: boolean, args: { [key: stri } export function isSessionAttach(session: IDebugSession): boolean { - return !session.parentSession && session.configuration.request === 'attach' && !isExtensionHostDebugging(session.configuration); + return !session.parentSession && session.configuration.request === 'attach' && !getExtensionHostDebugSession(session); } -export function isExtensionHostDebugging(config: IConfig) { - if (!config.type) { - return false; +/** + * Returns the session or any parent which is an extension host debug session. + * Returns undefined if there's none. + */ +export function getExtensionHostDebugSession(session: IDebugSession): IDebugSession | void { + let type = session.configuration.type; + if (!type) { + return; } - const type = config.type === 'vslsShare' - ? (config).adapterProxy.configuration.type - : config.type; + if (type === 'vslsShare') { + type = (session.configuration).adapterProxy.configuration.type; + } + + if (equalsIgnoreCase(type, 'extensionhost') || equalsIgnoreCase(type, 'pwa-extensionhost')) { + return session; + } - return equalsIgnoreCase(type, 'extensionhost') || equalsIgnoreCase(type, 'pwa-extensionhost'); + return session.parentSession ? getExtensionHostDebugSession(session.parentSession) : undefined; } // only a debugger contributions with a label, program, or runtime attribute is considered a "defining" or "main" debugger contribution -- GitLab