Skip to content

Commit 27a7474

Browse files
authored
Add modeling indicator to method usages panel (#2876)
1 parent 469f65a commit 27a7474

File tree

5 files changed

+235
-29
lines changed

5 files changed

+235
-29
lines changed

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

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import { DatabaseItem } from "../../databases/local-databases";
1414
import { relative } from "path";
1515
import { CodeQLCliServer } from "../../codeql-cli/cli";
1616
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../shared/hide-modeled-methods";
17+
import { getModelingStatus } from "../shared/modeling-status";
18+
import { assertNever } from "../../common/helpers-pure";
19+
import { ModeledMethod } from "../modeled-method";
1720

1821
export class MethodsUsageDataProvider
1922
extends DisposableObject
@@ -23,6 +26,8 @@ export class MethodsUsageDataProvider
2326
private databaseItem: DatabaseItem | undefined = undefined;
2427
private sourceLocationPrefix: string | undefined = undefined;
2528
private hideModeledMethods: boolean = INITIAL_HIDE_MODELED_METHODS_VALUE;
29+
private modeledMethods: Record<string, ModeledMethod> = {};
30+
private modifiedMethodSignatures: Set<string> = new Set();
2631

2732
private readonly onDidChangeTreeDataEmitter = this.push(
2833
new EventEmitter<void>(),
@@ -47,17 +52,23 @@ export class MethodsUsageDataProvider
4752
methods: Method[],
4853
databaseItem: DatabaseItem,
4954
hideModeledMethods: boolean,
55+
modeledMethods: Record<string, ModeledMethod>,
56+
modifiedMethodSignatures: Set<string>,
5057
): Promise<void> {
5158
if (
5259
this.methods !== methods ||
5360
this.databaseItem !== databaseItem ||
54-
this.hideModeledMethods !== hideModeledMethods
61+
this.hideModeledMethods !== hideModeledMethods ||
62+
this.modeledMethods !== modeledMethods ||
63+
this.modifiedMethodSignatures !== modifiedMethodSignatures
5564
) {
5665
this.methods = methods;
5766
this.databaseItem = databaseItem;
5867
this.sourceLocationPrefix =
5968
await this.databaseItem.getSourceLocationPrefix(this.cliServer);
6069
this.hideModeledMethods = hideModeledMethods;
70+
this.modeledMethods = modeledMethods;
71+
this.modifiedMethodSignatures = modifiedMethodSignatures;
6172

6273
this.onDidChangeTreeDataEmitter.fire();
6374
}
@@ -68,7 +79,7 @@ export class MethodsUsageDataProvider
6879
return {
6980
label: `${item.packageName}.${item.typeName}.${item.methodName}${item.methodParameters}`,
7081
collapsibleState: TreeItemCollapsibleState.Collapsed,
71-
iconPath: new ThemeIcon("symbol-method"),
82+
iconPath: this.getModelingStatusIcon(item),
7283
};
7384
} else {
7485
const method = this.getParent(item);
@@ -83,11 +94,30 @@ export class MethodsUsageDataProvider
8394
command: "codeQLModelEditor.jumpToUsageLocation",
8495
arguments: [method, item, this.databaseItem],
8596
},
86-
iconPath: new ThemeIcon("error", new ThemeColor("errorForeground")),
8797
};
8898
}
8999
}
90100

101+
private getModelingStatusIcon(method: Method): ThemeIcon {
102+
const modeledMethod = this.modeledMethods[method.signature];
103+
const modifiedMethod = this.modifiedMethodSignatures.has(method.signature);
104+
105+
const status = getModelingStatus(modeledMethod, modifiedMethod);
106+
switch (status) {
107+
case "unmodeled":
108+
return new ThemeIcon("error", new ThemeColor("errorForeground"));
109+
case "unsaved":
110+
return new ThemeIcon("pass", new ThemeColor("testing.iconPassed"));
111+
case "saved":
112+
return new ThemeIcon(
113+
"pass-filled",
114+
new ThemeColor("testing.iconPassed"),
115+
);
116+
default:
117+
assertNever(status);
118+
}
119+
}
120+
91121
private relativePathWithinDatabase(uri: string): string {
92122
const parsedUri = Uri.parse(uri);
93123
if (this.sourceLocationPrefix) {

extensions/ql-vscode/src/model-editor/methods-usage/methods-usage-panel.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Method, Usage } from "../method";
88
import { DatabaseItem } from "../../databases/local-databases";
99
import { CodeQLCliServer } from "../../codeql-cli/cli";
1010
import { ModelingStore } from "../modeling-store";
11+
import { ModeledMethod } from "../modeled-method";
1112

1213
export class MethodsUsagePanel extends DisposableObject {
1314
private readonly dataProvider: MethodsUsageDataProvider;
@@ -33,8 +34,16 @@ export class MethodsUsagePanel extends DisposableObject {
3334
methods: Method[],
3435
databaseItem: DatabaseItem,
3536
hideModeledMethods: boolean,
37+
modeledMethods: Record<string, ModeledMethod>,
38+
modifiedMethodSignatures: Set<string>,
3639
): Promise<void> {
37-
await this.dataProvider.setState(methods, databaseItem, hideModeledMethods);
40+
await this.dataProvider.setState(
41+
methods,
42+
databaseItem,
43+
hideModeledMethods,
44+
modeledMethods,
45+
modifiedMethodSignatures,
46+
);
3847
const numOfApis = hideModeledMethods
3948
? methods.filter((api) => !api.supported).length
4049
: methods.length;
@@ -73,6 +82,14 @@ export class MethodsUsagePanel extends DisposableObject {
7382
}
7483
}),
7584
);
85+
86+
this.push(
87+
this.modelingStore.onModifiedMethodsChanged(async (event) => {
88+
if (event.isActiveDb) {
89+
await this.handleStateChangeEvent();
90+
}
91+
}),
92+
);
7693
}
7794

7895
private async handleStateChangeEvent(): Promise<void> {
@@ -82,6 +99,8 @@ export class MethodsUsagePanel extends DisposableObject {
8299
activeState.methods,
83100
activeState.databaseItem,
84101
activeState.hideModeledMethods,
102+
activeState.modeledMethods,
103+
activeState.modifiedMethodSignatures,
85104
);
86105
}
87106
}

extensions/ql-vscode/src/model-editor/modeling-store.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ export class ModelingStore extends DisposableObject {
158158
const dbState = this.getState(dbItem);
159159
const dbUri = dbItem.databaseUri.toString();
160160

161-
dbState.methods = methods;
161+
dbState.methods = [...methods];
162162

163163
this.onMethodsChangedEventEmitter.fire({
164164
methods,
@@ -204,13 +204,15 @@ export class ModelingStore extends DisposableObject {
204204
methods: Record<string, ModeledMethod>,
205205
) {
206206
this.changeModeledMethods(dbItem, (state) => {
207-
state.modeledMethods = methods;
207+
state.modeledMethods = { ...methods };
208208
});
209209
}
210210

211211
public updateModeledMethod(dbItem: DatabaseItem, method: ModeledMethod) {
212212
this.changeModeledMethods(dbItem, (state) => {
213-
state.modeledMethods[method.signature] = method;
213+
const newModeledMethods = { ...state.modeledMethods };
214+
newModeledMethods[method.signature] = method;
215+
state.modeledMethods = newModeledMethods;
214216
});
215217
}
216218

@@ -219,7 +221,7 @@ export class ModelingStore extends DisposableObject {
219221
methodSignatures: Set<string>,
220222
) {
221223
this.changeModifiedMethods(dbItem, (state) => {
222-
state.modifiedMethodSignatures = methodSignatures;
224+
state.modifiedMethodSignatures = new Set(methodSignatures);
223225
});
224226
}
225227

@@ -228,9 +230,11 @@ export class ModelingStore extends DisposableObject {
228230
methodSignatures: Iterable<string>,
229231
) {
230232
this.changeModifiedMethods(dbItem, (state) => {
231-
for (const signature of methodSignatures) {
232-
state.modifiedMethodSignatures.add(signature);
233-
}
233+
const newModifiedMethods = new Set([
234+
...state.modifiedMethodSignatures,
235+
...methodSignatures,
236+
]);
237+
state.modifiedMethodSignatures = newModifiedMethods;
234238
});
235239
}
236240

@@ -243,9 +247,11 @@ export class ModelingStore extends DisposableObject {
243247
methodSignatures: string[],
244248
) {
245249
this.changeModifiedMethods(dbItem, (state) => {
246-
methodSignatures.forEach((signature) => {
247-
state.modifiedMethodSignatures.delete(signature);
248-
});
250+
const newModifiedMethods = Array.from(
251+
state.modifiedMethodSignatures,
252+
).filter((s) => !methodSignatures.includes(s));
253+
254+
state.modifiedMethodSignatures = new Set(newModifiedMethods);
249255
});
250256
}
251257

0 commit comments

Comments
 (0)