Skip to content

Commit b9fc2c1

Browse files
committed
debug api: add workspacefolder to DebugSession
1 parent 06a6d53 commit b9fc2c1

File tree

9 files changed

+88
-76
lines changed

9 files changed

+88
-76
lines changed

src/vs/vscode.proposed.d.ts

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,16 @@ declare module 'vscode' {
566566

567567
//#region André: debug
568568

569+
/**
570+
* A debug session.
571+
*/
572+
export interface DebugSession {
573+
/**
574+
* The workspace folder of this DebugSession or undefined for a folderless setup.
575+
*/
576+
readonly workspaceFolder: WorkspaceFolder | undefined;
577+
}
578+
569579
/**
570580
* Represents a debug adapter executable and optional arguments passed to it.
571581
*/
@@ -638,25 +648,10 @@ declare module 'vscode' {
638648

639649
export type DebugAdapterDescriptor = DebugAdapterExecutable | DebugAdapterServer | DebugAdapterImplementation;
640650

641-
/**
642-
* A Debug Adapter Tracker is a means to track the communication between VS Code and a Debug Adapter.
643-
*/
644-
export interface DebugAdapterTracker {
645-
// VS Code -> Debug Adapter
646-
startDebugAdapter?(): void;
647-
toDebugAdapter?(message: any): void;
648-
stopDebugAdapter?(): void;
649-
650-
// Debug Adapter -> VS Code
651-
fromDebugAdapter?(message: any): void;
652-
debugAdapterError?(error: Error): void;
653-
debugAdapterExit?(code?: number, signal?: string): void;
654-
}
655-
656651
export interface DebugConfigurationProvider {
657652
/**
658-
* Deprecated, use DebugConfigurationProvider.provideDebugAdapter instead.
659-
* @deprecated Use DebugConfigurationProvider.provideDebugAdapter instead
653+
* Deprecated, use DebugAdapterProvider.provideDebugAdapter instead.
654+
* @deprecated Use DebugAdapterProvider.provideDebugAdapter instead
660655
*/
661656
debugAdapterExecutable?(folder: WorkspaceFolder | undefined, token?: CancellationToken): ProviderResult<DebugAdapterExecutable>;
662657

@@ -667,7 +662,7 @@ declare module 'vscode' {
667662
* @param config The resolved debug configuration.
668663
* @param token A cancellation token.
669664
*/
670-
provideDebugAdapterTracker?(session: DebugSession, folder: WorkspaceFolder | undefined, config: DebugConfiguration, token?: CancellationToken): ProviderResult<DebugAdapterTracker>;
665+
provideDebugAdapterTracker?(session: DebugSession, config: DebugConfiguration, token?: CancellationToken): ProviderResult<DebugAdapterTracker>;
671666
}
672667

673668
export interface DebugAdapterProvider {
@@ -685,21 +680,35 @@ declare module 'vscode' {
685680
* return executable;
686681
* }
687682
* @param session The [debug session](#DebugSession) for which the debug adapter will be used.
688-
* @param folder The workspace folder from which the configuration originates from or undefined for a folderless setup.
689683
* @param executable The debug adapter's executable information as specified in the package.json (or undefined if no such information exists).
690684
* @param config The resolved debug configuration.
691685
* @param token A cancellation token.
692686
* @return a [debug adapter's descriptor](#DebugAdapterDescriptor) or undefined.
693687
*/
694-
provideDebugAdapter(session: DebugSession, folder: WorkspaceFolder | undefined, executable: DebugAdapterExecutable | undefined, config: DebugConfiguration, token?: CancellationToken): ProviderResult<DebugAdapterDescriptor>;
688+
provideDebugAdapter(session: DebugSession, executable: DebugAdapterExecutable | undefined, config: DebugConfiguration, token?: CancellationToken): ProviderResult<DebugAdapterDescriptor>;
689+
}
690+
691+
/**
692+
* A Debug Adapter Tracker is a means to track the communication between VS Code and a Debug Adapter.
693+
*/
694+
export interface DebugAdapterTracker {
695+
// VS Code -> Debug Adapter
696+
startDebugAdapter?(): void;
697+
toDebugAdapter?(message: any): void;
698+
stopDebugAdapter?(): void;
699+
700+
// Debug Adapter -> VS Code
701+
fromDebugAdapter?(message: any): void;
702+
debugAdapterError?(error: Error): void;
703+
debugAdapterExit?(code?: number, signal?: string): void;
695704
}
696705

697706
export namespace debug {
698707
/**
699-
* Register a [debug adapter provider](#DebugConfigurationProvider) for a specific debug type.
708+
* Register a [debug adapter provider](#DebugAdapterProvider) for a specific debug type.
700709
* Only one provider can be registered for the same type.
701-
* An extension is only allowed to register a DebugAdapterProvider with if the extension defines the debug type. Otherwise an error is thrown.
702-
* Registering more than one DebugAdapterProvider for a type results in an error.
710+
* An extension is only allowed to register a DebugAdapterProvider for the debug type defined by the extension. Otherwise an error is thrown.
711+
* Registering more than one DebugAdapterProvider for a debug type results in an error.
703712
*
704713
* @param type The debug type for which the provider is registered.
705714
* @param provider The [debug adapter provider](#DebugAdapterProvider) to register.

src/vs/workbench/api/electron-browser/mainThreadDebugService.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb
5858

5959
// interface IDebugAdapterProvider
6060

61-
createDebugAdapter(session: IDebugSession, folder: IWorkspaceFolder, config: IConfig): IDebugAdapter {
61+
createDebugAdapter(session: IDebugSession, config: IConfig): IDebugAdapter {
6262
const handle = this._debugAdaptersHandleCounter++;
63-
const da = new ExtensionHostDebugAdapter(handle, this._proxy, this.getSessionDto(session), folder, config);
63+
const da = new ExtensionHostDebugAdapter(handle, this._proxy, this.getSessionDto(session), config);
6464
this._debugAdapters.set(handle, da);
6565
return da;
6666
}
@@ -185,8 +185,8 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb
185185

186186
const provider = <IDebugAdapterProvider>{
187187
type: debugType,
188-
provideDebugAdapter: (session, folder, config) => {
189-
return Promise.resolve(this._proxy.$provideDebugAdapter(handle, this.getSessionDto(session), folder, config));
188+
provideDebugAdapter: (session, config) => {
189+
return Promise.resolve(this._proxy.$provideDebugAdapter(handle, this.getSessionDto(session), config));
190190
}
191191
};
192192
this._debugAdapterProviders.set(handle, provider);
@@ -203,7 +203,6 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb
203203
}
204204
}
205205

206-
207206
public $startDebugging(_folderUri: uri | undefined, nameOrConfiguration: string | IConfig): Thenable<boolean> {
208207
const folderUri = _folderUri ? uri.revive(_folderUri) : undefined;
209208
const launch = this.debugService.getConfigurationManager().getLaunch(folderUri);
@@ -256,7 +255,8 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb
256255
return {
257256
id: <DebugSessionUUID>session.getId(),
258257
type: session.configuration.type,
259-
name: session.configuration.name
258+
name: session.configuration.name,
259+
folderUri: session.root ? session.root.uri : undefined
260260
};
261261
}
262262
return undefined;
@@ -298,7 +298,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb
298298
*/
299299
class ExtensionHostDebugAdapter extends AbstractDebugAdapter {
300300

301-
constructor(private _handle: number, private _proxy: ExtHostDebugServiceShape, private _sessionDto: IDebugSessionDto, private folder: IWorkspaceFolder, private config: IConfig) {
301+
constructor(private _handle: number, private _proxy: ExtHostDebugServiceShape, private _sessionDto: IDebugSessionDto, private config: IConfig) {
302302
super();
303303
}
304304

@@ -311,7 +311,7 @@ class ExtensionHostDebugAdapter extends AbstractDebugAdapter {
311311
}
312312

313313
public startSession(): Promise<void> {
314-
return Promise.resolve(this._proxy.$startDASession(this._handle, this._sessionDto, this.folder ? this.folder.uri : undefined, this.config));
314+
return Promise.resolve(this._proxy.$startDASession(this._handle, this._sessionDto, this.config));
315315
}
316316

317317
public sendMessage(message: DebugProtocol.ProtocolMessage): void {

src/vs/workbench/api/node/extHost.protocol.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -968,18 +968,19 @@ export interface IDebugSessionDto {
968968
id: DebugSessionUUID;
969969
type: string;
970970
name: string;
971+
folderUri: UriComponents | undefined;
971972
}
972973

973974
export interface ExtHostDebugServiceShape {
974975
$substituteVariables(folder: UriComponents | undefined, config: IConfig): Thenable<IConfig>;
975976
$runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Thenable<void>;
976-
$startDASession(handle: number, session: IDebugSessionDto, folder: UriComponents | undefined, debugConfiguration: IConfig): Thenable<void>;
977+
$startDASession(handle: number, session: IDebugSessionDto, debugConfiguration: IConfig): Thenable<void>;
977978
$stopDASession(handle: number): Thenable<void>;
978979
$sendDAMessage(handle: number, message: DebugProtocol.ProtocolMessage): void;
979980
$resolveDebugConfiguration(handle: number, folder: UriComponents | undefined, debugConfiguration: IConfig): Thenable<IConfig>;
980981
$provideDebugConfigurations(handle: number, folder: UriComponents | undefined): Thenable<IConfig[]>;
981982
$legacyDebugAdapterExecutable(handle: number, folderUri: UriComponents | undefined): Thenable<IAdapterDescriptor>; // TODO@AW legacy
982-
$provideDebugAdapter(handle: number, session: IDebugSessionDto, folderUri: UriComponents | undefined, debugConfiguration: IConfig): Thenable<IAdapterDescriptor>;
983+
$provideDebugAdapter(handle: number, session: IDebugSessionDto, debugConfiguration: IConfig): Thenable<IAdapterDescriptor>;
983984
$acceptDebugSessionStarted(session: IDebugSessionDto): void;
984985
$acceptDebugSessionTerminated(session: IDebugSessionDto): void;
985986
$acceptDebugSessionActiveChanged(session: IDebugSessionDto): void;

src/vs/workbench/api/node/extHostDebugService.ts

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -364,10 +364,10 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {
364364
return Promise.resolve(this._variableResolver.resolveAny(ws, config));
365365
}
366366

367-
public $startDASession(handle: number, sessionDto: IDebugSessionDto, folderUri: UriComponents | undefined, config: vscode.DebugConfiguration): Thenable<void> {
367+
public $startDASession(handle: number, sessionDto: IDebugSessionDto, config: vscode.DebugConfiguration): Thenable<void> {
368368
const mythis = this;
369369

370-
return this.getAdapterDescriptor(this.getAdapterProviderByType(config.type), sessionDto, folderUri, config).then(x => {
370+
return this.getAdapterDescriptor(this.getAdapterProviderByType(config.type), sessionDto, config).then(x => {
371371

372372
const adapter = this.convertToDto(x);
373373
let da: AbstractDebugAdapter | undefined = undefined;
@@ -393,7 +393,7 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {
393393
if (da) {
394394
this._debugAdapters.set(handle, da);
395395

396-
return this.getDebugAdapterTrackers(sessionDto, folderUri, config).then(tracker => {
396+
return this.getDebugAdapterTrackers(sessionDto, config).then(tracker => {
397397

398398
if (tracker) {
399399
this._debugAdaptersTrackers.set(handle, tracker);
@@ -565,12 +565,12 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {
565565
return asThenable(() => provider.debugAdapterExecutable(this.getFolder(folderUri), CancellationToken.None)).then(x => this.convertToDto(x));
566566
}
567567

568-
public $provideDebugAdapter(handle: number, sessionDto: IDebugSessionDto, folderUri: UriComponents | undefined, config: vscode.DebugConfiguration): Thenable<IAdapterDescriptor> {
568+
public $provideDebugAdapter(handle: number, sessionDto: IDebugSessionDto, config: vscode.DebugConfiguration): Thenable<IAdapterDescriptor> {
569569
let adapterProvider = this.getAdapterProviderByHandle(handle);
570570
if (!adapterProvider) {
571571
return Promise.reject(new Error('no handler found'));
572572
}
573-
return this.getAdapterDescriptor(adapterProvider, sessionDto, folderUri, config).then(x => this.convertToDto(x));
573+
return this.getAdapterDescriptor(adapterProvider, sessionDto, config).then(x => this.convertToDto(x));
574574
}
575575

576576
public $acceptDebugSessionStarted(sessionDto: IDebugSessionDto): void {
@@ -668,15 +668,14 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {
668668
return false;
669669
}
670670

671-
private getDebugAdapterTrackers(sessionDto: IDebugSessionDto, folderUri: UriComponents | undefined, config: vscode.DebugConfiguration): Promise<vscode.DebugAdapterTracker> {
671+
private getDebugAdapterTrackers(sessionDto: IDebugSessionDto, config: vscode.DebugConfiguration): Promise<vscode.DebugAdapterTracker> {
672672

673673
const session = this.getSession(sessionDto);
674-
const folder = this.getFolder(folderUri);
675674

676675
const type = config.type;
677676
const promises = this._configProviders
678677
.filter(pair => pair.provider.provideDebugAdapterTracker && (pair.type === type || pair.type === '*'))
679-
.map(pair => asThenable(() => pair.provider.provideDebugAdapterTracker(session, folder, config, CancellationToken.None)).then(p => p).catch(err => null));
678+
.map(pair => asThenable(() => pair.provider.provideDebugAdapterTracker(session, config, CancellationToken.None)).then(p => p).catch(err => null));
680679

681680
return Promise.race([
682681
Promise.all(promises).then(trackers => {
@@ -698,30 +697,34 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {
698697
});
699698
}
700699

701-
private getAdapterDescriptor(adapterProvider: vscode.DebugAdapterProvider, sessionDto: IDebugSessionDto, folderUri: UriComponents | undefined, config: vscode.DebugConfiguration): Thenable<vscode.DebugAdapterDescriptor> {
700+
private getAdapterDescriptor(adapterProvider: vscode.DebugAdapterProvider, sessionDto: IDebugSessionDto, config: vscode.DebugConfiguration): Thenable<vscode.DebugAdapterDescriptor> {
702701

703702
// a "debugServer" attribute in the launch config takes precedence
704703
if (typeof config.debugServer === 'number') {
705704
return Promise.resolve(new DebugAdapterServer(config.debugServer));
706705
}
707706

707+
const session = this.getSession(sessionDto);
708+
708709
// TODO@AW legacy
709710
const pairs = this._configProviders.filter(p => p.type === config.type);
710711
if (pairs.length > 0) {
711712
if (pairs[0].provider.debugAdapterExecutable) {
712-
return asThenable(() => pairs[0].provider.debugAdapterExecutable(this.getFolder(folderUri), CancellationToken.None));
713+
return asThenable(() => pairs[0].provider.debugAdapterExecutable(session.workspaceFolder, CancellationToken.None));
713714
}
714715
}
715716

716717
if (adapterProvider) {
717718
const adapterExecutable = ExecutableDebugAdapter.platformAdapterExecutable(this._extensionService.getAllExtensionDescriptions(), config.type);
718-
return asThenable(() => adapterProvider.provideDebugAdapter(this.getSession(sessionDto), this.getFolder(folderUri), adapterExecutable, config, CancellationToken.None));
719+
return asThenable(() => adapterProvider.provideDebugAdapter(session, adapterExecutable, config, CancellationToken.None));
719720
}
720721

721722
// try deprecated command based extension API "adapterExecutableCommand" to determine the executable
723+
// TODO@AW legacy
722724
const aex = this._aexCommands.get(config.type);
723725
if (aex) {
724-
const rootFolder = folderUri ? URI.revive(folderUri).toString() : undefined;
726+
const folder = session.workspaceFolder;
727+
const rootFolder = folder ? folder.uri.toString() : undefined;
725728
return this._commandService.executeCommand(aex, rootFolder).then((ae: { command: string, args: string[] }) => {
726729
return new DebugAdapterExecutable(ae.command, ae.args || []);
727730
});
@@ -752,7 +755,7 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {
752755
if (dto) {
753756
let debugSession = this._debugSessions.get(dto.id);
754757
if (!debugSession) {
755-
debugSession = new ExtHostDebugSession(this._debugServiceProxy, dto.id, dto.type, dto.name);
758+
debugSession = new ExtHostDebugSession(this._debugServiceProxy, dto.id, dto.type, dto.name, this.getFolder(dto.folderUri));
756759
this._debugSessions.set(dto.id, debugSession);
757760
}
758761
return debugSession;
@@ -771,17 +774,12 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape {
771774

772775
export class ExtHostDebugSession implements vscode.DebugSession {
773776

774-
private _debugServiceProxy: MainThreadDebugServiceShape;
775-
776-
private _id: DebugSessionUUID;
777-
private _type: string;
778-
private _name: string;
779-
780-
constructor(proxy: MainThreadDebugServiceShape, id: DebugSessionUUID, type: string, name: string) {
781-
this._debugServiceProxy = proxy;
782-
this._id = id;
783-
this._type = type;
784-
this._name = name;
777+
constructor(
778+
private _debugServiceProxy: MainThreadDebugServiceShape,
779+
private _id: DebugSessionUUID,
780+
private _type: string,
781+
private _name: string,
782+
private _workspaceFolder: vscode.WorkspaceFolder | undefined) {
785783
}
786784

787785
public get id(): string {
@@ -796,6 +794,10 @@ export class ExtHostDebugSession implements vscode.DebugSession {
796794
return this._name;
797795
}
798796

797+
public get workspaceFolder(): vscode.WorkspaceFolder | undefined {
798+
return this._workspaceFolder;
799+
}
800+
799801
public customRequest(command: string, args: any): Thenable<any> {
800802
return this._debugServiceProxy.$customDebugAdapterRequest(this._id, command, args);
801803
}

src/vs/workbench/parts/debug/common/debug.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export interface IExpression extends IReplElement, IExpressionContainer {
110110
}
111111

112112
export interface IDebugger {
113-
createDebugAdapter(session: IDebugSession, root: IWorkspaceFolder, config: IConfig, outputService: IOutputService): Promise<IDebugAdapter>;
113+
createDebugAdapter(session: IDebugSession, config: IConfig, outputService: IOutputService): Promise<IDebugAdapter>;
114114
runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments): Promise<void>;
115115
getCustomTelemetryService(): Thenable<TelemetryService>;
116116
}
@@ -468,7 +468,7 @@ export interface IDebugAdapter extends IDisposable {
468468
}
469469

470470
export interface IDebugAdapterFactory extends ITerminalLauncher {
471-
createDebugAdapter(session: IDebugSession, folder: IWorkspaceFolder, config: IConfig): IDebugAdapter;
471+
createDebugAdapter(session: IDebugSession, config: IConfig): IDebugAdapter;
472472
substituteVariables(folder: IWorkspaceFolder, config: IConfig): Promise<IConfig>;
473473
}
474474

@@ -535,7 +535,7 @@ export interface IDebugConfigurationProvider {
535535

536536
export interface IDebugAdapterProvider {
537537
readonly type: string;
538-
provideDebugAdapter(session: IDebugSession, folderUri: uri | undefined, config: IConfig): Promise<IAdapterDescriptor>;
538+
provideDebugAdapter(session: IDebugSession, config: IConfig): Promise<IAdapterDescriptor>;
539539
}
540540

541541
export interface ITerminalLauncher {
@@ -592,10 +592,10 @@ export interface IConfigurationManager {
592592
unregisterDebugAdapterProvider(debugConfigurationProvider: IDebugAdapterProvider): void;
593593

594594
resolveConfigurationByProviders(folderUri: uri | undefined, type: string | undefined, debugConfiguration: any): Thenable<any>;
595-
provideDebugAdapter(session: IDebugSession, folderUri: uri | undefined, config: IConfig): Promise<IAdapterDescriptor | undefined>;
595+
provideDebugAdapter(session: IDebugSession, config: IConfig): Promise<IAdapterDescriptor | undefined>;
596596

597597
registerDebugAdapterFactory(debugTypes: string[], debugAdapterFactory: IDebugAdapterFactory): IDisposable;
598-
createDebugAdapter(session: IDebugSession, folder: IWorkspaceFolder, config: IConfig): IDebugAdapter;
598+
createDebugAdapter(session: IDebugSession, config: IConfig): IDebugAdapter;
599599

600600
substituteVariables(debugType: string, folder: IWorkspaceFolder, config: IConfig): Promise<IConfig>;
601601
runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): Promise<void>;

src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ export class ConfigurationManager implements IConfigurationManager {
9292
};
9393
}
9494

95-
public createDebugAdapter(session: IDebugSession, folder: IWorkspaceFolder, config: IConfig): IDebugAdapter {
95+
public createDebugAdapter(session: IDebugSession, config: IConfig): IDebugAdapter {
9696
let dap = this.debugAdapterFactories.get(config.type);
9797
if (dap) {
98-
return dap.createDebugAdapter(session, folder, config);
98+
return dap.createDebugAdapter(session, config);
9999
}
100100
return undefined;
101101
}
@@ -137,20 +137,20 @@ export class ConfigurationManager implements IConfigurationManager {
137137
}
138138
}
139139

140-
public provideDebugAdapter(session: IDebugSession, folderUri: uri | undefined, config: IConfig): Promise<IAdapterDescriptor | undefined> {
140+
public provideDebugAdapter(session: IDebugSession, config: IConfig): Promise<IAdapterDescriptor | undefined> {
141141

142142
// first try legacy proposed API: DebugConfigurationProvider.debugAdapterExecutable
143143
const providers0 = this.configProviders.filter(p => p.type === config.type && p.debugAdapterExecutable);
144144
if (providers0.length === 1) {
145-
return providers0[0].debugAdapterExecutable(folderUri);
145+
return providers0[0].debugAdapterExecutable(session.root ? session.root.uri : undefined);
146146
} else {
147147
// TODO@AW handle n > 1 case
148148
}
149149

150150
// try new proposed API
151151
const providers = this.adapterProviders.filter(p => p.type === config.type && p.provideDebugAdapter);
152152
if (providers.length === 1) {
153-
return providers[0].provideDebugAdapter(session, folderUri, config);
153+
return providers[0].provideDebugAdapter(session, config);
154154
} else {
155155
// TODO@AW handle n > 1 case
156156
}

0 commit comments

Comments
 (0)