From 7fa2c967785766bda1c158627a1933042ad1f903 Mon Sep 17 00:00:00 2001 From: "stephan.razin" Date: Sun, 28 Sep 2025 14:30:16 +0300 Subject: [PATCH 1/5] Fix hierarchy view focusing: it can be located in any view-container --- src/type-hierarchy.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/type-hierarchy.ts b/src/type-hierarchy.ts index f4134572..725b0d91 100644 --- a/src/type-hierarchy.ts +++ b/src/type-hierarchy.ts @@ -317,9 +317,7 @@ class TypeHierarchyProvider implements this._onDidChangeTreeData.fire(null); - // This focuses the "explorer" view container which contains the - // type hierarchy view. - vscode.commands.executeCommand('workbench.view.explorer'); + vscode.commands.executeCommand('clangd.typeHierarchyView.focus'); // This expands and focuses the type hierarchy view. // Focus the item on which the operation was invoked, not the From 73a304f94f323ffca42824d1b633e8ee87fe7730 Mon Sep 17 00:00:00 2001 From: "stephan.razin" Date: Sun, 28 Sep 2025 14:30:38 +0300 Subject: [PATCH 2/5] Fix base-classes view hierarchy for class without children --- src/type-hierarchy.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/type-hierarchy.ts b/src/type-hierarchy.ts index 725b0d91..5e482c9e 100644 --- a/src/type-hierarchy.ts +++ b/src/type-hierarchy.ts @@ -71,10 +71,11 @@ const dummyNode: TypeHierarchyItem = { }; class TypeHierarchyTreeItem extends vscode.TreeItem { - constructor(item: TypeHierarchyItem) { + constructor(item: TypeHierarchyItem, direction: TypeHierarchyDirection) { super(item.name); - if (item.children) { - if (item.children.length === 0) { + let subItems = direction === TypeHierarchyDirection.Children ? item.children : item.parents; + if (subItems) { + if (subItems.length === 0) { this.collapsibleState = vscode.TreeItemCollapsibleState.None; } else { this.collapsibleState = vscode.TreeItemCollapsibleState.Expanded; @@ -224,7 +225,7 @@ class TypeHierarchyProvider implements } public getTreeItem(element: TypeHierarchyItem): vscode.TreeItem { - return new TypeHierarchyTreeItem(element); + return new TypeHierarchyTreeItem(element, this.direction); } public getParent(element: TypeHierarchyItem): TypeHierarchyItem|null { From e8b429112dcedcab1f2a2d744e84b67fc5049736 Mon Sep 17 00:00:00 2001 From: "stephan.razin" Date: Sun, 28 Sep 2025 14:30:59 +0300 Subject: [PATCH 3/5] Fix collapsible state evaluating for children classes --- src/type-hierarchy.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/type-hierarchy.ts b/src/type-hierarchy.ts index 5e482c9e..8ee8a699 100644 --- a/src/type-hierarchy.ts +++ b/src/type-hierarchy.ts @@ -258,9 +258,11 @@ class TypeHierarchyProvider implements await this.client.sendRequest(ResolveTypeHierarchyRequest.type, { item: element, direction: TypeHierarchyDirection.Children, - resolve: 1 + resolve: 2 // We need 2 levels to understand which collapsible state to use }); element.children = resolved?.children; + // Cut-of existing sub-children to resolve them later + element.children?.forEach(x => { if (x.children?.length !== 0) { x.children = undefined; } }); } return element.children ?? []; } From ad1d197f3e02619fd02a89051a33d4c2e1c70294 Mon Sep 17 00:00:00 2001 From: "stephan.razin" Date: Sun, 28 Sep 2025 14:31:18 +0300 Subject: [PATCH 4/5] Add icons and details for type-hierarchy view --- package.json | 4 ++-- src/type-hierarchy.ts | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 39db8c9b..f715ed73 100644 --- a/package.json +++ b/package.json @@ -248,13 +248,13 @@ "command": "clangd.typeHierarchy.viewParents", "category": "clangd", "title": "Types: Show Base Classes", - "icon": "$(triangle-up)" + "icon": "$(type-hierarchy-super)" }, { "command": "clangd.typeHierarchy.viewChildren", "category": "clangd", "title": "Types: Show Derived Classes", - "icon": "$(triangle-down)" + "icon": "$(type-hierarchy-sub)" }, { "command": "clangd.typeHierarchy.close", diff --git a/src/type-hierarchy.ts b/src/type-hierarchy.ts index 8ee8a699..da034a61 100644 --- a/src/type-hierarchy.ts +++ b/src/type-hierarchy.ts @@ -73,6 +73,8 @@ const dummyNode: TypeHierarchyItem = { class TypeHierarchyTreeItem extends vscode.TreeItem { constructor(item: TypeHierarchyItem, direction: TypeHierarchyDirection) { super(item.name); + this.description = item.detail; + this.iconPath = new vscode.ThemeIcon('symbol-class'); let subItems = direction === TypeHierarchyDirection.Children ? item.children : item.parents; if (subItems) { if (subItems.length === 0) { From 41fc05e0989ac9dc2b7d8c0e3edc06e9621915a4 Mon Sep 17 00:00:00 2001 From: "stephan.razin" Date: Sun, 28 Sep 2025 21:03:50 +0300 Subject: [PATCH 5/5] fix formatting --- src/type-hierarchy.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/type-hierarchy.ts b/src/type-hierarchy.ts index da034a61..ae6ca619 100644 --- a/src/type-hierarchy.ts +++ b/src/type-hierarchy.ts @@ -75,7 +75,8 @@ class TypeHierarchyTreeItem extends vscode.TreeItem { super(item.name); this.description = item.detail; this.iconPath = new vscode.ThemeIcon('symbol-class'); - let subItems = direction === TypeHierarchyDirection.Children ? item.children : item.parents; + let subItems = direction === TypeHierarchyDirection.Children ? item.children + : item.parents; if (subItems) { if (subItems.length === 0) { this.collapsibleState = vscode.TreeItemCollapsibleState.None; @@ -260,11 +261,15 @@ class TypeHierarchyProvider implements await this.client.sendRequest(ResolveTypeHierarchyRequest.type, { item: element, direction: TypeHierarchyDirection.Children, - resolve: 2 // We need 2 levels to understand which collapsible state to use + resolve: 2 // We need 2 levels to understand collapsible state }); element.children = resolved?.children; // Cut-of existing sub-children to resolve them later - element.children?.forEach(x => { if (x.children?.length !== 0) { x.children = undefined; } }); + element.children?.forEach(x => { + if (x.children?.length !== 0) { + x.children = undefined; + } + }); } return element.children ?? []; }