86 lines · typescript
1import * as vscode from "vscode";2import { DebugProtocol } from "@vscode/debugprotocol";3import { DebugSessionTracker } from "../debug-session-tracker";4 5export interface ModuleProperty {6 key: string;7 value: string;8}9 10/** Type to represent both Module and ModuleProperty since TreeDataProvider11 * expects one concrete type */12type TreeData = DebugProtocol.Module | ModuleProperty;13 14function isModule(type: TreeData): type is DebugProtocol.Module {15 return (type as DebugProtocol.Module).id !== undefined;16}17 18class ModuleItem extends vscode.TreeItem {19 constructor(module: DebugProtocol.Module) {20 super(module.name, vscode.TreeItemCollapsibleState.Collapsed);21 this.description = module.symbolStatus;22 this.contextValue = "module";23 }24 25 static getProperties(module: DebugProtocol.Module): ModuleProperty[] {26 // does not include the name and symbol status as it is show in the parent.27 let children: ModuleProperty[] = [];28 children.push({ key: "id:", value: module.id.toString() });29 30 if (module.addressRange) {31 children.push({32 key: "load address:",33 value: module.addressRange,34 });35 }36 if (module.path) {37 children.push({ key: "path:", value: module.path });38 }39 if (module.version) {40 children.push({ key: "version:", value: module.version });41 }42 if (module.symbolFilePath) {43 children.push({ key: "symbol filepath:", value: module.symbolFilePath });44 }45 return children;46 }47}48 49/** A tree data provider for listing loaded modules for the active debug session. */50export class ModulesDataProvider implements vscode.TreeDataProvider<TreeData> {51 private changeTreeData = new vscode.EventEmitter<void>();52 readonly onDidChangeTreeData = this.changeTreeData.event;53 54 constructor(private readonly tracker: DebugSessionTracker) {55 tracker.onDidChangeModules(() => this.changeTreeData.fire());56 }57 58 getTreeItem(module: TreeData): vscode.TreeItem {59 if (isModule(module)) {60 return new ModuleItem(module);61 }62 63 let item = new vscode.TreeItem(module.key);64 item.description = module.value;65 item.tooltip = `${module.key} ${module.value}`;66 item.contextValue = "property";67 return item;68 }69 70 getChildren(element?: TreeData): TreeData[] {71 if (!vscode.debug.activeDebugSession) {72 return [];73 }74 75 if (!element) {76 return this.tracker.debugSessionModules(vscode.debug.activeDebugSession);77 }78 79 if (isModule(element)) {80 return ModuleItem.getProperties(element);81 }82 83 return [];84 }85}86