Skip to content

Commit 2171147

Browse files
authored
Merge pull request #2683 from github/nora/model-details-view-styling
Add icons and main badge to Model Details View
2 parents 2cac318 + 9069ba2 commit 2171147

File tree

4 files changed

+48
-15
lines changed

4 files changed

+48
-15
lines changed

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class DataExtensionsEditorModule extends DisposableObject {
4545
baseQueryStorageDir,
4646
"data-extensions-editor-results",
4747
);
48-
this.modelDetailsPanel = this.push(new ModelDetailsPanel());
48+
this.modelDetailsPanel = this.push(new ModelDetailsPanel(cliServer));
4949
}
5050

5151
public static async initialize(

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
7373
private readonly updateModelDetailsPanelState: (
7474
externalApiUsages: ExternalApiUsage[],
7575
databaseItem: DatabaseItem,
76-
) => void,
76+
) => Promise<void>,
7777
) {
7878
super(ctx);
7979

@@ -312,7 +312,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
312312
t: "setExternalApiUsages",
313313
externalApiUsages,
314314
});
315-
this.updateModelDetailsPanelState(
315+
await this.updateModelDetailsPanelState(
316316
externalApiUsages,
317317
this.databaseItem,
318318
);

extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,84 @@
11
import {
22
Event,
33
EventEmitter,
4+
ThemeColor,
5+
ThemeIcon,
46
TreeDataProvider,
57
TreeItem,
68
TreeItemCollapsibleState,
9+
Uri,
710
} from "vscode";
811
import { DisposableObject } from "../../common/disposable-object";
912
import { ExternalApiUsage, Usage } from "../external-api-usage";
1013
import { DatabaseItem } from "../../databases/local-databases";
14+
import { relative } from "path";
15+
import { CodeQLCliServer } from "../../codeql-cli/cli";
1116

1217
export class ModelDetailsDataProvider
1318
extends DisposableObject
1419
implements TreeDataProvider<ModelDetailsTreeViewItem>
1520
{
1621
private externalApiUsages: ExternalApiUsage[] = [];
1722
private databaseItem: DatabaseItem | undefined = undefined;
23+
private sourceLocationPrefix: string | undefined = undefined;
1824

1925
private readonly onDidChangeTreeDataEmitter = this.push(
2026
new EventEmitter<void>(),
2127
);
2228

29+
public constructor(private readonly cliServer: CodeQLCliServer) {
30+
super();
31+
}
32+
2333
public get onDidChangeTreeData(): Event<void> {
2434
return this.onDidChangeTreeDataEmitter.event;
2535
}
2636

27-
public setState(
37+
public async setState(
2838
externalApiUsages: ExternalApiUsage[],
2939
databaseItem: DatabaseItem,
30-
): void {
40+
): Promise<void> {
3141
this.externalApiUsages = externalApiUsages;
3242
this.databaseItem = databaseItem;
43+
this.sourceLocationPrefix = await this.databaseItem.getSourceLocationPrefix(
44+
this.cliServer,
45+
);
3346
this.onDidChangeTreeDataEmitter.fire();
3447
}
3548

3649
getTreeItem(item: ModelDetailsTreeViewItem): TreeItem {
3750
if (isExternalApiUsage(item)) {
3851
return {
39-
label: item.signature,
52+
label: `${item.packageName}.${item.typeName}.${item.methodName}${item.methodParameters}`,
4053
collapsibleState: TreeItemCollapsibleState.Collapsed,
54+
iconPath: new ThemeIcon("symbol-method"),
4155
};
4256
} else {
4357
return {
4458
label: item.label,
59+
description: `${this.relativePathWithinDatabase(item.url.uri)} [${
60+
item.url.startLine
61+
}, ${item.url.endLine}]`,
4562
collapsibleState: TreeItemCollapsibleState.None,
4663
command: {
4764
title: "Show usage",
4865
command: "codeQLDataExtensionsEditor.jumpToUsageLocation",
4966
arguments: [item, this.databaseItem],
5067
},
68+
iconPath: new ThemeIcon("error", new ThemeColor("errorForeground")),
5169
};
5270
}
5371
}
5472

73+
private relativePathWithinDatabase(uri: string): string {
74+
const parsedUri = Uri.parse(uri);
75+
if (this.sourceLocationPrefix) {
76+
return relative(this.sourceLocationPrefix, parsedUri.fsPath);
77+
} else {
78+
return parsedUri.fsPath;
79+
}
80+
}
81+
5582
getChildren(item?: ModelDetailsTreeViewItem): ModelDetailsTreeViewItem[] {
5683
if (item === undefined) {
5784
return this.externalApiUsages;
Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,33 @@
1-
import { window } from "vscode";
1+
import { TreeView, window } from "vscode";
22
import { DisposableObject } from "../../common/disposable-object";
33
import { ModelDetailsDataProvider } from "./model-details-data-provider";
4-
import { ExternalApiUsage } from "../external-api-usage";
54
import { DatabaseItem } from "../../databases/local-databases";
5+
import { ExternalApiUsage, Usage } from "../external-api-usage";
6+
import { CodeQLCliServer } from "../../codeql-cli/cli";
67

78
export class ModelDetailsPanel extends DisposableObject {
89
private readonly dataProvider: ModelDetailsDataProvider;
10+
private readonly treeView: TreeView<ExternalApiUsage | Usage>;
911

10-
public constructor() {
12+
public constructor(cliServer: CodeQLCliServer) {
1113
super();
1214

13-
this.dataProvider = new ModelDetailsDataProvider();
15+
this.dataProvider = new ModelDetailsDataProvider(cliServer);
1416

15-
const treeView = window.createTreeView("codeQLModelDetails", {
17+
this.treeView = window.createTreeView("codeQLModelDetails", {
1618
treeDataProvider: this.dataProvider,
1719
});
18-
this.push(treeView);
20+
this.push(this.treeView);
1921
}
2022

21-
public setState(
23+
public async setState(
2224
externalApiUsages: ExternalApiUsage[],
2325
databaseItem: DatabaseItem,
24-
): void {
25-
this.dataProvider.setState(externalApiUsages, databaseItem);
26+
): Promise<void> {
27+
await this.dataProvider.setState(externalApiUsages, databaseItem);
28+
this.treeView.badge = {
29+
value: externalApiUsages.length,
30+
tooltip: "Number of external APIs",
31+
};
2632
}
2733
}

0 commit comments

Comments
 (0)