From 74fae4d7df5e6273362d2b6aea67cd6acbdcdcef Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 5 Oct 2018 16:48:23 +0200 Subject: [PATCH] repl: multiple trees per session --- src/vs/workbench/parts/debug/common/debug.ts | 2 +- .../parts/debug/common/debugModel.ts | 4 --- .../debug/electron-browser/debugService.ts | 2 +- .../parts/debug/electron-browser/repl.ts | 27 ++++++++++++++----- .../debug/electron-browser/replViewer.ts | 7 ++--- .../parts/debug/test/common/mockDebug.ts | 3 +++ .../test/electron-browser/debugModel.test.ts | 2 +- 7 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index c55dfbf657d..44f82c5c4cc 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -166,6 +166,7 @@ export interface IDebugSession extends ITreeElement { // session events readonly onDidEndAdapter: Event; readonly onDidChangeState: Event; + readonly onDidChangeReplElements: Event; // DA capabilities readonly capabilities: DebugProtocol.Capabilities; @@ -381,7 +382,6 @@ export interface IDebugModel extends ITreeElement { getFunctionBreakpoints(): ReadonlyArray; getExceptionBreakpoints(): ReadonlyArray; getWatchExpressions(): ReadonlyArray; - getReplElements(): ReadonlyArray; onDidChangeBreakpoints: Event; onDidChangeCallStack: Event; diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 645863e5415..a5f38180727 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -1005,10 +1005,6 @@ export class DebugModel implements IDebugModel { this._onDidChangeBreakpoints.fire({ removed: removed }); } - public getReplElements(): ReadonlyArray { - return this.sessions.map(s => s.getReplElements()).reduce((left, right) => left.concat(right), []); - } - public getWatchExpressions(): Expression[] { return this.watchExpressions; } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index fb865f6b732..0e14007ff79 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -471,7 +471,7 @@ export class DebugService implements IDebugService { } // Show the repl if some error got logged there #5870 - if (this.model.getReplElements().length > 0) { + if (session && session.getReplElements().length > 0) { this.panelService.openPanel(REPL_ID, false); } diff --git a/src/vs/workbench/parts/debug/electron-browser/repl.ts b/src/vs/workbench/parts/debug/electron-browser/repl.ts index 91385d3cd89..65318430dfc 100644 --- a/src/vs/workbench/parts/debug/electron-browser/repl.ts +++ b/src/vs/workbench/parts/debug/electron-browser/repl.ts @@ -37,7 +37,7 @@ import { clipboard } from 'electron'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { WorkbenchTree } from 'vs/platform/list/browser/listService'; import { memoize } from 'vs/base/common/decorators'; -import { dispose } from 'vs/base/common/lifecycle'; +import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { OpenMode, ClickBehavior } from 'vs/base/parts/tree/browser/treeDefaults'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; @@ -106,10 +106,21 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati } private registerListeners(): void { - // TODO@Isidor - // this._register(this.debugService.getModel().onDidChangeReplElements(() => { - // this.refreshReplElements(this.debugService.getModel().getReplElements().length === 0); - // })); + let replElementsChangeListener: IDisposable; + this._register(this.debugService.getViewModel().onDidFocusSession(session => { + if (replElementsChangeListener) { + replElementsChangeListener.dispose(); + } + if (session) { + replElementsChangeListener = session.onDidChangeReplElements(() => { + this.refreshReplElements(session.getReplElements().length === 0); + }); + + if (this.tree && this.isVisible()) { + this.tree.setInput(session); + } + } + })); this._register(this.panelService.onDidPanelOpen(panel => this.refreshReplElements(true))); } @@ -149,8 +160,6 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati accessibilityProvider: new ReplExpressionsAccessibilityProvider(), controller }, replTreeOptions); - - await this.tree.setInput(this.debugService.getModel()); } public setVisible(visible: boolean): Promise { @@ -159,6 +168,10 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati } else { this.model = this.modelService.createModel('', null, uri.parse(`${DEBUG_SCHEME}:replinput`), true); this.replInput.setModel(this.model); + const focusedSession = this.debugService.getViewModel().focusedSession; + if (focusedSession && this.tree.getInput() !== focusedSession) { + this.tree.setInput(focusedSession); + } } return super.setVisible(visible); diff --git a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts index 8d25a480f76..fecd8d36b1f 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts @@ -15,7 +15,7 @@ import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { ITree, IAccessibilityProvider, ContextMenuEvent, IDataSource, IRenderer, IActionProvider } from 'vs/base/parts/tree/browser/tree'; import { ICancelableEvent } from 'vs/base/parts/tree/browser/treeDefaults'; import { IExpressionContainer, IExpression, IReplElementSource } from 'vs/workbench/parts/debug/common/debug'; -import { DebugModel, RawObjectReplElement, Expression, SimpleReplElement, Variable } from 'vs/workbench/parts/debug/common/debugModel'; +import { RawObjectReplElement, Expression, SimpleReplElement, Variable } from 'vs/workbench/parts/debug/common/debugModel'; import { renderVariable, renderExpressionValue, IVariableTemplateData, BaseDebugController } from 'vs/workbench/parts/debug/browser/baseDebugView'; import { ClearReplAction, ReplCollapseAllAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { CopyAction, CopyAllAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; @@ -24,6 +24,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; import { handleANSIOutput } from 'vs/workbench/parts/debug/browser/debugANSIHandling'; import { ILabelService } from 'vs/platform/label/common/label'; +import { DebugSession } from 'vs/workbench/parts/debug/electron-browser/debugSession'; const $ = dom.$; @@ -34,11 +35,11 @@ export class ReplExpressionsDataSource implements IDataSource { } public hasChildren(tree: ITree, element: any): boolean { - return element instanceof DebugModel || (element).hasChildren; + return element instanceof DebugSession || (element).hasChildren; } public getChildren(tree: ITree, element: any): TPromise { - if (element instanceof DebugModel) { + if (element instanceof DebugSession) { return Promise.resolve(element.getReplElements()); } if (element instanceof RawObjectReplElement) { diff --git a/src/vs/workbench/parts/debug/test/common/mockDebug.ts b/src/vs/workbench/parts/debug/test/common/mockDebug.ts index 1dc75aa1bfd..6e0a061ee05 100644 --- a/src/vs/workbench/parts/debug/test/common/mockDebug.ts +++ b/src/vs/workbench/parts/debug/test/common/mockDebug.ts @@ -133,6 +133,9 @@ export class MockSession implements IDebugSession { } removeReplExpressions(): void { } + get onDidChangeReplElements(): Event { + return null; + } addReplExpression(stackFrame: IStackFrame, name: string): TPromise { return TPromise.as(void 0); diff --git a/src/vs/workbench/parts/debug/test/electron-browser/debugModel.test.ts b/src/vs/workbench/parts/debug/test/electron-browser/debugModel.test.ts index 10e6620ef1c..456fe32d5f6 100644 --- a/src/vs/workbench/parts/debug/test/electron-browser/debugModel.test.ts +++ b/src/vs/workbench/parts/debug/test/electron-browser/debugModel.test.ts @@ -340,8 +340,8 @@ suite('Debug - Model', () => { }); test('repl expressions', () => { - assert.equal(model.getReplElements().length, 0); const session = new DebugSession({ resolved: { name: 'mockSession', type: 'node', request: 'launch' }, unresolved: undefined }, undefined, model, undefined, undefined, undefined, undefined, undefined, undefined, undefined); + assert.equal(session.getReplElements().length, 0); model.addSession(session); session['raw'] = rawSession;