-
Notifications
You must be signed in to change notification settings - Fork 226
Expand file tree
/
Copy pathmethods-usage-panel.ts
More file actions
127 lines (114 loc) · 3.46 KB
/
methods-usage-panel.ts
File metadata and controls
127 lines (114 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { TreeView, window } from "vscode";
import { DisposableObject } from "../../common/disposable-object";
import {
MethodsUsageDataProvider,
MethodsUsageTreeViewItem,
} from "./methods-usage-data-provider";
import { Method, Usage } from "../method";
import { DatabaseItem } from "../../databases/local-databases";
import { CodeQLCliServer } from "../../codeql-cli/cli";
import { ModelingStore } from "../modeling-store";
import { ModeledMethod } from "../modeled-method";
import { Mode } from "../shared/mode";
import { ModelingEvents } from "../modeling-events";
export class MethodsUsagePanel extends DisposableObject {
private readonly dataProvider: MethodsUsageDataProvider;
private readonly treeView: TreeView<MethodsUsageTreeViewItem>;
public constructor(
private readonly modelingStore: ModelingStore,
private readonly modelingEvents: ModelingEvents,
cliServer: CodeQLCliServer,
) {
super();
this.dataProvider = new MethodsUsageDataProvider(cliServer);
this.treeView = window.createTreeView("codeQLMethodsUsage", {
treeDataProvider: this.dataProvider,
});
this.push(this.treeView);
this.registerToModelingEvents();
}
public async setState(
methods: readonly Method[],
databaseItem: DatabaseItem,
hideModeledMethods: boolean,
mode: Mode,
modeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
modifiedMethodSignatures: ReadonlySet<string>,
): Promise<void> {
await this.dataProvider.setState(
methods,
databaseItem,
hideModeledMethods,
mode,
modeledMethods,
modifiedMethodSignatures,
);
const numOfApis = hideModeledMethods
? methods.filter((api) => !api.supported).length
: methods.length;
this.treeView.badge = {
value: numOfApis,
tooltip: "Number of external APIs",
};
}
public async revealItem(
methodSignature: string,
usage: Usage,
): Promise<void> {
const usageTreeViewItem = this.dataProvider.resolveUsageTreeViewItem(
methodSignature,
usage,
);
if (usageTreeViewItem !== undefined) {
await this.treeView.reveal(usageTreeViewItem);
}
}
private registerToModelingEvents(): void {
this.push(
this.modelingEvents.onActiveDbChanged(async () => {
await this.handleStateChangeEvent();
}),
);
this.push(
this.modelingEvents.onMethodsChanged(async (event) => {
if (event.isActiveDb) {
await this.handleStateChangeEvent();
}
}),
);
this.push(
this.modelingEvents.onHideModeledMethodsChanged(async (event) => {
if (event.isActiveDb) {
await this.handleStateChangeEvent();
}
}),
);
this.push(
this.modelingEvents.onModeChanged(async (event) => {
if (event.isActiveDb) {
await this.handleStateChangeEvent();
}
}),
);
this.push(
this.modelingEvents.onModifiedMethodsChanged(async (event) => {
if (event.isActiveDb) {
await this.handleStateChangeEvent();
}
}),
);
}
private async handleStateChangeEvent(): Promise<void> {
const activeState = this.modelingStore.getStateForActiveDb();
if (activeState !== undefined) {
await this.setState(
activeState.methods,
activeState.databaseItem,
activeState.hideModeledMethods,
activeState.mode,
activeState.modeledMethods,
activeState.modifiedMethodSignatures,
);
}
}
}