Add support for filtering queries panel.

This commit is contained in:
Anders Starcke Henriksen
2023-09-26 16:16:28 +02:00
parent 552a4f6eb3
commit 1e6b7a6619
3 changed files with 39 additions and 16 deletions

View File

@@ -790,7 +790,7 @@ async function activateWithInstalledDistribution(
); );
ctx.subscriptions.push(databaseUI); ctx.subscriptions.push(databaseUI);
QueriesModule.initialize(app, cliServer); QueriesModule.initialize(app, languageContext, cliServer);
void extLogger.log("Initializing evaluator log viewer."); void extLogger.log("Initializing evaluator log viewer.");
const evalLogViewer = new EvalLogViewer(); const evalLogViewer = new EvalLogViewer();

View File

@@ -6,6 +6,7 @@ import { DisposableObject } from "../common/disposable-object";
import { QueriesPanel } from "./queries-panel"; import { QueriesPanel } from "./queries-panel";
import { QueryDiscovery } from "./query-discovery"; import { QueryDiscovery } from "./query-discovery";
import { QueryPackDiscovery } from "./query-pack-discovery"; import { QueryPackDiscovery } from "./query-pack-discovery";
import { LanguageContextStore } from "../language-context-store";
export class QueriesModule extends DisposableObject { export class QueriesModule extends DisposableObject {
private queriesPanel: QueriesPanel | undefined; private queriesPanel: QueriesPanel | undefined;
@@ -16,16 +17,21 @@ export class QueriesModule extends DisposableObject {
public static initialize( public static initialize(
app: App, app: App,
languageContext: LanguageContextStore,
cliServer: CodeQLCliServer, cliServer: CodeQLCliServer,
): QueriesModule { ): QueriesModule {
const queriesModule = new QueriesModule(app); const queriesModule = new QueriesModule(app);
app.subscriptions.push(queriesModule); app.subscriptions.push(queriesModule);
queriesModule.initialize(app, cliServer); queriesModule.initialize(app, languageContext, cliServer);
return queriesModule; return queriesModule;
} }
private initialize(app: App, cliServer: CodeQLCliServer): void { private initialize(
app: App,
langauageContext: LanguageContextStore,
cliServer: CodeQLCliServer,
): void {
// Currently, we only want to expose the new panel when we are in canary mode // Currently, we only want to expose the new panel when we are in canary mode
// and the user has enabled the "Show queries panel" flag. // and the user has enabled the "Show queries panel" flag.
if (!isCanary() || !showQueriesPanel()) { if (!isCanary() || !showQueriesPanel()) {
@@ -38,8 +44,9 @@ export class QueriesModule extends DisposableObject {
void queryPackDiscovery.initialRefresh(); void queryPackDiscovery.initialRefresh();
const queryDiscovery = new QueryDiscovery( const queryDiscovery = new QueryDiscovery(
app.environment, app,
queryPackDiscovery, queryPackDiscovery,
langauageContext,
); );
this.push(queryDiscovery); this.push(queryDiscovery);
void queryDiscovery.initialRefresh(); void queryDiscovery.initialRefresh();

View File

@@ -1,6 +1,6 @@
import { dirname, basename, normalize, relative } from "path"; import { dirname, basename, normalize, relative } from "path";
import { Event } from "vscode"; import { Event } from "vscode";
import { EnvironmentContext } from "../common/app"; import { App } from "../common/app";
import { import {
FileTreeDirectory, FileTreeDirectory,
FileTreeLeaf, FileTreeLeaf,
@@ -11,6 +11,8 @@ import { FilePathDiscovery } from "../common/vscode/file-path-discovery";
import { containsPath } from "../common/files"; import { containsPath } from "../common/files";
import { getOnDiskWorkspaceFoldersObjects } from "../common/vscode/workspace-folders"; import { getOnDiskWorkspaceFoldersObjects } from "../common/vscode/workspace-folders";
import { QueryLanguage } from "../common/query-language"; import { QueryLanguage } from "../common/query-language";
import { LanguageContextStore } from "../language-context-store";
import { AppEvent, AppEventEmitter } from "../common/events";
const QUERY_FILE_EXTENSION = ".ql"; const QUERY_FILE_EXTENSION = ".ql";
@@ -31,24 +33,36 @@ export class QueryDiscovery
extends FilePathDiscovery<Query> extends FilePathDiscovery<Query>
implements QueryDiscoverer implements QueryDiscoverer
{ {
public readonly onDidChangeQueries: AppEvent<void>;
private readonly onDidChangeQueriesEmitter: AppEventEmitter<void>;
constructor( constructor(
private readonly env: EnvironmentContext, private readonly app: App,
private readonly queryPackDiscovery: QueryPackDiscoverer, private readonly queryPackDiscovery: QueryPackDiscoverer,
private readonly languageContext: LanguageContextStore,
) { ) {
super("Query Discovery", `**/*${QUERY_FILE_EXTENSION}`); super("Query Discovery", `**/*${QUERY_FILE_EXTENSION}`);
// Set up event emitters
this.onDidChangeQueriesEmitter = this.push(app.createEventEmitter<void>());
this.onDidChangeQueries = this.onDidChangeQueriesEmitter.event;
// Handlers
this.push( this.push(
this.queryPackDiscovery.onDidChangeQueryPacks( this.queryPackDiscovery.onDidChangeQueryPacks(
this.recomputeAllData.bind(this), this.recomputeAllData.bind(this),
), ),
); );
} this.push(
this.onDidChangePathData(() => {
/** this.onDidChangeQueriesEmitter.fire();
* Event that fires when the set of queries in the workspace changes. }),
*/ );
public get onDidChangeQueries(): Event<void> { this.push(
return this.onDidChangePathData; this.languageContext.onLanguageContextChanged(() => {
this.onDidChangeQueriesEmitter.fire();
}),
);
} }
/** /**
@@ -64,8 +78,10 @@ export class QueryDiscovery
const roots = []; const roots = [];
for (const workspaceFolder of getOnDiskWorkspaceFoldersObjects()) { for (const workspaceFolder of getOnDiskWorkspaceFoldersObjects()) {
const queriesInRoot = pathData.filter((query) => const queriesInRoot = pathData.filter(
containsPath(workspaceFolder.uri.fsPath, query.path), (query) =>
containsPath(workspaceFolder.uri.fsPath, query.path) &&
this.languageContext.shouldInclude(query.language),
); );
if (queriesInRoot.length === 0) { if (queriesInRoot.length === 0) {
continue; continue;
@@ -73,7 +89,7 @@ export class QueryDiscovery
const root = new FileTreeDirectory<string>( const root = new FileTreeDirectory<string>(
workspaceFolder.uri.fsPath, workspaceFolder.uri.fsPath,
workspaceFolder.name, workspaceFolder.name,
this.env, this.app.environment,
); );
for (const query of queriesInRoot) { for (const query of queriesInRoot) {
const dirName = dirname(normalize(relative(root.path, query.path))); const dirName = dirname(normalize(relative(root.path, query.path)));