Skip to content

Commit fcfd4f3

Browse files
Merge pull request #2926 from github/robertbrignull/JumpToUsageMessage
Only include method signature in JumpToUsageMessage
2 parents 319a54c + 6561bb0 commit fcfd4f3

File tree

7 files changed

+44
-36
lines changed

7 files changed

+44
-36
lines changed

extensions/ql-vscode/src/common/commands.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import type {
1212
} from "../variant-analysis/shared/variant-analysis";
1313
import type { QLDebugConfiguration } from "../debugger/debug-configuration";
1414
import type { QueryTreeViewItem } from "../queries-panel/query-tree-view-item";
15-
import type { Method, Usage } from "../model-editor/method";
1615

1716
// A command function matching the signature that VS Code calls when
1817
// a command is invoked from a context menu on a TreeView with
@@ -324,9 +323,8 @@ export type PackagingCommands = {
324323
export type ModelEditorCommands = {
325324
"codeQL.openModelEditor": () => Promise<void>;
326325
"codeQL.openModelEditorFromModelingPanel": () => Promise<void>;
327-
"codeQLModelEditor.jumpToUsageLocation": (
328-
method: Method,
329-
usage: Usage,
326+
"codeQLModelEditor.jumpToMethod": (
327+
methodSignature: string,
330328
databaseItem: DatabaseItem,
331329
) => Promise<void>;
332330
};

extensions/ql-vscode/src/common/interface-types.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
} from "../variant-analysis/shared/variant-analysis-filter-sort";
1818
import { ErrorLike } from "../common/errors";
1919
import { DataFlowPaths } from "../variant-analysis/shared/data-flow-paths";
20-
import { Method, Usage } from "../model-editor/method";
20+
import { Method } from "../model-editor/method";
2121
import { ModeledMethod } from "../model-editor/modeled-method";
2222
import {
2323
MethodModelingPanelViewState,
@@ -526,10 +526,9 @@ interface SwitchModeMessage {
526526
mode: Mode;
527527
}
528528

529-
interface JumpToUsageMessage {
530-
t: "jumpToUsage";
531-
method: Method;
532-
usage: Usage;
529+
interface JumpToMethodMessage {
530+
t: "jumpToMethod";
531+
methodSignature: string;
533532
}
534533

535534
interface OpenDatabaseMessage {
@@ -602,7 +601,7 @@ export type FromModelEditorMessage =
602601
| RefreshMethods
603602
| OpenDatabaseMessage
604603
| OpenExtensionPackMessage
605-
| JumpToUsageMessage
604+
| JumpToMethodMessage
606605
| SaveModeledMethods
607606
| GenerateMethodMessage
608607
| GenerateMethodsFromLlmMessage

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ export class MethodsUsageDataProvider
8383
};
8484
} else {
8585
const method = this.getParent(item);
86+
if (!method || !isExternalApiUsage(method)) {
87+
throw new Error("Parent not found for tree item");
88+
}
8689
return {
8790
label: item.label,
8891
description: `${this.relativePathWithinDatabase(item.url.uri)} [${
@@ -91,8 +94,8 @@ export class MethodsUsageDataProvider
9194
collapsibleState: TreeItemCollapsibleState.None,
9295
command: {
9396
title: "Show usage",
94-
command: "codeQLModelEditor.jumpToUsageLocation",
95-
arguments: [method, item, this.databaseItem],
97+
command: "codeQLModelEditor.jumpToMethod",
98+
arguments: [method.signature, this.databaseItem],
9699
},
97100
};
98101
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,11 @@ export class ModelEditorModule extends DisposableObject {
7777
"codeQL.openModelEditor": this.openModelEditor.bind(this),
7878
"codeQL.openModelEditorFromModelingPanel":
7979
this.openModelEditor.bind(this),
80-
"codeQLModelEditor.jumpToUsageLocation": async (
81-
method: Method,
82-
usage: Usage,
80+
"codeQLModelEditor.jumpToMethod": async (
81+
methodSignature: string,
8382
databaseItem: DatabaseItem,
8483
) => {
85-
this.modelingStore.setSelectedMethod(databaseItem, method, usage);
84+
this.modelingStore.setSelectedMethod(databaseItem, methodSignature);
8685
},
8786
};
8887
}

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {
3131
externalApiQueriesProgressMaxStep,
3232
runExternalApiQueries,
3333
} from "./external-api-usage-queries";
34-
import { Method, Usage } from "./method";
34+
import { Method } from "./method";
3535
import { ModeledMethod } from "./modeled-method";
3636
import { ExtensionPack } from "./shared/extension-pack";
3737
import { ModelConfigListener } from "../config";
@@ -197,9 +197,11 @@ export class ModelEditorView extends AbstractWebview<
197197
);
198198

199199
break;
200-
case "jumpToUsage":
201-
await this.handleJumpToUsage(msg.method, msg.usage);
202-
void telemetryListener?.sendUIInteraction("model-editor-jump-to-usage");
200+
case "jumpToMethod":
201+
await this.handleJumpToMethod(msg.methodSignature);
202+
void telemetryListener?.sendUIInteraction(
203+
"model-editor-jump-to-method",
204+
);
203205

204206
break;
205207
case "saveModeledMethods":
@@ -363,8 +365,8 @@ export class ModelEditorView extends AbstractWebview<
363365
});
364366
}
365367

366-
protected async handleJumpToUsage(method: Method, usage: Usage) {
367-
this.modelingStore.setSelectedMethod(this.databaseItem, method, usage);
368+
protected async handleJumpToMethod(methodSignature: string) {
369+
this.modelingStore.setSelectedMethod(this.databaseItem, methodSignature);
368370
}
369371

370372
protected async loadExistingModeledMethods(): Promise<void> {

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,18 @@ export class ModelingStore extends DisposableObject {
311311
});
312312
}
313313

314-
public setSelectedMethod(dbItem: DatabaseItem, method: Method, usage: Usage) {
314+
public setSelectedMethod(dbItem: DatabaseItem, methodSignature: string) {
315315
const dbState = this.getState(dbItem);
316316

317+
const method = dbState.methods.find((m) => m.signature === methodSignature);
318+
if (method === undefined) {
319+
throw new Error(
320+
`No method with signature "${methodSignature}" found in modeling store`,
321+
);
322+
}
323+
324+
const usage = method.usages[0];
325+
317326
dbState.selectedMethod = method;
318327
dbState.selectedUsage = usage;
319328

extensions/ql-vscode/src/view/model-editor/MethodRow.tsx

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
107107
? modeledMethodsProp
108108
: modeledMethodsProp.slice(0, 1);
109109

110-
const jumpToUsage = useCallback(
111-
() => sendJumpToUsageMessage(method),
110+
const jumpToMethod = useCallback(
111+
() => sendJumpToMethodMessage(method),
112112
[method],
113113
);
114114

@@ -126,11 +126,11 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
126126
<MethodClassifications method={method} />
127127
<MethodName {...props.method} />
128128
{viewState.mode === Mode.Application && (
129-
<UsagesButton onClick={jumpToUsage}>
129+
<UsagesButton onClick={jumpToMethod}>
130130
{method.usages.length}
131131
</UsagesButton>
132132
)}
133-
<ViewLink onClick={jumpToUsage}>View</ViewLink>
133+
<ViewLink onClick={jumpToMethod}>View</ViewLink>
134134
{props.modelingInProgress && <ProgressRing />}
135135
</ApiOrMethodRow>
136136
</VSCodeDataGridCell>
@@ -206,8 +206,8 @@ const UnmodelableMethodRow = forwardRef<
206206
>((props, ref) => {
207207
const { method, viewState, revealedMethodSignature } = props;
208208

209-
const jumpToUsage = useCallback(
210-
() => sendJumpToUsageMessage(method),
209+
const jumpToMethod = useCallback(
210+
() => sendJumpToMethodMessage(method),
211211
[method],
212212
);
213213

@@ -222,11 +222,11 @@ const UnmodelableMethodRow = forwardRef<
222222
<ModelingStatusIndicator status="saved" />
223223
<MethodName {...props.method} />
224224
{viewState.mode === Mode.Application && (
225-
<UsagesButton onClick={jumpToUsage}>
225+
<UsagesButton onClick={jumpToMethod}>
226226
{method.usages.length}
227227
</UsagesButton>
228228
)}
229-
<ViewLink onClick={jumpToUsage}>View</ViewLink>
229+
<ViewLink onClick={jumpToMethod}>View</ViewLink>
230230
<MethodClassifications method={method} />
231231
</ApiOrMethodRow>
232232
</VSCodeDataGridCell>
@@ -238,12 +238,10 @@ const UnmodelableMethodRow = forwardRef<
238238
});
239239
UnmodelableMethodRow.displayName = "UnmodelableMethodRow";
240240

241-
function sendJumpToUsageMessage(method: Method) {
241+
function sendJumpToMethodMessage(method: Method) {
242242
vscode.postMessage({
243-
t: "jumpToUsage",
244-
method,
245-
// In framework mode, the first and only usage is the definition of the method
246-
usage: method.usages[0],
243+
t: "jumpToMethod",
244+
methodSignature: method.signature,
247245
});
248246
}
249247

0 commit comments

Comments
 (0)