Skip to content

Commit 717ac10

Browse files
authored
Merge branch 'main' into d10c/trim-cache-command
2 parents 0dc4957 + 27c4bd8 commit 717ac10

41 files changed

Lines changed: 1157 additions & 362 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
**/* @github/codeql-vscode-reviewers
22
**/variant-analysis/ @github/code-scanning-secexp-reviewers
33
**/databases/ @github/code-scanning-secexp-reviewers
4+
**/method-modeling/ @github/code-scanning-secexp-reviewers
45
**/model-editor/ @github/code-scanning-secexp-reviewers
56
**/queries-panel/ @github/code-scanning-secexp-reviewers

extensions/ql-vscode/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
- It is now possible to show the language of query history items using the `%l` specifier in the `codeQL.queryHistory.format` setting. Note that this only works for queries run after this upgrade, and older items will show `unknown` as a language. [#2892](https://github.com/github/vscode-codeql/pull/2892)
77
- Increase the required version of VS Code to 1.82.0. [#2877](https://github.com/github/vscode-codeql/pull/2877)
88
- Fix a bug where the query server was restarted twice after configuration changes. [#2884](https://github.com/github/vscode-codeql/pull/2884).
9+
- Add support for the `telemetry.telemetryLevel` setting. 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). [#2824](https://github.com/github/vscode-codeql/pull/2824).
910

1011
## 1.9.1 - 29 September 2023
1112

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
}
@@ -2000,7 +2007,7 @@
20002007
"id": "codeQLMethodModeling",
20012008
"type": "webview",
20022009
"name": "CodeQL Method Modeling",
2003-
"when": "config.codeQL.canary && config.codeQL.model.methodModelingView"
2010+
"when": "config.codeQL.canary"
20042011
}
20052012
],
20062013
"codeql-methods-usage": [

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

Lines changed: 12 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

@@ -543,8 +546,7 @@ interface RefreshMethods {
543546

544547
interface SaveModeledMethods {
545548
t: "saveModeledMethods";
546-
methods: Method[];
547-
modeledMethods: Record<string, ModeledMethod>;
549+
methodSignatures?: string[];
548550
}
549551

550552
interface GenerateMethodMessage {
@@ -584,7 +586,7 @@ interface SetInModelingModeMessage {
584586

585587
interface RevealMethodMessage {
586588
t: "revealMethod";
587-
method: Method;
589+
methodSignature: string;
588590
}
589591

590592
export type ToModelEditorMessage =
@@ -625,6 +627,11 @@ export type FromMethodModelingMessage =
625627
| RevealInEditorMessage
626628
| StartModelingMessage;
627629

630+
interface SetMethodModelingPanelViewStateMessage {
631+
t: "setMethodModelingPanelViewState";
632+
viewState: MethodModelingPanelViewState;
633+
}
634+
628635
interface SetMethodMessage {
629636
t: "setMethod";
630637
method: Method;
@@ -643,6 +650,7 @@ interface SetSelectedMethodMessage {
643650
}
644651

645652
export type ToMethodModelingMessage =
653+
| SetMethodModelingPanelViewStateMessage
646654
| SetMethodMessage
647655
| SetModeledMethodMessage
648656
| SetMethodModifiedMessage

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: 32 additions & 25 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
*/
@@ -711,20 +705,33 @@ const LLM_GENERATION = new Setting("llmGeneration", MODEL_SETTING);
711705
const EXTENSIONS_DIRECTORY = new Setting("extensionsDirectory", MODEL_SETTING);
712706
const SHOW_MULTIPLE_MODELS = new Setting("showMultipleModels", MODEL_SETTING);
713707

714-
export function showFlowGeneration(): boolean {
715-
return !!FLOW_GENERATION.getValue<boolean>();
708+
export interface ModelConfig {
709+
flowGeneration: boolean;
710+
llmGeneration: boolean;
711+
getExtensionsDirectory(languageId: string): string | undefined;
712+
showMultipleModels: boolean;
716713
}
717714

718-
export function showLlmGeneration(): boolean {
719-
return !!LLM_GENERATION.getValue<boolean>();
720-
}
715+
export class ModelConfigListener extends ConfigListener implements ModelConfig {
716+
protected handleDidChangeConfiguration(e: ConfigurationChangeEvent): void {
717+
this.handleDidChangeConfigurationForRelevantSettings([MODEL_SETTING], e);
718+
}
721719

722-
export function getExtensionsDirectory(languageId: string): string | undefined {
723-
return EXTENSIONS_DIRECTORY.getValue<string>({
724-
languageId,
725-
});
726-
}
720+
public get flowGeneration(): boolean {
721+
return !!FLOW_GENERATION.getValue<boolean>();
722+
}
723+
724+
public get llmGeneration(): boolean {
725+
return !!LLM_GENERATION.getValue<boolean>();
726+
}
727727

728-
export function showMultipleModels(): boolean {
729-
return !!SHOW_MULTIPLE_MODELS.getValue<boolean>();
728+
public getExtensionsDirectory(languageId: string): string | undefined {
729+
return EXTENSIONS_DIRECTORY.getValue<string>({
730+
languageId,
731+
});
732+
}
733+
734+
public get showMultipleModels(): boolean {
735+
return !!SHOW_MULTIPLE_MODELS.getValue<boolean>();
736+
}
730737
}

extensions/ql-vscode/src/model-editor/extension-pack-picker.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { getQlPackPath, QLPACK_FILENAMES } from "../common/ql";
1111
import { getErrorMessage } from "../common/helpers-pure";
1212
import { ExtensionPack } from "./shared/extension-pack";
1313
import { NotificationLogger, showAndLogErrorMessage } from "../common/logging";
14-
import { getExtensionsDirectory } from "../config";
14+
import { ModelConfig } from "../config";
1515
import {
1616
autoNameExtensionPack,
1717
ExtensionPackName,
@@ -28,6 +28,7 @@ const extensionPackValidate = ajv.compile(extensionPackMetadataSchemaJson);
2828
export async function pickExtensionPack(
2929
cliServer: Pick<CodeQLCliServer, "resolveQlpacks">,
3030
databaseItem: Pick<DatabaseItem, "name" | "language">,
31+
modelConfig: ModelConfig,
3132
logger: NotificationLogger,
3233
progress: ProgressCallback,
3334
maxStep: number,
@@ -56,7 +57,9 @@ export async function pickExtensionPack(
5657
});
5758

5859
// Get the `codeQL.model.extensionsDirectory` setting for the language
59-
const userExtensionsDirectory = getExtensionsDirectory(databaseItem.language);
60+
const userExtensionsDirectory = modelConfig.getExtensionsDirectory(
61+
databaseItem.language,
62+
);
6063

6164
// If the setting is not set, automatically pick a suitable directory
6265
const extensionsDirectory = userExtensionsDirectory

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { MethodModelingViewProvider } from "./method-modeling-view-provider";
55
import { Method } from "../method";
66
import { ModelingStore } from "../modeling-store";
77
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
8+
import { ModelConfigListener } from "../../config";
89

910
export class MethodModelingPanel extends DisposableObject {
1011
private readonly provider: MethodModelingViewProvider;
@@ -16,10 +17,16 @@ export class MethodModelingPanel extends DisposableObject {
1617
) {
1718
super();
1819

20+
// This is here instead of in MethodModelingViewProvider because we need to
21+
// dispose this when the extension gets disposed, not when the webview gets
22+
// disposed.
23+
const modelConfig = this.push(new ModelConfigListener());
24+
1925
this.provider = new MethodModelingViewProvider(
2026
app,
2127
modelingStore,
2228
editorViewTracker,
29+
modelConfig,
2330
);
2431
this.push(
2532
window.registerWebviewViewProvider(

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

Lines changed: 25 additions & 5 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 { ModelConfigListener } from "../../config";
1516

1617
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
1718
ToMethodModelingMessage,
@@ -25,13 +26,24 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
2526
app: App,
2627
private readonly modelingStore: ModelingStore,
2728
private readonly editorViewTracker: ModelEditorViewTracker,
29+
private readonly modelConfig: ModelConfigListener,
2830
) {
2931
super(app, "method-modeling");
3032
}
3133

32-
protected override onWebViewLoaded(): void {
33-
this.setInitialState();
34+
protected override async onWebViewLoaded(): Promise<void> {
35+
await Promise.all([this.setViewState(), this.setInitialState()]);
3436
this.registerToModelingStoreEvents();
37+
this.registerToModelConfigEvents();
38+
}
39+
40+
private async setViewState(): Promise<void> {
41+
await this.postMessage({
42+
t: "setMethodModelingPanelViewState",
43+
viewState: {
44+
showMultipleModels: this.modelConfig.showMultipleModels,
45+
},
46+
});
3547
}
3648

3749
public async setMethod(method: Method): Promise<void> {
@@ -45,11 +57,11 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
4557
}
4658
}
4759

48-
private setInitialState(): void {
60+
private async setInitialState(): Promise<void> {
4961
if (this.modelingStore.hasStateForActiveDb()) {
5062
const selectedMethod = this.modelingStore.getSelectedMethodDetails();
5163
if (selectedMethod) {
52-
void this.postMessage({
64+
await this.postMessage({
5365
t: "setSelectedMethod",
5466
method: selectedMethod.method,
5567
modeledMethod: selectedMethod.modeledMethod,
@@ -64,7 +76,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
6476
): Promise<void> {
6577
switch (msg.t) {
6678
case "viewLoaded":
67-
this.onWebViewLoaded();
79+
await this.onWebViewLoaded();
6880
break;
6981

7082
case "telemetry":
@@ -188,4 +200,12 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
188200
}),
189201
);
190202
}
203+
204+
private registerToModelConfigEvents(): void {
205+
this.push(
206+
this.modelConfig.onDidChangeConfiguration(() => {
207+
void this.setViewState();
208+
}),
209+
);
210+
}
191211
}

0 commit comments

Comments
 (0)