Skip to content

Commit c0ed920

Browse files
author
Stephan Brandauer
committed
fix spurious compilation errors by notifying language server of newly created packs
1 parent 94434f4 commit c0ed920

File tree

5 files changed

+42
-3
lines changed

5 files changed

+42
-3
lines changed

extensions/ql-vscode/src/databases/local-databases/database-manager.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import { telemetryListener } from "../../common/vscode/telemetry";
4444
import type { LanguageContextStore } from "../../language-context-store";
4545
import type { DatabaseOrigin } from "./database-origin";
4646
import { ensureZippedSourceLocation } from "./database-contents";
47+
import type { LanguageClient } from "vscode-languageclient/node";
4748

4849
/**
4950
* The name of the key in the workspaceState dictionary in which we
@@ -118,6 +119,7 @@ export class DatabaseManager extends DisposableObject {
118119
private readonly app: App,
119120
private readonly qs: QueryRunner,
120121
private readonly cli: CodeQLCliServer,
122+
private readonly langClient: LanguageClient,
121123
private readonly languageContext: LanguageContextStore,
122124
public logger: Logger,
123125
) {
@@ -407,6 +409,7 @@ export class DatabaseManager extends DisposableObject {
407409
const qlPackGenerator = new QlPackGenerator(
408410
databaseItem.language,
409411
this.cli,
412+
this.langClient,
410413
qlpackStoragePath,
411414
qlpackStoragePath,
412415
);

extensions/ql-vscode/src/extension.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -792,12 +792,16 @@ async function activateWithInstalledDistribution(
792792
const languageSelectionPanel = new LanguageSelectionPanel(languageContext);
793793
ctx.subscriptions.push(languageSelectionPanel);
794794

795+
void extLogger.log("Initializing CodeQL language server.");
796+
const languageClient = createLanguageClient(qlConfigurationListener);
797+
795798
void extLogger.log("Initializing database manager.");
796799
const dbm = new DatabaseManager(
797800
ctx,
798801
app,
799802
qs,
800803
cliServer,
804+
languageClient,
801805
languageContext,
802806
extLogger,
803807
);
@@ -961,16 +965,14 @@ async function activateWithInstalledDistribution(
961965

962966
ctx.subscriptions.push(tmpDirDisposal);
963967

964-
void extLogger.log("Initializing CodeQL language server.");
965-
const languageClient = createLanguageClient(qlConfigurationListener);
966-
967968
const localQueries = new LocalQueries(
968969
app,
969970
qs,
970971
qhm,
971972
dbm,
972973
databaseFetcher,
973974
cliServer,
975+
languageClient,
974976
databaseUI,
975977
localQueryResultsView,
976978
queryStorageDir,

extensions/ql-vscode/src/local-queries/local-queries.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import { tryGetQueryLanguage } from "../common/query-language";
5555
import type { LanguageContextStore } from "../language-context-store";
5656
import type { ExtensionApp } from "../common/vscode/extension-app";
5757
import type { DatabaseFetcher } from "../databases/database-fetcher";
58+
import type { LanguageClient } from "vscode-languageclient/node";
5859

5960
export enum QuickEvalType {
6061
None,
@@ -72,6 +73,7 @@ export class LocalQueries extends DisposableObject {
7273
private readonly databaseManager: DatabaseManager,
7374
private readonly databaseFetcher: DatabaseFetcher,
7475
private readonly cliServer: CodeQLCliServer,
76+
private readonly langClient: LanguageClient,
7577
private readonly databaseUI: DatabaseUI,
7678
private readonly localQueryResultsView: ResultsView,
7779
private readonly queryStorageDir: string,
@@ -324,6 +326,7 @@ export class LocalQueries extends DisposableObject {
324326
const language = this.languageContextStore.selectedLanguage;
325327
const skeletonQueryWizard = new SkeletonQueryWizard(
326328
this.cliServer,
329+
this.langClient,
327330
progress,
328331
this.app,
329332
this.databaseManager,

extensions/ql-vscode/src/local-queries/qlpack-generator.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import type { CodeQLCliServer } from "../codeql-cli/cli";
66
import type { QueryLanguage } from "../common/query-language";
77
import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders";
88
import { basename } from "../common/path";
9+
import {
10+
DidChangeWatchedFilesNotification,
11+
FileChangeType,
12+
} from "vscode-languageclient";
13+
import type { LanguageClient } from "vscode-languageclient/node";
914

1015
export class QlPackGenerator {
1116
private qlpackName: string | undefined;
@@ -17,6 +22,7 @@ export class QlPackGenerator {
1722
constructor(
1823
private readonly queryLanguage: QueryLanguage,
1924
private readonly cliServer: CodeQLCliServer,
25+
private readonly langClient: LanguageClient,
2026
private readonly storagePath: string,
2127
private readonly queryStoragePath: string,
2228
private readonly includeFolderNameInQlpackName: boolean = false,
@@ -114,5 +120,27 @@ select f, "Hello, world!"
114120

115121
private async createCodeqlPackLockYaml() {
116122
await this.cliServer.packAdd(this.folderUri.fsPath, this.queryLanguage);
123+
// when the language pack has not been available locally before, the
124+
// packAdd command will download it. This will trigger a pack change that
125+
// the language server needs to be notified of:
126+
await this.notifyPackChanged(this.folderUri.fsPath, this.langClient);
127+
}
128+
129+
private async notifyPackChanged(
130+
packFileDir: string,
131+
ideServer: LanguageClient,
132+
) {
133+
const packFilePath = join(packFileDir, this.qlpackFileName);
134+
await this.cliServer.logger.log(
135+
`Notifying pack change for ${packFilePath}`,
136+
);
137+
await ideServer.sendNotification(DidChangeWatchedFilesNotification.type, {
138+
changes: [
139+
{
140+
type: FileChangeType.Changed,
141+
uri: Uri.file(packFilePath).toString(),
142+
},
143+
],
144+
});
117145
}
118146
}

extensions/ql-vscode/src/local-queries/skeleton-query-wizard.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import type { QueryTreeViewItem } from "../queries-panel/query-tree-view-item";
3434
import { containsPath, pathsEqual } from "../common/files";
3535
import { getQlPackFilePath } from "../common/ql";
3636
import { getQlPackLanguage } from "../common/qlpack-language";
37+
import type { LanguageClient } from "vscode-languageclient/node";
3738

3839
type QueryLanguagesToDatabaseMap = Record<string, string>;
3940

@@ -56,6 +57,7 @@ export class SkeletonQueryWizard {
5657

5758
constructor(
5859
private readonly cliServer: CodeQLCliServer,
60+
private readonly langClient: LanguageClient,
5961
private readonly progress: ProgressCallback,
6062
private readonly app: App,
6163
private readonly databaseManager: DatabaseManager,
@@ -443,6 +445,7 @@ export class SkeletonQueryWizard {
443445
return new QlPackGenerator(
444446
this.language,
445447
this.cliServer,
448+
this.langClient,
446449
this.qlPackStoragePath,
447450
this.queryStoragePath,
448451
includeFolderNameInQlpackName,

0 commit comments

Comments
 (0)