diff --git a/extensions/ql-vscode/src/local-databases.ts b/extensions/ql-vscode/src/local-databases.ts index c1c1c7f05..97e7dd931 100644 --- a/extensions/ql-vscode/src/local-databases.ts +++ b/extensions/ql-vscode/src/local-databases.ts @@ -911,6 +911,17 @@ export class DatabaseManager extends DisposableObject { return dbs[0]; } + public async digForDatabaseWithSameLanguage( + language: string, + ): Promise { + const dbItems = this.databaseItems || []; + const dbs = dbItems.filter((db) => db.language === language); + if (dbs.length === 0) { + return undefined; + } + return dbs[0]; + } + /** * Returns the index of the workspace folder that corresponds to the source archive of `item` * if there is one, and -1 otherwise. diff --git a/extensions/ql-vscode/src/skeleton-query-wizard.ts b/extensions/ql-vscode/src/skeleton-query-wizard.ts index 54a265fbe..2cc353656 100644 --- a/extensions/ql-vscode/src/skeleton-query-wizard.ts +++ b/extensions/ql-vscode/src/skeleton-query-wizard.ts @@ -231,17 +231,30 @@ export class SkeletonQueryWizard { const databaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language]; - const databaseItem = await this.databaseManager.digForDatabaseItem( + // Check that we haven't already downloaded a database for this language + const existingDatabaseItem = await this.databaseManager.digForDatabaseItem( this.language, databaseNwo, ); - if (databaseItem) { + if (existingDatabaseItem) { // select the found database - await this.databaseManager.setCurrentDatabaseItem(databaseItem); + await this.databaseManager.setCurrentDatabaseItem(existingDatabaseItem); } else { - // download new database and select it - await this.downloadDatabase(); + const sameLanguageDatabaseItem = + await this.databaseManager.digForDatabaseWithSameLanguage( + this.language, + ); + + if (sameLanguageDatabaseItem) { + // select the found database + await this.databaseManager.setCurrentDatabaseItem( + sameLanguageDatabaseItem, + ); + } else { + // download new database and select it + await this.downloadDatabase(); + } } } } diff --git a/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts b/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts index 2202a3487..5fc7a5d79 100644 --- a/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts @@ -42,6 +42,7 @@ describe("SkeletonQueryWizard", () => { const mockDatabaseManager = mockedObject({ setCurrentDatabaseItem: jest.fn(), digForDatabaseItem: jest.fn(), + digForDatabaseWithSameLanguage: jest.fn(), }); const mockCli = mockedObject({ resolveLanguages: jest