Skip to content

Commit cab963c

Browse files
authored
Send access path suggestions to the model editor view (#3304)
1 parent c6c27f4 commit cab963c

4 files changed

Lines changed: 93 additions & 2 deletions

File tree

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import type {
2424
Row,
2525
UrlValueResolvable,
2626
} from "./raw-result-types";
27+
import type { AccessPathSuggestionOptions } from "../model-editor/suggestions";
2728

2829
/**
2930
* This module contains types and code that are shared between
@@ -614,13 +615,19 @@ interface RevealMethodMessage {
614615
methodSignature: string;
615616
}
616617

618+
interface SetAccessPathSuggestionsMessage {
619+
t: "setAccessPathSuggestions";
620+
accessPathSuggestions: AccessPathSuggestionOptions;
621+
}
622+
617623
export type ToModelEditorMessage =
618624
| SetExtensionPackStateMessage
619625
| SetMethodsMessage
620626
| SetModeledMethodsMessage
621627
| SetModifiedMethodsMessage
622628
| SetInProgressMethodsMessage
623-
| RevealMethodMessage;
629+
| RevealMethodMessage
630+
| SetAccessPathSuggestionsMessage;
624631

625632
export type FromModelEditorMessage =
626633
| CommonFromViewMessages

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

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { CancellationToken, Tab } from "vscode";
22
import {
33
CancellationTokenSource,
4+
ProgressLocation,
45
TabInputWebview,
56
Uri,
67
ViewColumn,
@@ -53,6 +54,9 @@ import { getModelsAsDataLanguage } from "./languages";
5354
import { runGenerateQueries } from "./generate";
5455
import { ResponseError } from "vscode-jsonrpc";
5556
import { LSPErrorCodes } from "vscode-languageclient";
57+
import type { AccessPathSuggestionOptions } from "./suggestions";
58+
import { runSuggestionsQuery } from "./suggestion-queries";
59+
import { parseAccessPathSuggestionRowsToOptions } from "./suggestions-bqrs";
5660

5761
export class ModelEditorView extends AbstractWebview<
5862
ToModelEditorMessage,
@@ -305,6 +309,17 @@ export class ModelEditorView extends AbstractWebview<
305309
withProgress((progress) => this.loadMethods(progress), {
306310
cancellable: false,
307311
}),
312+
// Only load access path suggestions if the feature is enabled
313+
this.modelConfig.enableAccessPathSuggestions
314+
? withProgress(
315+
(progress) => this.loadAccessPathSuggestions(progress),
316+
{
317+
cancellable: false,
318+
location: ProgressLocation.Window,
319+
title: "Loading access path suggestions",
320+
},
321+
)
322+
: undefined,
308323
]);
309324
void telemetryListener?.sendUIInteraction("model-editor-switch-modes");
310325

@@ -348,6 +363,14 @@ export class ModelEditorView extends AbstractWebview<
348363
cancellable: true,
349364
}),
350365
this.loadExistingModeledMethods(),
366+
// Only load access path suggestions if the feature is enabled
367+
this.modelConfig.enableAccessPathSuggestions
368+
? withProgress((progress) => this.loadAccessPathSuggestions(progress), {
369+
cancellable: false,
370+
location: ProgressLocation.Window,
371+
title: "Loading access path suggestions",
372+
})
373+
: undefined,
351374
]);
352375
}
353376

@@ -485,6 +508,60 @@ export class ModelEditorView extends AbstractWebview<
485508
}
486509
}
487510

511+
protected async loadAccessPathSuggestions(
512+
progress: ProgressCallback,
513+
): Promise<void> {
514+
const tokenSource = new CancellationTokenSource();
515+
516+
const mode = this.modelingStore.getMode(this.databaseItem);
517+
518+
const modelsAsDataLanguage = getModelsAsDataLanguage(this.language);
519+
const accessPathSuggestions = modelsAsDataLanguage.accessPathSuggestions;
520+
if (!accessPathSuggestions) {
521+
return;
522+
}
523+
524+
try {
525+
const suggestions = await runSuggestionsQuery(mode, {
526+
parseResults: (results) =>
527+
accessPathSuggestions.parseResults(
528+
results,
529+
modelsAsDataLanguage,
530+
this.app.logger,
531+
),
532+
cliServer: this.cliServer,
533+
queryRunner: this.queryRunner,
534+
queryStorageDir: this.queryStorageDir,
535+
databaseItem: this.databaseItem,
536+
progress,
537+
token: tokenSource.token,
538+
logger: this.app.logger,
539+
});
540+
541+
if (!suggestions) {
542+
return;
543+
}
544+
545+
const options: AccessPathSuggestionOptions = {
546+
input: parseAccessPathSuggestionRowsToOptions(suggestions.input),
547+
output: parseAccessPathSuggestionRowsToOptions(suggestions.output),
548+
};
549+
550+
await this.postMessage({
551+
t: "setAccessPathSuggestions",
552+
accessPathSuggestions: options,
553+
});
554+
} catch (e: unknown) {
555+
void showAndLogExceptionWithTelemetry(
556+
this.app.logger,
557+
this.app.telemetry,
558+
redactableError(
559+
asError(e),
560+
)`Failed to fetch access path suggestions: ${getErrorMessage(e)}`,
561+
);
562+
}
563+
}
564+
488565
protected async generateModeledMethods(): Promise<void> {
489566
await withProgress(
490567
async (progress) => {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ export type AccessPathOption = {
3838
followup?: AccessPathOption[];
3939
};
4040

41+
export type AccessPathSuggestionOptions = {
42+
input: Record<string, AccessPathOption[]>;
43+
output: Record<string, AccessPathOption[]>;
44+
};
45+
4146
export function isDefinitionType(
4247
value: string,
4348
): value is AccessPathSuggestionDefinitionType {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,9 @@ export function ModelEditor({
145145
}
146146
case "revealMethod":
147147
setRevealedMethodSignature(msg.methodSignature);
148-
148+
break;
149+
case "setAccessPathSuggestions":
150+
// TODO
149151
break;
150152
default:
151153
assertNever(msg);

0 commit comments

Comments
 (0)