brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 96343cb Raw
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