Skip to content

Commit c8ec1d6

Browse files
committed
Merge remote-tracking branch 'origin/main' into koesie10/hide-type-models-non-canary
2 parents f57d441 + 8063d6c commit c8ec1d6

File tree

12 files changed

+269
-441
lines changed

12 files changed

+269
-441
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,6 +977,7 @@ async function activateWithInstalledDistribution(
977977
const modelEditorModule = await ModelEditorModule.initialize(
978978
app,
979979
dbm,
980+
variantAnalysisManager,
980981
cliServer,
981982
qs,
982983
tmpDir.name,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { getModelsAsDataLanguage } from "./languages";
3131
import { INITIAL_MODE } from "./shared/mode";
3232
import { isSupportedLanguage } from "./supported-languages";
3333
import { DefaultNotifier, checkConsistency } from "./consistency-check";
34+
import type { VariantAnalysisManager } from "../variant-analysis/variant-analysis-manager";
3435

3536
export class ModelEditorModule extends DisposableObject {
3637
private readonly queryStorageDir: string;
@@ -43,6 +44,7 @@ export class ModelEditorModule extends DisposableObject {
4344
private constructor(
4445
private readonly app: App,
4546
private readonly databaseManager: DatabaseManager,
47+
private readonly variantAnalysisManager: VariantAnalysisManager,
4648
private readonly cliServer: CodeQLCliServer,
4749
private readonly queryRunner: QueryRunner,
4850
baseQueryStorageDir: string,
@@ -65,13 +67,15 @@ export class ModelEditorModule extends DisposableObject {
6567
public static async initialize(
6668
app: App,
6769
databaseManager: DatabaseManager,
70+
variantAnalysisManager: VariantAnalysisManager,
6871
cliServer: CodeQLCliServer,
6972
queryRunner: QueryRunner,
7073
queryStorageDir: string,
7174
): Promise<ModelEditorModule> {
7275
const modelEditorModule = new ModelEditorModule(
7376
app,
7477
databaseManager,
78+
variantAnalysisManager,
7579
cliServer,
7680
queryRunner,
7781
queryStorageDir,
@@ -240,6 +244,7 @@ export class ModelEditorModule extends DisposableObject {
240244
this.modelingEvents,
241245
this.modelConfig,
242246
this.databaseManager,
247+
this.variantAnalysisManager,
243248
this.cliServer,
244249
this.queryRunner,
245250
this.queryStorageDir,

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import { runSuggestionsQuery } from "./suggestion-queries";
6060
import { parseAccessPathSuggestionRowsToOptions } from "./suggestions-bqrs";
6161
import { ModelEvaluator } from "./model-evaluator";
6262
import type { ModelEvaluationRunState } from "./shared/model-evaluation-run-state";
63+
import type { VariantAnalysisManager } from "../variant-analysis/variant-analysis-manager";
6364

6465
export class ModelEditorView extends AbstractWebview<
6566
ToModelEditorMessage,
@@ -78,6 +79,7 @@ export class ModelEditorView extends AbstractWebview<
7879
private readonly modelingEvents: ModelingEvents,
7980
private readonly modelConfig: ModelConfigListener,
8081
private readonly databaseManager: DatabaseManager,
82+
private readonly variantAnalysisManager: VariantAnalysisManager,
8183
private readonly cliServer: CodeQLCliServer,
8284
private readonly queryRunner: QueryRunner,
8385
private readonly queryStorageDir: string,
@@ -116,9 +118,13 @@ export class ModelEditorView extends AbstractWebview<
116118
this.languageDefinition = getModelsAsDataLanguage(language);
117119

118120
this.modelEvaluator = new ModelEvaluator(
121+
this.app.logger,
122+
this.cliServer,
119123
modelingStore,
120124
modelingEvents,
125+
this.variantAnalysisManager,
121126
databaseItem,
127+
language,
122128
this.updateModelEvaluationRun.bind(this),
123129
);
124130
this.push(this.modelEvaluator);
@@ -803,6 +809,7 @@ export class ModelEditorView extends AbstractWebview<
803809
this.modelingEvents,
804810
this.modelConfig,
805811
this.databaseManager,
812+
this.variantAnalysisManager,
806813
this.cliServer,
807814
this.queryRunner,
808815
this.queryStorageDir,

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

Lines changed: 96 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,24 @@ import type { ModelingEvents } from "./modeling-events";
33
import type { DatabaseItem } from "../databases/local-databases";
44
import type { ModelEvaluationRun } from "./model-evaluation-run";
55
import { DisposableObject } from "../common/disposable-object";
6-
import { sleep } from "../common/time";
76
import type { ModelEvaluationRunState } from "./shared/model-evaluation-run-state";
7+
import type { BaseLogger } from "../common/logging";
8+
import type { CodeQLCliServer } from "../codeql-cli/cli";
9+
import type { VariantAnalysisManager } from "../variant-analysis/variant-analysis-manager";
10+
import type { QueryLanguage } from "../common/query-language";
11+
import { resolveCodeScanningQueryPack } from "../variant-analysis/code-scanning-pack";
12+
import { withProgress } from "../common/vscode/progress";
13+
import type { VariantAnalysis } from "../variant-analysis/shared/variant-analysis";
814

915
export class ModelEvaluator extends DisposableObject {
1016
public constructor(
17+
private readonly logger: BaseLogger,
18+
private readonly cliServer: CodeQLCliServer,
1119
private readonly modelingStore: ModelingStore,
1220
private readonly modelingEvents: ModelingEvents,
21+
private readonly variantAnalysisManager: VariantAnalysisManager,
1322
private readonly dbItem: DatabaseItem,
23+
private readonly language: QueryLanguage,
1424
private readonly updateView: (
1525
run: ModelEvaluationRunState,
1626
) => Promise<void>,
@@ -28,18 +38,48 @@ export class ModelEvaluator extends DisposableObject {
2838
};
2939
this.modelingStore.updateModelEvaluationRun(this.dbItem, evaluationRun);
3040

31-
// For now, just wait 5 seconds and then update the store.
32-
// In the future, this will be replaced with the actual evaluation process.
33-
void sleep(5000).then(() => {
34-
const completedEvaluationRun: ModelEvaluationRun = {
35-
isPreparing: false,
36-
variantAnalysisId: undefined,
37-
};
38-
this.modelingStore.updateModelEvaluationRun(
39-
this.dbItem,
40-
completedEvaluationRun,
41-
);
42-
});
41+
// Build pack
42+
const qlPack = await resolveCodeScanningQueryPack(
43+
this.logger,
44+
this.cliServer,
45+
this.language,
46+
);
47+
48+
if (!qlPack) {
49+
this.modelingStore.updateModelEvaluationRun(this.dbItem, undefined);
50+
throw new Error("Unable to trigger evaluation run");
51+
}
52+
53+
// Submit variant analysis and monitor progress
54+
return withProgress(
55+
async (progress, token) => {
56+
let variantAnalysisId: number | undefined = undefined;
57+
try {
58+
variantAnalysisId =
59+
await this.variantAnalysisManager.runVariantAnalysis(
60+
qlPack,
61+
progress,
62+
token,
63+
);
64+
} catch (e) {
65+
this.modelingStore.updateModelEvaluationRun(this.dbItem, undefined);
66+
throw e;
67+
}
68+
69+
if (variantAnalysisId) {
70+
this.monitorVariantAnalysis(variantAnalysisId);
71+
} else {
72+
this.modelingStore.updateModelEvaluationRun(this.dbItem, undefined);
73+
throw new Error(
74+
"Unable to trigger variant analysis for evaluation run",
75+
);
76+
}
77+
},
78+
{
79+
title: "Run Variant Analysis",
80+
cancellable: true,
81+
},
82+
);
4383
}
4484

4585
public async stopEvaluation() {
@@ -55,19 +95,51 @@ export class ModelEvaluator extends DisposableObject {
5595
private registerToModelingEvents() {
5696
this.push(
5797
this.modelingEvents.onModelEvaluationRunChanged(async (event) => {
58-
if (
59-
event.evaluationRun &&
60-
event.dbUri === this.dbItem.databaseUri.toString()
61-
) {
62-
const run: ModelEvaluationRunState = {
63-
isPreparing: event.evaluationRun.isPreparing,
64-
65-
// TODO: Get variant analysis from id.
66-
variantAnalysis: undefined,
67-
};
68-
await this.updateView(run);
98+
if (event.dbUri === this.dbItem.databaseUri.toString()) {
99+
if (!event.evaluationRun) {
100+
await this.updateView({
101+
isPreparing: false,
102+
variantAnalysis: undefined,
103+
});
104+
} else {
105+
const variantAnalysis = await this.getVariantAnalysisForRun(
106+
event.evaluationRun,
107+
);
108+
const run: ModelEvaluationRunState = {
109+
isPreparing: event.evaluationRun.isPreparing,
110+
variantAnalysis,
111+
};
112+
await this.updateView(run);
113+
}
69114
}
70115
}),
71116
);
72117
}
118+
119+
private async getVariantAnalysisForRun(
120+
evaluationRun: ModelEvaluationRun,
121+
): Promise<VariantAnalysis | undefined> {
122+
if (evaluationRun.variantAnalysisId) {
123+
return await this.variantAnalysisManager.getVariantAnalysis(
124+
evaluationRun.variantAnalysisId,
125+
);
126+
}
127+
return undefined;
128+
}
129+
130+
private monitorVariantAnalysis(variantAnalysisId: number) {
131+
this.push(
132+
this.variantAnalysisManager.onVariantAnalysisStatusUpdated(
133+
async (variantAnalysis) => {
134+
// Make sure it's the variant analysis we're interested in
135+
if (variantAnalysisId === variantAnalysis.id) {
136+
await this.updateView({
137+
isPreparing: false,
138+
variantAnalysis,
139+
});
140+
}
141+
},
142+
),
143+
);
144+
}
73145
}

extensions/ql-vscode/src/model-editor/model-extension-file.schema.json

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,39 @@
88
"extensions": {
99
"type": "array",
1010
"items": {
11-
"type": "object",
12-
"properties": {
13-
"addsTo": {
14-
"type": "object",
15-
"properties": {
16-
"pack": {
17-
"type": "string"
18-
},
19-
"extensible": {
20-
"type": "string"
21-
}
22-
},
23-
"required": ["pack", "extensible"]
24-
},
25-
"data": {
26-
"type": "array",
27-
"items": {
28-
"type": "array",
29-
"items": {
30-
"$ref": "#/definitions/DataTuple"
31-
}
32-
}
33-
}
34-
},
35-
"required": ["addsTo", "data"]
11+
"$ref": "#/definitions/ModelExtension"
3612
}
3713
}
3814
},
3915
"required": ["extensions"]
4016
},
17+
"ModelExtension": {
18+
"type": "object",
19+
"properties": {
20+
"addsTo": {
21+
"type": "object",
22+
"properties": {
23+
"pack": {
24+
"type": "string"
25+
},
26+
"extensible": {
27+
"type": "string"
28+
}
29+
},
30+
"required": ["pack", "extensible"]
31+
},
32+
"data": {
33+
"type": "array",
34+
"items": {
35+
"type": "array",
36+
"items": {
37+
"$ref": "#/definitions/DataTuple"
38+
}
39+
}
40+
}
41+
},
42+
"required": ["addsTo", "data"]
43+
},
4144
"DataTuple": {
4245
"type": ["boolean", "number", "string"]
4346
}

extensions/ql-vscode/src/model-editor/model-extension-file.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export type DataTuple = boolean | number | string;
77

88
type DataRow = DataTuple[];
99

10-
type ModelExtension = {
10+
export type ModelExtension = {
1111
addsTo: ExtensibleReference;
1212
data: DataRow[];
1313
};

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ export class ModelingStore extends DisposableObject {
378378

379379
public updateModelEvaluationRun(
380380
dbItem: DatabaseItem,
381-
evaluationRun: ModelEvaluationRun,
381+
evaluationRun: ModelEvaluationRun | undefined,
382382
) {
383383
this.changeModelEvaluationRun(dbItem, (state) => {
384384
state.modelEvaluationRun = evaluationRun;

0 commit comments

Comments
 (0)