diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 5ce7b6017b1..e70b95021c4 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode'; import { basename } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { ExtHostTreeViewsShape, MainThreadTreeViewsShape } from './extHost.protocol'; import { ITreeItem, TreeViewItemHandleArg, ITreeItemLabel, IRevealOptions } from 'vs/workbench/common/views'; import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/common/extHostCommands'; @@ -139,7 +139,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { type Root = null | undefined; type TreeData = { message: boolean, element: T | Root | false }; -interface TreeNode { +interface TreeNode extends IDisposable { item: ITreeItem; parent: TreeNode | Root; children?: TreeNode[]; @@ -421,6 +421,7 @@ class ExtHostTreeView extends Disposable { if (extTreeItem) { const newNode = this.createTreeNode(extElement, extTreeItem, existing.parent); this.updateNodeCache(extElement, newNode, existing, existing.parent); + existing.dispose(); return newNode; } return null; @@ -441,15 +442,7 @@ class ExtHostTreeView extends Disposable { } private createTreeNode(element: T, extensionTreeItem: vscode.TreeItem, parent: TreeNode | Root): TreeNode { - return { - item: this.createTreeItem(element, extensionTreeItem, parent), - parent, - children: undefined - }; - } - - private createTreeItem(element: T, extensionTreeItem: vscode.TreeItem, parent: TreeNode | Root): ITreeItem { - + const disposable: DisposableStore = new DisposableStore(); const handle = this.createHandle(element, extensionTreeItem, parent); const icon = this.getLightIconPath(extensionTreeItem); const item = { @@ -459,7 +452,7 @@ class ExtHostTreeView extends Disposable { description: extensionTreeItem.description, resourceUri: extensionTreeItem.resourceUri, tooltip: typeof extensionTreeItem.tooltip === 'string' ? extensionTreeItem.tooltip : undefined, - command: extensionTreeItem.command ? this.commands.toInternal(extensionTreeItem.command) : undefined, + command: extensionTreeItem.command ? this.commands.toInternal2(extensionTreeItem.command, disposable) : undefined, contextValue: extensionTreeItem.contextValue, icon, iconDark: this.getDarkIconPath(extensionTreeItem) || icon, @@ -467,7 +460,12 @@ class ExtHostTreeView extends Disposable { collapsibleState: isUndefinedOrNull(extensionTreeItem.collapsibleState) ? TreeItemCollapsibleState.None : extensionTreeItem.collapsibleState }; - return item; + return { + item, + parent, + children: undefined, + dispose() { disposable.dispose(); } + }; } private createHandle(element: T, { id, label, resourceUri }: vscode.TreeItem, parent: TreeNode | Root, returnFirst?: boolean): TreeItemHandle { @@ -593,12 +591,14 @@ class ExtHostTreeView extends Disposable { } this.nodes.delete(element); this.elements.delete(node.item.handle); + node.dispose(); } } private clearAll(): void { this.roots = null; this.elements.clear(); + this.nodes.forEach(node => node.dispose()); this.nodes.clear(); }