Skip to content

Commit aa04583

Browse files
Merge branch 'main' into robertbrignull/SaveModeledMethods
2 parents 850c04a + b623f92 commit aa04583

26 files changed

+445
-236
lines changed

extensions/ql-vscode/package.json

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -446,13 +446,20 @@
446446
"type": "boolean",
447447
"default": false,
448448
"scope": "application",
449-
"markdownDescription": "Specifies whether to send CodeQL usage telemetry. This setting AND the global `#telemetry.enableTelemetry#` setting must be checked for telemetry to be sent to GitHub. For more information, see the [telemetry documentation](https://codeql.github.com/docs/codeql-for-visual-studio-code/about-telemetry-in-codeql-for-visual-studio-code)"
449+
"markdownDescription": "Specifies whether to send CodeQL usage telemetry. This setting AND the one of the global telemetry settings (`#telemetry.enableTelemetry#` or `#telemetry.telemetryLevel#`) must be enabled for telemetry to be sent to GitHub. For more information, see the [telemetry documentation](https://codeql.github.com/docs/codeql-for-visual-studio-code/about-telemetry-in-codeql-for-visual-studio-code)",
450+
"tags": [
451+
"telemetry",
452+
"usesOnlineServices"
453+
]
450454
},
451455
"codeQL.telemetry.logTelemetry": {
452456
"type": "boolean",
453457
"default": false,
454458
"scope": "application",
455-
"description": "Specifies whether or not to write telemetry events to the extension log."
459+
"description": "Specifies whether or not to write telemetry events to the extension log.",
460+
"tags": [
461+
"telemetry"
462+
]
456463
}
457464
}
458465
}
@@ -1996,7 +2003,7 @@
19962003
"id": "codeQLMethodModeling",
19972004
"type": "webview",
19982005
"name": "CodeQL Method Modeling",
1999-
"when": "config.codeQL.canary && config.codeQL.model.methodModelingView && codeql.modelEditorOpen && !codeql.modelEditorActive"
2006+
"when": "config.codeQL.canary"
20002007
}
20012008
],
20022009
"codeql-methods-usage": [

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ export type PackagingCommands = {
323323

324324
export type ModelEditorCommands = {
325325
"codeQL.openModelEditor": () => Promise<void>;
326+
"codeQL.openModelEditorFromModelingPanel": () => Promise<void>;
326327
"codeQLModelEditor.jumpToUsageLocation": (
327328
method: Method,
328329
usage: Usage,

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ import { ErrorLike } from "../common/errors";
1919
import { DataFlowPaths } from "../variant-analysis/shared/data-flow-paths";
2020
import { Method, Usage } from "../model-editor/method";
2121
import { ModeledMethod } from "../model-editor/modeled-method";
22-
import { ModelEditorViewState } from "../model-editor/shared/view-state";
22+
import {
23+
MethodModelingPanelViewState,
24+
ModelEditorViewState,
25+
} from "../model-editor/shared/view-state";
2326
import { Mode } from "../model-editor/shared/mode";
2427
import { QueryLanguage } from "./query-language";
2528

@@ -576,9 +579,14 @@ interface SetModeledMethodMessage {
576579
method: ModeledMethod;
577580
}
578581

582+
interface SetInModelingModeMessage {
583+
t: "setInModelingMode";
584+
inModelingMode: boolean;
585+
}
586+
579587
interface RevealMethodMessage {
580588
t: "revealMethod";
581-
method: Method;
589+
methodSignature: string;
582590
}
583591

584592
export type ToModelEditorMessage =
@@ -609,10 +617,20 @@ interface RevealInEditorMessage {
609617
method: Method;
610618
}
611619

620+
interface StartModelingMessage {
621+
t: "startModeling";
622+
}
623+
612624
export type FromMethodModelingMessage =
613625
| CommonFromViewMessages
614626
| SetModeledMethodMessage
615-
| RevealInEditorMessage;
627+
| RevealInEditorMessage
628+
| StartModelingMessage;
629+
630+
interface SetMethodModelingPanelViewStateMessage {
631+
t: "setMethodModelingPanelViewState";
632+
viewState: MethodModelingPanelViewState;
633+
}
616634

617635
interface SetMethodMessage {
618636
t: "setMethod";
@@ -632,7 +650,9 @@ interface SetSelectedMethodMessage {
632650
}
633651

634652
export type ToMethodModelingMessage =
653+
| SetMethodModelingPanelViewStateMessage
635654
| SetMethodMessage
636655
| SetModeledMethodMessage
637656
| SetMethodModifiedMessage
638-
| SetSelectedMethodMessage;
657+
| SetSelectedMethodMessage
658+
| SetInModelingModeMessage;

extensions/ql-vscode/src/common/query-language.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@ export const PACKS_BY_QUERY_LANGUAGE = {
4040
],
4141
[QueryLanguage.Go]: ["codeql/go-queries"],
4242
[QueryLanguage.Java]: ["codeql/java-queries"],
43-
[QueryLanguage.Javascript]: [
44-
"codeql/javascript-queries",
45-
"codeql/javascript-experimental-atm-queries",
46-
],
43+
[QueryLanguage.Javascript]: ["codeql/javascript-queries"],
4744
[QueryLanguage.Python]: ["codeql/python-queries"],
4845
[QueryLanguage.Ruby]: ["codeql/ruby-queries"],
4946
};

extensions/ql-vscode/src/common/vscode/abstract-webview-view-provider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export abstract class AbstractWebviewViewProvider<
1313
private disposables: Disposable[] = [];
1414

1515
constructor(
16-
private readonly app: App,
16+
protected readonly app: App,
1717
private readonly webviewKind: WebviewKind,
1818
) {}
1919

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import {
33
Extension,
44
ExtensionContext,
55
ConfigurationChangeEvent,
6+
env,
67
} from "vscode";
78
import TelemetryReporter from "vscode-extension-telemetry";
89
import {
910
ConfigListener,
1011
CANARY_FEATURES,
1112
ENABLE_TELEMETRY,
12-
GLOBAL_ENABLE_TELEMETRY,
1313
LOG_TELEMETRY,
1414
isIntegrationTestMode,
1515
isCanary,
@@ -59,8 +59,6 @@ export class ExtensionTelemetryListener
5959
extends ConfigListener
6060
implements AppTelemetry
6161
{
62-
static relevantSettings = [ENABLE_TELEMETRY, CANARY_FEATURES];
63-
6462
private reporter?: TelemetryReporter;
6563

6664
private cliVersionStr = NOT_SET_CLI_VERSION;
@@ -72,6 +70,10 @@ export class ExtensionTelemetryListener
7270
private readonly ctx: ExtensionContext,
7371
) {
7472
super();
73+
74+
env.onDidChangeTelemetryEnabled(async () => {
75+
await this.initialize();
76+
});
7577
}
7678

7779
/**
@@ -91,18 +93,15 @@ export class ExtensionTelemetryListener
9193
async handleDidChangeConfiguration(
9294
e: ConfigurationChangeEvent,
9395
): Promise<void> {
94-
if (
95-
e.affectsConfiguration("codeQL.telemetry.enableTelemetry") ||
96-
e.affectsConfiguration("telemetry.enableTelemetry")
97-
) {
96+
if (e.affectsConfiguration(ENABLE_TELEMETRY.qualifiedName)) {
9897
await this.initialize();
9998
}
10099

101100
// Re-request telemetry so that users can see the dialog again.
102101
// Re-request if codeQL.canary is being set to `true` and telemetry
103102
// is not currently enabled.
104103
if (
105-
e.affectsConfiguration("codeQL.canary") &&
104+
e.affectsConfiguration(CANARY_FEATURES.qualifiedName) &&
106105
CANARY_FEATURES.getValue() &&
107106
!ENABLE_TELEMETRY.getValue()
108107
) {
@@ -212,7 +211,7 @@ export class ExtensionTelemetryListener
212211
properties.stack = error.stack;
213212
}
214213

215-
this.reporter.sendTelemetryEvent("error", properties, {});
214+
this.reporter.sendTelemetryErrorEvent("error", properties, {});
216215
}
217216

218217
/**
@@ -224,7 +223,7 @@ export class ExtensionTelemetryListener
224223
// if global telemetry is disabled, avoid showing the dialog or making any changes
225224
let result = undefined;
226225
if (
227-
GLOBAL_ENABLE_TELEMETRY.getValue() &&
226+
env.isTelemetryEnabled &&
228227
// Avoid showing the dialog if we are in integration test mode.
229228
!isIntegrationTestMode()
230229
) {

extensions/ql-vscode/src/config.ts

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,27 +72,15 @@ export const VSCODE_SAVE_BEFORE_START_SETTING = new Setting(
7272

7373
const ROOT_SETTING = new Setting("codeQL");
7474

75-
// Global configuration
75+
// Telemetry configuration
7676
const TELEMETRY_SETTING = new Setting("telemetry", ROOT_SETTING);
77-
const AST_VIEWER_SETTING = new Setting("astViewer", ROOT_SETTING);
78-
const CONTEXTUAL_QUERIES_SETTINGS = new Setting(
79-
"contextualQueries",
80-
ROOT_SETTING,
81-
);
82-
const GLOBAL_TELEMETRY_SETTING = new Setting("telemetry");
83-
const LOG_INSIGHTS_SETTING = new Setting("logInsights", ROOT_SETTING);
8477

8578
export const LOG_TELEMETRY = new Setting("logTelemetry", TELEMETRY_SETTING);
8679
export const ENABLE_TELEMETRY = new Setting(
8780
"enableTelemetry",
8881
TELEMETRY_SETTING,
8982
);
9083

91-
export const GLOBAL_ENABLE_TELEMETRY = new Setting(
92-
"enableTelemetry",
93-
GLOBAL_TELEMETRY_SETTING,
94-
);
95-
9684
// Distribution configuration
9785
const DISTRIBUTION_SETTING = new Setting("cli", ROOT_SETTING);
9886
export const CUSTOM_CODEQL_PATH_SETTING = new Setting(
@@ -475,6 +463,7 @@ export function allowCanaryQueryServer() {
475463
return value === undefined ? true : !!value;
476464
}
477465

466+
const LOG_INSIGHTS_SETTING = new Setting("logInsights", ROOT_SETTING);
478467
export const JOIN_ORDER_WARNING_THRESHOLD = new Setting(
479468
"joinOrderWarningThreshold",
480469
LOG_INSIGHTS_SETTING,
@@ -484,6 +473,7 @@ export function joinOrderWarningThreshold(): number {
484473
return JOIN_ORDER_WARNING_THRESHOLD.getValue<number>();
485474
}
486475

476+
const AST_VIEWER_SETTING = new Setting("astViewer", ROOT_SETTING);
487477
/**
488478
* Hidden setting: Avoids caching in the AST viewer if the user is also a canary user.
489479
*/
@@ -492,6 +482,10 @@ export const NO_CACHE_AST_VIEWER = new Setting(
492482
AST_VIEWER_SETTING,
493483
);
494484

485+
const CONTEXTUAL_QUERIES_SETTINGS = new Setting(
486+
"contextualQueries",
487+
ROOT_SETTING,
488+
);
495489
/**
496490
* Hidden setting: Avoids caching in jump to def and find refs contextual queries if the user is also a canary user.
497491
*/

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { DbModelingState, ModelingStore } from "../modeling-store";
1212
import { AbstractWebviewViewProvider } from "../../common/vscode/abstract-webview-view-provider";
1313
import { assertNever } from "../../common/helpers-pure";
1414
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
15+
import { showMultipleModels } from "../../config";
1516

1617
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
1718
ToMethodModelingMessage,
@@ -29,11 +30,20 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
2930
super(app, "method-modeling");
3031
}
3132

32-
protected override onWebViewLoaded(): void {
33-
this.setInitialState();
33+
protected override async onWebViewLoaded(): Promise<void> {
34+
await Promise.all([this.setViewState(), this.setInitialState()]);
3435
this.registerToModelingStoreEvents();
3536
}
3637

38+
private async setViewState(): Promise<void> {
39+
await this.postMessage({
40+
t: "setMethodModelingPanelViewState",
41+
viewState: {
42+
showMultipleModels: showMultipleModels(),
43+
},
44+
});
45+
}
46+
3747
public async setMethod(method: Method): Promise<void> {
3848
this.method = method;
3949

@@ -45,15 +55,17 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
4555
}
4656
}
4757

48-
private setInitialState(): void {
49-
const selectedMethod = this.modelingStore.getSelectedMethodDetails();
50-
if (selectedMethod) {
51-
void this.postMessage({
52-
t: "setSelectedMethod",
53-
method: selectedMethod.method,
54-
modeledMethod: selectedMethod.modeledMethod,
55-
isModified: selectedMethod.isModified,
56-
});
58+
private async setInitialState(): Promise<void> {
59+
if (this.modelingStore.hasStateForActiveDb()) {
60+
const selectedMethod = this.modelingStore.getSelectedMethodDetails();
61+
if (selectedMethod) {
62+
await this.postMessage({
63+
t: "setSelectedMethod",
64+
method: selectedMethod.method,
65+
modeledMethod: selectedMethod.modeledMethod,
66+
isModified: selectedMethod.isModified,
67+
});
68+
}
5769
}
5870
}
5971

@@ -62,7 +74,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
6274
): Promise<void> {
6375
switch (msg.t) {
6476
case "viewLoaded":
65-
this.onWebViewLoaded();
77+
await this.onWebViewLoaded();
6678
break;
6779

6880
case "telemetry":
@@ -92,6 +104,12 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
92104
await this.revealInModelEditor(msg.method);
93105

94106
break;
107+
108+
case "startModeling":
109+
await this.app.commands.execute(
110+
"codeQL.openModelEditorFromModelingPanel",
111+
);
112+
break;
95113
default:
96114
assertNever(msg);
97115
}
@@ -159,5 +177,25 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
159177
}
160178
}),
161179
);
180+
181+
this.push(
182+
this.modelingStore.onDbOpened(async () => {
183+
await this.postMessage({
184+
t: "setInModelingMode",
185+
inModelingMode: true,
186+
});
187+
}),
188+
);
189+
190+
this.push(
191+
this.modelingStore.onDbClosed(async () => {
192+
if (!this.modelingStore.anyDbsBeingModeled()) {
193+
await this.postMessage({
194+
t: "setInModelingMode",
195+
inModelingMode: false,
196+
});
197+
}
198+
}),
199+
);
162200
}
163201
}

0 commit comments

Comments
 (0)