Skip to content

Commit 38e5d8b

Browse files
committed
Attempt to fix tests
1 parent c1fceab commit 38e5d8b

File tree

4 files changed

+45
-21
lines changed

4 files changed

+45
-21
lines changed

extensions/ql-vscode/src/cli.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { assertNever } from './pure/helpers-pure';
1717
import { QueryMetadata, SortDirection } from './pure/interface-types';
1818
import { Logger, ProgressReporter } from './logging';
1919
import { CompilationMessage } from './pure/messages';
20+
import { dbSchemeToLanguage } from './helpers';
2021

2122
/**
2223
* The version of the SARIF format that we are using.
@@ -159,6 +160,11 @@ export class CodeQLCliServer implements Disposable {
159160
/** Version of current cli, lazily computed by the `getVersion()` method */
160161
private _version: SemVer | undefined;
161162

163+
/**
164+
* The languages supported by the current version of the CLI, computed by `getSupportedLanguages()`.
165+
*/
166+
private _supportedLanguages: string[] | undefined;
167+
162168
/** Path to current codeQL executable, or undefined if not running yet. */
163169
codeQlPath: string | undefined;
164170

@@ -181,12 +187,14 @@ export class CodeQLCliServer implements Disposable {
181187
this.distributionProvider.onDidChangeDistribution(() => {
182188
this.restartCliServer();
183189
this._version = undefined;
190+
this._supportedLanguages = undefined;
184191
});
185192
}
186193
if (this.cliConfig.onDidChangeConfiguration) {
187194
this.cliConfig.onDidChangeConfiguration(() => {
188195
this.restartCliServer();
189196
this._version = undefined;
197+
this._supportedLanguages = undefined;
190198
});
191199
}
192200
}
@@ -781,6 +789,23 @@ export class CodeQLCliServer implements Disposable {
781789
return await this.runJsonCodeQlCliCommand<LanguagesInfo>(['resolve', 'languages'], [], 'Resolving languages');
782790
}
783791

792+
/**
793+
* Gets the list of available languages. Refines the result of `resolveLanguages()`, by excluding
794+
* extra things like "xml" and "properties".
795+
*
796+
* @returns An array of languages that are supported by the current version of the CodeQL CLI.
797+
*/
798+
public async getSupportedLanguages(): Promise<string[]> {
799+
if (!this._supportedLanguages) {
800+
// Get the intersection of resolveLanguages with the list of hardcoded languages in dbSchemeToLanguage.
801+
const resolvedLanguages = Object.keys(await this.resolveLanguages());
802+
const hardcodedLanguages = Object.values(dbSchemeToLanguage);
803+
804+
this._supportedLanguages = resolvedLanguages.filter(lang => hardcodedLanguages.includes(lang));
805+
}
806+
return this._supportedLanguages;
807+
}
808+
784809
/**
785810
* Gets information about queries in a query suite.
786811
* @param suite The suite to resolve.

extensions/ql-vscode/src/helpers.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ export class CachedOperation<U> {
415415
* @see cli.CliVersionConstraint.supportsLanguageName
416416
* @see cli.CodeQLCliServer.resolveDatabase
417417
*/
418-
const dbSchemeToLanguage = {
418+
export const dbSchemeToLanguage = {
419419
'semmlecode.javascript.dbscheme': 'javascript',
420420
'semmlecode.cpp.dbscheme': 'cpp',
421421
'semmlecode.dbscheme': 'java',
@@ -498,14 +498,12 @@ export async function findLanguage(
498498
}
499499

500500
// will be undefined if user cancels the quick pick.
501-
return await askForLanguage(false);
501+
return await askForLanguage(cliServer, false);
502502
}
503503

504-
export const supportedLanguages = Object.values(dbSchemeToLanguage).sort();
505-
506-
export async function askForLanguage(throwOnEmpty = true): Promise<string | undefined> {
504+
export async function askForLanguage(cliServer: CodeQLCliServer, throwOnEmpty = true): Promise<string | undefined> {
507505
const language = await Window.showQuickPick(
508-
supportedLanguages,
506+
await cliServer.getSupportedLanguages(),
509507
{ placeHolder: 'Select target language for your query', ignoreFocusOut: true }
510508
);
511509
if (!language) {

extensions/ql-vscode/src/run-remote-query.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ async function generateQueryPack(cliServer: cli.CodeQLCliServer, queryFile: stri
134134

135135
} else {
136136
// open popup to ask for language if not already hardcoded
137-
language = fallbackLanguage || await askForLanguage();
137+
language = fallbackLanguage || await askForLanguage(cliServer);
138138

139139
// copy only the query file to the query pack directory
140140
// and generate a synthetic query pack

extensions/ql-vscode/src/vscode-tests/cli-integration/run-cli.test.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { SemVer } from 'semver';
66
import { CodeQLCliServer, QueryInfoByLanguage } from '../../cli';
77
import { CodeQLExtensionInterface } from '../../extension';
88
import { skipIfNoCodeQL } from '../ensureCli';
9-
import { getOnDiskWorkspaceFolders, getQlPackForDbscheme, languageToDbScheme, supportedLanguages } from '../../helpers';
9+
import { getOnDiskWorkspaceFolders, getQlPackForDbscheme, languageToDbScheme } from '../../helpers';
1010
import { resolveQueries } from '../../contextual/queryResolver';
1111
import { KeyType } from '../../contextual/keyType';
1212

@@ -17,11 +17,13 @@ describe('Use cli', function() {
1717
this.timeout(60000);
1818

1919
let cli: CodeQLCliServer;
20+
let supportedLanguages: string[];
2021

2122
beforeEach(async () => {
2223
const extension = await extensions.getExtension<CodeQLExtensionInterface | Record<string, never>>('GitHub.vscode-codeql')!.activate();
2324
if ('cliServer' in extension) {
2425
cli = extension.cliServer;
26+
supportedLanguages = await cli.getSupportedLanguages();
2527
} else {
2628
throw new Error('Extension not initialized. Make sure cli is downloaded and installed properly.');
2729
}
@@ -56,12 +58,11 @@ describe('Use cli', function() {
5658
}
5759
});
5860

59-
it('should resolve languages', async function() {
61+
it('should support the expected languages', async function() {
6062
skipIfNoCodeQL(this);
61-
const languages = await cli.resolveLanguages();
62-
for (const expectedLanguage of supportedLanguages) {
63-
expect(languages).to.have.property(expectedLanguage).that.is.not.undefined;
64-
}
63+
// Just check a few examples that definitely are/aren't supported.
64+
expect(supportedLanguages).to.include.members(['go', 'javascript', 'python']);
65+
expect(supportedLanguages).to.not.include.members(['xml', 'properties']);
6566
});
6667

6768
it('should resolve query by language', async function() {
@@ -71,15 +72,15 @@ describe('Use cli', function() {
7172
expect((Object.keys(queryInfo.byLanguage))[0]).to.eql('javascript');
7273
});
7374

75+
it('should resolve printAST queries for supported languages', async function() {
76+
skipIfNoCodeQL(this);
77+
supportedLanguages.forEach(async lang => {
78+
if (lang === 'go') {
79+
// The codeql-go submodule is not available in the integration tests.
80+
return;
81+
}
7482

75-
supportedLanguages.forEach(lang => {
76-
if (lang === 'go') {
77-
// The codeql-go submodule is not available in the integration tests.
78-
return;
79-
}
80-
it(`should resolve printAST queries for ${lang}`, async function() {
81-
skipIfNoCodeQL(this);
82-
83+
console.log(`resolving printAST queries for ${lang}`);
8384
const pack = await getQlPackForDbscheme(cli, languageToDbScheme[lang]);
8485
expect(pack.dbschemePack).to.contain(lang);
8586
if (pack.dbschemePackIsLibraryPack) {

0 commit comments

Comments
 (0)