Skip to content

Commit 0477a9d

Browse files
committed
Make query constraints for access paths query configurable
1 parent 7c233db commit 0477a9d

5 files changed

Lines changed: 39 additions & 12 deletions

File tree

extensions/ql-vscode/src/model-editor/languages/models-as-data.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type ModelsAsDataLanguageModelGeneration = {
4444
};
4545

4646
type ModelsAsDataLanguageAccessPathSuggestions = {
47+
queryConstraints: (mode: Mode) => QueryConstraints;
4748
parseResults: (
4849
// The results of a single predicate of the query.
4950
bqrs: DecodedBqrsChunk,

extensions/ql-vscode/src/model-editor/languages/ruby/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
rubyPath,
1313
} from "./access-paths";
1414
import { parseAccessPathSuggestionsResults } from "./suggestions";
15+
import { modeTag } from "../../mode-tag";
1516

1617
export const ruby: ModelsAsDataLanguage = {
1718
availableModes: [Mode.Framework],
@@ -170,6 +171,10 @@ export const ruby: ModelsAsDataLanguage = {
170171
parseResults: parseGenerateModelResults,
171172
},
172173
accessPathSuggestions: {
174+
queryConstraints: (mode) => ({
175+
kind: "table",
176+
"tags contain all": ["modeleditor", "access-paths", modeTag(mode)],
177+
}),
173178
parseResults: parseAccessPathSuggestionsResults,
174179
},
175180
getArgumentOptions: (method) => {

extensions/ql-vscode/src/model-editor/model-editor-view.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ export class ModelEditorView extends AbstractWebview<
529529
modelsAsDataLanguage,
530530
this.app.logger,
531531
),
532+
queryConstraints: accessPathSuggestions.queryConstraints(mode),
532533
cliServer: this.cliServer,
533534
queryRunner: this.queryRunner,
534535
queryStorageDir: this.queryStorageDir,

extensions/ql-vscode/src/model-editor/suggestion-queries.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { CodeQLCliServer } from "../codeql-cli/cli";
22
import type { Mode } from "./shared/mode";
3+
import type { QueryConstraints } from "../local-queries";
34
import { resolveQueriesFromPacks } from "../local-queries";
4-
import { modeTag } from "./mode-tag";
55
import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders";
66
import type { NotificationLogger } from "../common/logging";
77
import { showAndLogExceptionWithTelemetry } from "../common/logging";
@@ -22,6 +22,7 @@ type RunQueryOptions = {
2222
parseResults: (
2323
results: DecodedBqrsChunk,
2424
) => AccessPathSuggestionRow[] | Promise<AccessPathSuggestionRow[]>;
25+
queryConstraints: QueryConstraints;
2526

2627
cliServer: CodeQLCliServer;
2728
queryRunner: QueryRunner;
@@ -39,6 +40,7 @@ export async function runSuggestionsQuery(
3940
mode: Mode,
4041
{
4142
parseResults,
43+
queryConstraints,
4244
cliServer,
4345
queryRunner,
4446
logger,
@@ -68,6 +70,7 @@ export async function runSuggestionsQuery(
6870
cliServer,
6971
databaseItem.language,
7072
mode,
73+
queryConstraints,
7174
);
7275
if (!queryPath) {
7376
void showAndLogExceptionWithTelemetry(
@@ -141,13 +144,15 @@ export async function runSuggestionsQuery(
141144
* @param cliServer The CodeQL CLI server to use.
142145
* @param language The language of the query pack to use.
143146
* @param mode The mode to resolve the query for.
147+
* @param queryConstraints Constraints to apply to the query.
144148
* @param additionalPackNames Additional pack names to search.
145149
* @param additionalPackPaths Additional pack paths to search.
146150
*/
147151
async function resolveSuggestionsQuery(
148152
cliServer: CodeQLCliServer,
149153
language: string,
150154
mode: Mode,
155+
queryConstraints: QueryConstraints,
151156
additionalPackNames: string[] = [],
152157
additionalPackPaths: string[] = [],
153158
): Promise<string | undefined> {
@@ -156,14 +161,7 @@ async function resolveSuggestionsQuery(
156161
const queries = await resolveQueriesFromPacks(
157162
cliServer,
158163
packsToSearch,
159-
{
160-
kind: "table",
161-
"tags contain all": [
162-
"modeleditor",
163-
"access-path-suggestions",
164-
modeTag(mode),
165-
],
166-
},
164+
queryConstraints,
167165
additionalPackPaths,
168166
);
169167
if (queries.length > 1) {

extensions/ql-vscode/test/vscode-tests/no-workspace/model-editor/suggestion-queries.test.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { load } from "js-yaml";
2+
import { readFile } from "fs-extra";
13
import { createMockLogger } from "../../../__mocks__/loggerMock";
24
import type { DatabaseItem } from "../../../../src/databases/local-databases";
35
import { DatabaseKind } from "../../../../src/databases/local-databases";
@@ -138,15 +140,21 @@ describe("runSuggestionsQuery", () => {
138140
.mockResolvedValueOnce(mockInputSuggestions)
139141
.mockResolvedValueOnce(mockOutputSuggestions);
140142

143+
const resolveQueriesInSuite = jest
144+
.fn()
145+
.mockResolvedValue(["/a/b/c/FrameworkModeAccessPathSuggestions.ql"]);
146+
141147
const options = {
142148
parseResults,
149+
queryConstraints: {
150+
kind: "table",
151+
"tags all": ["modeleditor", "access-paths", "ruby", "foo"],
152+
},
143153
cliServer: mockedObject<CodeQLCliServer>({
144154
resolveQlpacks: jest.fn().mockResolvedValue({
145155
"my/extensions": "/a/b/c/",
146156
}),
147-
resolveQueriesInSuite: jest
148-
.fn()
149-
.mockResolvedValue(["/a/b/c/FrameworkModeAccessPathSuggestions.ql"]),
157+
resolveQueriesInSuite,
150158
packPacklist: jest
151159
.fn()
152160
.mockResolvedValue([
@@ -205,6 +213,20 @@ describe("runSuggestionsQuery", () => {
205213
undefined,
206214
undefined,
207215
);
216+
expect(options.cliServer.resolveQueriesInSuite).toHaveBeenCalledTimes(1);
217+
218+
expect(
219+
load(await readFile(resolveQueriesInSuite.mock.calls[0][0], "utf-8")),
220+
).toEqual([
221+
{
222+
from: "codeql/ruby-queries",
223+
include: {
224+
kind: "table",
225+
"tags all": ["modeleditor", "access-paths", "ruby", "foo"],
226+
},
227+
queries: ".",
228+
},
229+
]);
208230

209231
expect(options.parseResults).toHaveBeenCalledTimes(2);
210232

0 commit comments

Comments
 (0)