diff --git a/src/vs/base/browser/ui/tree/dataTree.ts b/src/vs/base/browser/ui/tree/dataTree.ts index 1b612f43be0..015ec089e11 100644 --- a/src/vs/base/browser/ui/tree/dataTree.ts +++ b/src/vs/base/browser/ui/tree/dataTree.ts @@ -35,15 +35,17 @@ interface IDataTreeListTemplateData { templateData: T; } -function unpack(node: ITreeNode, TFilterData>): ITreeNode { - return new Proxy(Object.create(null), { - get: (_: any, name: string) => { - switch (name) { - case 'element': return node.element.element; - default: return node[name]; - } - } - }); +class DataTreeNodeWrapper implements ITreeNode { + get element(): T { return this.node.element.element; } + get parent(): ITreeNode { return new DataTreeNodeWrapper(this.node.parent); } + get children(): ITreeNode[] { return this.node.children.map(node => new DataTreeNodeWrapper(node)); } + get depth(): number { return this.node.depth; } + get collapsible(): boolean { return this.node.collapsible; } + get collapsed(): boolean { return this.node.collapsed; } + get visible(): boolean { return this.node.visible; } + get filterData(): TFilterData { return this.node.filterData; } + + constructor(private node: ITreeNode, TFilterData>) { } } class DataTreeRenderer implements ITreeRenderer, TFilterData, IDataTreeListTemplateData> { @@ -64,8 +66,8 @@ class DataTreeRenderer implements ITreeRenderer, TFilterData>, index: number, templateData: IDataTreeListTemplateData): void { - this.renderer.renderElement(unpack(element), index, templateData.templateData); + renderElement(node: ITreeNode, TFilterData>, index: number, templateData: IDataTreeListTemplateData): void { + this.renderer.renderElement(new DataTreeNodeWrapper(node), index, templateData.templateData); } renderTwistie(element: IDataTreeNode, twistieElement: HTMLElement): boolean { @@ -77,8 +79,8 @@ class DataTreeRenderer implements ITreeRenderer, TFilterData>, index: number, templateData: IDataTreeListTemplateData): void { - this.renderer.disposeElement(unpack(element), index, templateData.templateData); + disposeElement(node: ITreeNode, TFilterData>, index: number, templateData: IDataTreeListTemplateData): void { + this.renderer.disposeElement(new DataTreeNodeWrapper(node), index, templateData.templateData); } disposeTemplate(templateData: IDataTreeListTemplateData): void {