Fix AST Viewer

The previous synthetic query suite was not finding the ast query because
the `qlpack` directive in a query suite only matches queries from the
default suite, which `printAST.ql` is not part of.

This changes to using `from` and `queries` directives.

Also, adds an integration test to ensure we find the queries using
different CLIs. However, this only tests using the latest `main` from
the codeql repository. I wonder if we should start testing using
different versions of the repo.
This commit is contained in:
Andrew Eisenberg
2021-09-08 09:25:19 -07:00
committed by Dave Bartolomeo
parent cd427ee119
commit c2d3829a72
2 changed files with 25 additions and 13 deletions

View File

@@ -31,26 +31,24 @@ export async function qlpackOfDatabase(cli: CodeQLCliServer, db: DatabaseItem):
* @returns The found queries from the first pack in which any matching queries were found. * @returns The found queries from the first pack in which any matching queries were found.
*/ */
async function resolveQueriesFromPacks(cli: CodeQLCliServer, qlpacks: string[], keyType: KeyType): Promise<string[]> { async function resolveQueriesFromPacks(cli: CodeQLCliServer, qlpacks: string[], keyType: KeyType): Promise<string[]> {
const suiteFile = (await tmp.file({
postfix: '.qls'
})).path;
const suiteYaml = [];
for (const qlpack of qlpacks) { for (const qlpack of qlpacks) {
const suiteFile = (await tmp.file({ suiteYaml.push({
postfix: '.qls' from: qlpack,
})).path; queries: '.',
const suiteYaml = {
qlpack,
include: { include: {
kind: kindOfKeyType(keyType), kind: kindOfKeyType(keyType),
'tags contain': tagOfKeyType(keyType) 'tags contain': tagOfKeyType(keyType)
} }
}; });
await fs.writeFile(suiteFile, yaml.safeDump(suiteYaml), 'utf8');
const queries = await cli.resolveQueriesInSuite(suiteFile, helpers.getOnDiskWorkspaceFolders());
if (queries.length > 0) {
return queries;
}
} }
await fs.writeFile(suiteFile, yaml.safeDump(suiteYaml), 'utf8');
return []; const queries = await cli.resolveQueriesInSuite(suiteFile, helpers.getOnDiskWorkspaceFolders());
return queries;
} }
export async function resolveQueries(cli: CodeQLCliServer, qlpacks: QlPacksForLanguage, keyType: KeyType): Promise<string[]> { export async function resolveQueries(cli: CodeQLCliServer, qlpacks: QlPacksForLanguage, keyType: KeyType): Promise<string[]> {

View File

@@ -7,6 +7,8 @@ import { CodeQLCliServer, QueryInfoByLanguage } from '../../cli';
import { CodeQLExtensionInterface } from '../../extension'; import { CodeQLExtensionInterface } from '../../extension';
import { skipIfNoCodeQL } from '../ensureCli'; import { skipIfNoCodeQL } from '../ensureCli';
import { getOnDiskWorkspaceFolders } from '../../helpers'; import { getOnDiskWorkspaceFolders } from '../../helpers';
import { resolveQueries } from '../../contextual/queryResolver';
import { KeyType } from '../../contextual/keyType';
/** /**
* Perform proper integration tests by running the CLI * Perform proper integration tests by running the CLI
@@ -68,4 +70,16 @@ describe('Use cli', function() {
const queryInfo: QueryInfoByLanguage = await cli.resolveQueryByLanguage(getOnDiskWorkspaceFolders(), Uri.file(queryPath)); const queryInfo: QueryInfoByLanguage = await cli.resolveQueryByLanguage(getOnDiskWorkspaceFolders(), Uri.file(queryPath));
expect((Object.keys(queryInfo.byLanguage))[0]).to.eql('javascript'); expect((Object.keys(queryInfo.byLanguage))[0]).to.eql('javascript');
}); });
it.only('should resolve printAST queries', async function() {
skipIfNoCodeQL(this);
const result = await resolveQueries(cli, {
dbschemePack: 'codeql/javascript-all',
dbschemePackIsLibraryPack: true,
queryPack: 'codeql/javascript-queries'
}, KeyType.PrintAstQuery);
expect(result.length).to.eq(1);
expect(result[0].endsWith('javascript/ql/src/printAst.ql')).to.be.true;
});
}); });