未验证 提交 88e80b9a 编写于 作者: C Connor Peet

debug: restart as extension host if any parent is an extension host

上级 d3cda21f
...@@ -41,7 +41,7 @@ import { deepClone, equals } from 'vs/base/common/objects'; ...@@ -41,7 +41,7 @@ import { deepClone, equals } from 'vs/base/common/objects';
import { DebugSession } from 'vs/workbench/contrib/debug/browser/debugSession'; import { DebugSession } from 'vs/workbench/contrib/debug/browser/debugSession';
import { dispose, IDisposable } from 'vs/base/common/lifecycle'; 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 { 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 { isErrorWithActions, createErrorWithActions } from 'vs/base/common/errorsWithActions';
import { RunOnceScheduler } from 'vs/base/common/async'; import { RunOnceScheduler } from 'vs/base/common/async';
import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug';
...@@ -539,8 +539,9 @@ export class DebugService implements IDebugService { ...@@ -539,8 +539,9 @@ export class DebugService implements IDebugService {
} }
// 'Run without debugging' mode VSCode must terminate the extension host. More details: #3905 // 'Run without debugging' mode VSCode must terminate the extension host. More details: #3905
if (isExtensionHostDebugging(session.configuration) && session.state === State.Running && session.configuration.noDebug) { const extensionDebugSession = getExtensionHostDebugSession(session);
this.extensionHostDebugService.close(session.getId()); if (extensionDebugSession && extensionDebugSession.state === State.Running && extensionDebugSession.configuration.noDebug) {
this.extensionHostDebugService.close(extensionDebugSession.getId());
} }
this.telemetryDebugSessionStop(session, adapterExitEvent); this.telemetryDebugSessionStop(session, adapterExitEvent);
...@@ -590,10 +591,11 @@ export class DebugService implements IDebugService { ...@@ -590,10 +591,11 @@ export class DebugService implements IDebugService {
return this.runTaskAndCheckErrors(session.root, session.configuration.preLaunchTask); return this.runTaskAndCheckErrors(session.root, session.configuration.preLaunchTask);
}; };
if (isExtensionHostDebugging(session.configuration)) { const extensionDebugSession = getExtensionHostDebugSession(session);
if (extensionDebugSession) {
const taskResult = await runTasks(); const taskResult = await runTasks();
if (taskResult === TaskRunResult.Success) { if (taskResult === TaskRunResult.Success) {
this.extensionHostDebugService.reload(session.getId()); this.extensionHostDebugService.reload(extensionDebugSession.getId());
} }
return; return;
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { equalsIgnoreCase } from 'vs/base/common/strings'; 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 { URI as uri } from 'vs/base/common/uri';
import { isAbsolute } from 'vs/base/common/path'; import { isAbsolute } from 'vs/base/common/path';
import { deepClone } from 'vs/base/common/objects'; import { deepClone } from 'vs/base/common/objects';
...@@ -24,19 +24,28 @@ export function formatPII(value: string, excludePII: boolean, args: { [key: stri ...@@ -24,19 +24,28 @@ export function formatPII(value: string, excludePII: boolean, args: { [key: stri
} }
export function isSessionAttach(session: IDebugSession): boolean { 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) { * Returns the session or any parent which is an extension host debug session.
return false; * 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' if (type === 'vslsShare') {
? (<any>config).adapterProxy.configuration.type type = (<any>session.configuration).adapterProxy.configuration.type;
: config.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 // only a debugger contributions with a label, program, or runtime attribute is considered a "defining" or "main" debugger contribution
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册