diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index a96594f0e3a..0f7194fcc70 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -78,6 +78,7 @@ interface TreeNode { class ExtHostTreeView extends Disposable { private static LABEL_HANDLE_PREFIX = '0'; + private static ID_HANDLE_PREFIX = '1'; private rootHandles: TreeItemHandle[] = []; private elements: Map = new Map(); @@ -105,6 +106,9 @@ class ExtHostTreeView extends Disposable { asWinJsPromise(() => this.dataProvider.getTreeItem(element)) .then(extTreeItem => { if (extTreeItem) { + if (typeof element === 'string' && this.elements.has(this.createHandle(element, extTreeItem))) { + throw new Error(localize('treeView.duplicateElement', 'Element {0} is already registered', element)); + } return { element, extTreeItem }; } return null; @@ -194,6 +198,10 @@ class ExtHostTreeView extends Disposable { } private createHandle(element: T, { label }: vscode.TreeItem, parentHandle?: TreeItemHandle): TreeItemHandle { + if (typeof element === 'string') { + return `${ExtHostTreeView.ID_HANDLE_PREFIX}/${element}`; + } + const prefix = parentHandle ? parentHandle : ExtHostTreeView.LABEL_HANDLE_PREFIX; label = label.indexOf('/') !== -1 ? label.replace('/', '//') : label; const existingHandle = this.nodes.has(element) ? this.nodes.get(element).handle : void 0; diff --git a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts index c5a1d5824b6..8cf64585e53 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts @@ -111,24 +111,24 @@ suite('ExtHostTreeView', function () { return testObject.$getElements('testStringTreeProvider') .then(elements => { const actuals = elements.map(e => e.handle); - assert.deepEqual(actuals, ['0/0:a', '0/0:b']); + assert.deepEqual(actuals, ['1/a', '1/b']); return TPromise.join([ - testObject.$getChildren('testStringTreeProvider', '0/0:a') + testObject.$getChildren('testStringTreeProvider', '1/a') .then(children => { const actuals = children.map(e => e.handle); - assert.deepEqual(actuals, ['0/0:a/0:aa', '0/0:a/0:ab']); + assert.deepEqual(actuals, ['1/aa', '1/ab']); return TPromise.join([ - testObject.$getChildren('testStringTreeProvider', '0/0:a/0:aa').then(children => assert.equal(children.length, 0)), - testObject.$getChildren('testStringTreeProvider', '0/0:a/0:ab').then(children => assert.equal(children.length, 0)) + testObject.$getChildren('testStringTreeProvider', '1/aa').then(children => assert.equal(children.length, 0)), + testObject.$getChildren('testStringTreeProvider', '1/ab').then(children => assert.equal(children.length, 0)) ]); }), - testObject.$getChildren('testStringTreeProvider', '0/0:b') + testObject.$getChildren('testStringTreeProvider', '1/b') .then(children => { const actuals = children.map(e => e.handle); - assert.deepEqual(actuals, ['0/0:b/0:ba', '0/0:b/0:bb']); + assert.deepEqual(actuals, ['1/ba', '1/bb']); return TPromise.join([ - testObject.$getChildren('testStringTreeProvider', '0/0:b/0:ba').then(children => assert.equal(children.length, 0)), - testObject.$getChildren('testStringTreeProvider', '0/0:b/0:bb').then(children => assert.equal(children.length, 0)) + testObject.$getChildren('testStringTreeProvider', '1/ba').then(children => assert.equal(children.length, 0)), + testObject.$getChildren('testStringTreeProvider', '1/bb').then(children => assert.equal(children.length, 0)) ]); }) ]);