Skip to content

Commit 526e747

Browse files
committed
Add switching of mode
1 parent 31e1bef commit 526e747

File tree

9 files changed

+74
-20
lines changed

9 files changed

+74
-20
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { DataFlowPaths } from "../variant-analysis/shared/data-flow-paths";
2020
import { ExternalApiUsage } from "../data-extensions-editor/external-api-usage";
2121
import { ModeledMethod } from "../data-extensions-editor/modeled-method";
2222
import { DataExtensionEditorViewState } from "../data-extensions-editor/shared/view-state";
23+
import { Mode } from "../data-extensions-editor/shared/mode";
2324

2425
/**
2526
* This module contains types and code that are shared between
@@ -521,6 +522,11 @@ export interface AddModeledMethodsMessage {
521522
overrideNone?: boolean;
522523
}
523524

525+
export interface SwitchModeMessage {
526+
t: "switchMode";
527+
mode: Mode;
528+
}
529+
524530
export interface JumpToUsageMessage {
525531
t: "jumpToUsage";
526532
location: ResolvableLocationValue;
@@ -559,6 +565,7 @@ export type ToDataExtensionsEditorMessage =
559565

560566
export type FromDataExtensionsEditorMessage =
561567
| ViewLoadedMsg
568+
| SwitchModeMessage
562569
| OpenModelFileMessage
563570
| OpenExtensionPackMessage
564571
| JumpToUsageMessage

extensions/ql-vscode/src/data-extensions-editor/auto-model-usages-query.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export async function getAutoModelUsages({
3232
// This will re-run the query that was already run when opening the data extensions editor. This
3333
// might be unnecessary, but this makes it really easy to get the path to the BQRS file which we
3434
// need to interpret the results.
35-
const queryResult = await runQuery({
35+
const queryResult = await runQuery("applicationModeQuery", {
3636
cliServer,
3737
queryRunner,
3838
queryStorageDir,

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

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import {
5151
import { showLlmGeneration } from "../config";
5252
import { getAutoModelUsages } from "./auto-model-usages-query";
5353
import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders";
54+
import { Mode } from "./shared/mode";
5455

5556
export class DataExtensionsEditorView extends AbstractWebview<
5657
ToDataExtensionsEditorMessage,
@@ -65,6 +66,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
6566
private readonly queryStorageDir: string,
6667
private readonly databaseItem: DatabaseItem,
6768
private readonly extensionPack: ExtensionPack,
69+
private mode: Mode = Mode.Application,
6870
) {
6971
super(ctx);
7072
}
@@ -138,6 +140,12 @@ export class DataExtensionsEditorView extends AbstractWebview<
138140
msg.modeledMethods,
139141
);
140142

143+
break;
144+
case "switchMode":
145+
this.mode = msg.mode;
146+
147+
await Promise.all([this.setViewState(), this.loadExternalApiUsages()]);
148+
141149
break;
142150
default:
143151
assertNever(msg);
@@ -160,6 +168,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
160168
viewState: {
161169
extensionPack: this.extensionPack,
162170
showLlmButton: showLlmGeneration(),
171+
mode: this.mode,
163172
},
164173
});
165174
}
@@ -255,16 +264,21 @@ export class DataExtensionsEditorView extends AbstractWebview<
255264
const cancellationTokenSource = new CancellationTokenSource();
256265

257266
try {
258-
const queryResult = await runQuery({
259-
cliServer: this.cliServer,
260-
queryRunner: this.queryRunner,
261-
databaseItem: this.databaseItem,
262-
queryStorageDir: this.queryStorageDir,
263-
progress: (progressUpdate: ProgressUpdate) => {
264-
void this.showProgress(progressUpdate, 1500);
267+
const queryResult = await runQuery(
268+
this.mode === Mode.Framework
269+
? "frameworkModeQuery"
270+
: "applicationModeQuery",
271+
{
272+
cliServer: this.cliServer,
273+
queryRunner: this.queryRunner,
274+
databaseItem: this.databaseItem,
275+
queryStorageDir: this.queryStorageDir,
276+
progress: (progressUpdate: ProgressUpdate) => {
277+
void this.showProgress(progressUpdate, 1500);
278+
},
279+
token: cancellationTokenSource.token,
265280
},
266-
token: cancellationTokenSource.token,
267-
});
281+
);
268282
if (!queryResult) {
269283
await this.clearProgress();
270284
return;

extensions/ql-vscode/src/data-extensions-editor/external-api-usage-query.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { QueryResultType } from "../query-server/new-messages";
1515
import { join } from "path";
1616
import { redactableError } from "../common/errors";
1717
import { telemetryListener } from "../common/vscode/telemetry";
18+
import { Query } from "./queries/query";
1819

1920
export type RunQueryOptions = {
2021
cliServer: Pick<CodeQLCliServer, "resolveQlpacks">;
@@ -26,14 +27,17 @@ export type RunQueryOptions = {
2627
token: CancellationToken;
2728
};
2829

29-
export async function runQuery({
30-
cliServer,
31-
queryRunner,
32-
databaseItem,
33-
queryStorageDir,
34-
progress,
35-
token,
36-
}: RunQueryOptions): Promise<CoreCompletedQuery | undefined> {
30+
export async function runQuery(
31+
queryName: keyof Omit<Query, "dependencies">,
32+
{
33+
cliServer,
34+
queryRunner,
35+
databaseItem,
36+
queryStorageDir,
37+
progress,
38+
token,
39+
}: RunQueryOptions,
40+
): Promise<CoreCompletedQuery | undefined> {
3741
// The below code is temporary to allow for rapid prototyping of the queries. Once the queries are stabilized, we will
3842
// move these queries into the `github/codeql` repository and use them like any other contextual (e.g. AST) queries.
3943
// This is intentionally not pretty code, as it will be removed soon.
@@ -61,7 +65,7 @@ export async function runQuery({
6165

6266
const queryDir = (await dir({ unsafeCleanup: true })).path;
6367
const queryFile = join(queryDir, "FetchExternalApis.ql");
64-
await writeFile(queryFile, query.applicationModeQuery, "utf8");
68+
await writeFile(queryFile, query[queryName], "utf8");
6569

6670
if (query.dependencies) {
6771
for (const [filename, contents] of Object.entries(query.dependencies)) {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum Mode {
2+
Application = "application",
3+
Framework = "framework",
4+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { ExtensionPack } from "./extension-pack";
2+
import { Mode } from "./mode";
23

34
export interface DataExtensionEditorViewState {
45
extensionPack: ExtensionPack;
56
showLlmButton: boolean;
7+
mode: Mode;
68
}

extensions/ql-vscode/src/stories/data-extensions-editor/DataExtensionsEditor.stories.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as React from "react";
22

33
import { ComponentMeta, ComponentStory } from "@storybook/react";
44

5+
import { Mode } from "../../data-extensions-editor/shared/mode";
56
import { DataExtensionsEditor as DataExtensionsEditorComponent } from "../../view/data-extensions-editor/DataExtensionsEditor";
67

78
export default {
@@ -26,6 +27,7 @@ DataExtensionsEditor.args = {
2627
dataExtensions: [],
2728
},
2829
showLlmButton: true,
30+
mode: Mode.Application,
2931
},
3032
initialExternalApiUsages: [
3133
{

extensions/ql-vscode/src/view/data-extensions-editor/DataExtensionsEditor.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { ViewTitle } from "../common";
1616
import { DataExtensionEditorViewState } from "../../data-extensions-editor/shared/view-state";
1717
import { ModeledMethodsList } from "./ModeledMethodsList";
1818
import { percentFormatter } from "./formatters";
19+
import { Mode } from "../../data-extensions-editor/shared/mode";
1920

2021
const DataExtensionsEditorContainer = styled.div`
2122
margin-top: 1rem;
@@ -166,6 +167,16 @@ export function DataExtensionsEditor({
166167
});
167168
}, []);
168169

170+
const onSwitchModeClick = useCallback(() => {
171+
const newMode =
172+
viewState?.mode === Mode.Framework ? Mode.Application : Mode.Framework;
173+
174+
vscode.postMessage({
175+
t: "switchMode",
176+
mode: newMode,
177+
});
178+
}, [viewState?.mode]);
179+
169180
return (
170181
<DataExtensionsEditorContainer>
171182
{progress.maxStep > 0 && (
@@ -193,6 +204,16 @@ export function DataExtensionsEditor({
193204
<div>
194205
{percentFormatter.format(unModeledPercentage / 100)} unmodeled
195206
</div>
207+
<div>
208+
Mode:{" "}
209+
{viewState?.mode === Mode.Framework ? "Framework" : "Application"}
210+
</div>
211+
<div>
212+
<LinkIconButton onClick={onSwitchModeClick}>
213+
<span slot="start" className="codicon codicon-library"></span>
214+
Switch mode
215+
</LinkIconButton>
216+
</div>
196217
</DetailsContainer>
197218

198219
<EditorContainer>

extensions/ql-vscode/test/vscode-tests/no-workspace/data-extensions-editor/external-api-usage-query.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ describe("runQuery", () => {
6767
onCancellationRequested: jest.fn(),
6868
},
6969
};
70-
const result = await runQuery(options);
70+
const result = await runQuery("applicationModeQuery", options);
7171

7272
expect(result?.resultType).toEqual(QueryResultType.SUCCESS);
7373

0 commit comments

Comments
 (0)