Refactor resolveLanguages() to cache output according to CLI feature support

The output of `resolveLanguages()` can vary based on whether the flag `--filter-to-languages-with-queries` is included, but not all versions of the CLI support that. This makes caching a single execution problematic, so I opted to cache it based on whether it's supported. If it's supported, it's used; otherwise, it's not.
This commit is contained in:
Mario Campos
2026-06-18 14:42:03 -05:00
parent 553eef0d3f
commit c8e32e423d
4 changed files with 41 additions and 41 deletions
+13 -9
View File
@@ -151415,9 +151415,7 @@ async function getSupportedLanguageMap(codeql, logger) {
const resolveSupportedLanguagesUsingCli = await codeql.supportsFeature(
"builtinExtractorsSpecifyDefaultQueries" /* BuiltinExtractorsSpecifyDefaultQueries */
);
const resolveResult = await codeql.resolveLanguages({
filterToLanguagesWithQueries: resolveSupportedLanguagesUsingCli
});
const resolveResult = await codeql.resolveLanguages();
if (resolveSupportedLanguagesUsingCli) {
logger.debug(
`The CodeQL CLI supports the following languages: ${Object.keys(resolveResult.extractors).join(", ")}`
@@ -153931,21 +153929,27 @@ async function getCodeQLForCmd(cmd, checkVersion) {
];
await runCli(cmd, args);
},
async resolveLanguages({
filterToLanguagesWithQueries
} = { filterToLanguagesWithQueries: false }) {
async resolveLanguages() {
return getCachedOrRun(
"resolveLanguages" /* ResolveLanguages */,
cmd,
() => runCliJson(cmd, [
async () => {
const isFilterToLanguagesWithQueriesSupported = await this.supportsFeature(
"builtinExtractorsSpecifyDefaultQueries" /* BuiltinExtractorsSpecifyDefaultQueries */
);
return runCliJson(cmd, [
"resolve",
"languages",
"--format=betterjson",
"--extractor-options-verbosity=4",
"--extractor-include-aliases",
...filterToLanguagesWithQueries ? ["--filter-to-languages-with-queries"] : [],
// TODO: Unconditionally include `--filter-to-languages-with-queries`
// once CODEQL_MINIMUM_VERSION is at least v2.23.0
// — the first version to support this flag.
...isFilterToLanguagesWithQueriesSupported ? ["--filter-to-languages-with-queries"] : [],
...getExtraOptionsFromEnv(["resolve", "languages"])
]),
]);
},
isResolveLanguagesOutput
);
},
+14 -14
View File
@@ -126,9 +126,7 @@ export interface CodeQL {
/**
* Run 'codeql resolve languages' with '--format=betterjson'.
*/
resolveLanguages(options?: {
filterToLanguagesWithQueries: boolean;
}): Promise<ResolveLanguagesOutput>;
resolveLanguages(): Promise<ResolveLanguagesOutput>;
/**
* Run 'codeql resolve build-environment'
*/
@@ -784,28 +782,30 @@ async function getCodeQLForCmd(
];
await runCli(cmd, args);
},
async resolveLanguages(
{
filterToLanguagesWithQueries,
}: {
filterToLanguagesWithQueries: boolean;
} = { filterToLanguagesWithQueries: false },
) {
async resolveLanguages() {
return getCachedOrRun(
CommandCacheKey.ResolveLanguages,
cmd,
() =>
runCliJson<ResolveLanguagesOutput>(cmd, [
async () => {
const isFilterToLanguagesWithQueriesSupported =
await this.supportsFeature(
ToolsFeature.BuiltinExtractorsSpecifyDefaultQueries,
);
return runCliJson<ResolveLanguagesOutput>(cmd, [
"resolve",
"languages",
"--format=betterjson",
"--extractor-options-verbosity=4",
"--extractor-include-aliases",
...(filterToLanguagesWithQueries
// TODO: Unconditionally include `--filter-to-languages-with-queries`
// once CODEQL_MINIMUM_VERSION is at least v2.23.0
// — the first version to support this flag.
...(isFilterToLanguagesWithQueriesSupported
? ["--filter-to-languages-with-queries"]
: []),
...getExtraOptionsFromEnv(["resolve", "languages"]),
]),
]);
},
isResolveLanguagesOutput,
);
},
+3 -5
View File
@@ -891,7 +891,7 @@ const mockRepositoryNwo = parseRepositoryNwo("owner/repo");
extractor_root: "",
};
const codeQL = createStubCodeQL({
resolveLanguages: (options) =>
resolveLanguages: () =>
Promise.resolve({
aliases: {
"c#": BuiltInLanguage.csharp,
@@ -905,11 +905,9 @@ const mockRepositoryNwo = parseRepositoryNwo("owner/repo");
java: [stubExtractorEntry],
javascript: [stubExtractorEntry],
python: [stubExtractorEntry],
...(options?.filterToLanguagesWithQueries
? {}
: {
// `html` is an extractor without default queries. It should be
// excluded from the supported language map.
html: [stubExtractorEntry],
}),
},
}),
});
+4 -6
View File
@@ -266,9 +266,7 @@ async function getSupportedLanguageMap(
const resolveSupportedLanguagesUsingCli = await codeql.supportsFeature(
ToolsFeature.BuiltinExtractorsSpecifyDefaultQueries,
);
const resolveResult = await codeql.resolveLanguages({
filterToLanguagesWithQueries: resolveSupportedLanguagesUsingCli,
});
const resolveResult = await codeql.resolveLanguages();
if (resolveSupportedLanguagesUsingCli) {
logger.debug(
`The CodeQL CLI supports the following languages: ${Object.keys(resolveResult.extractors).join(", ")}`,
@@ -277,9 +275,9 @@ async function getSupportedLanguageMap(
const supportedLanguages: Record<string, string> = {};
// Populate canonical language names
for (const extractor of Object.keys(resolveResult.extractors)) {
// If the CLI supports resolving languages with default queries, use these
// as the set of supported languages. Otherwise, require the language to be
// a built-in language.
// TODO: Delete this `if` condition once CODEQL_MINIMUM_VERSION
// is at least v2.23.0 — the first version to support the
// BuiltinExtractorsSpecifyDefaultQueries feature.
if (
resolveSupportedLanguagesUsingCli ||
BuiltInLanguage[extractor] !== undefined