Skip to content

Commit 33dd50c

Browse files
authored
Merge pull request #1588 from github/koesie10/open-query-text
Add ability to open the query text
2 parents 6cef629 + 195cd69 commit 33dd50c

File tree

14 files changed

+87
-11
lines changed

14 files changed

+87
-11
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ import {
114114
VariantAnalysisScannedRepository as ApiVariantAnalysisScannedRepository
115115
} from './remote-queries/gh-api/variant-analysis';
116116
import { VariantAnalysisManager } from './remote-queries/variant-analysis-manager';
117+
import { createVariantAnalysisContentProvider } from './remote-queries/variant-analysis-content-provider';
117118

118119
/**
119120
* extension.ts
@@ -485,6 +486,7 @@ async function activateWithInstalledDistribution(
485486
await fs.ensureDir(variantAnalysisStorageDir);
486487
const variantAnalysisManager = new VariantAnalysisManager(ctx, cliServer, variantAnalysisStorageDir, logger);
487488
ctx.subscriptions.push(variantAnalysisManager);
489+
ctx.subscriptions.push(workspace.registerTextDocumentContentProvider('codeql-variant-analysis', createVariantAnalysisContentProvider(variantAnalysisManager)));
488490

489491
void logger.log('Initializing remote queries manager.');
490492
const rqm = new RemoteQueriesManager(ctx, cliServer, queryStorageDir, logger, variantAnalysisManager);

extensions/ql-vscode/src/pure/interface-types.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,10 @@ export interface OpenQueryFileMessage {
468468
t: 'openQueryFile';
469469
}
470470

471+
export interface OpenQueryTextMessage {
472+
t: 'openQueryText';
473+
}
474+
471475
export type ToVariantAnalysisMessage =
472476
| SetVariantAnalysisMessage
473477
| SetRepoResultsMessage
@@ -477,4 +481,5 @@ export type FromVariantAnalysisMessage =
477481
| ViewLoadedMsg
478482
| StopVariantAnalysisMessage
479483
| RequestRepositoryResultsMessage
480-
| OpenQueryFileMessage;
484+
| OpenQueryFileMessage
485+
| OpenQueryTextMessage;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ export async function runRemoteQuery(
251251
throw new UserCancellationException(`Found unsupported language: ${language}`);
252252
}
253253

254+
const queryText = await fs.readFile(queryFile, 'utf8');
255+
254256
const variantAnalysisSubmission: VariantAnalysisSubmission = {
255257
startTime: queryStartTime,
256258
actionRepoRef: actionBranch,
@@ -260,6 +262,7 @@ export async function runRemoteQuery(
260262
filePath: queryFile,
261263
pack: base64Pack,
262264
language: variantAnalysisLanguage,
265+
text: queryText,
263266
},
264267
databases: {
265268
repositories: repoSelection.repositories,

extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ export interface VariantAnalysis {
77
query: {
88
name: string,
99
filePath: string,
10-
language: VariantAnalysisQueryLanguage
10+
language: VariantAnalysisQueryLanguage,
11+
text: string,
1112
},
1213
databases: {
1314
repositories?: string[],
@@ -114,6 +115,7 @@ export interface VariantAnalysisSubmission {
114115
name: string,
115116
filePath: string,
116117
language: VariantAnalysisQueryLanguage,
118+
text: string,
117119

118120
// Base64 encoded query pack.
119121
pack: string,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { TextDocumentContentProvider, Uri } from 'vscode';
2+
import { URLSearchParams } from 'url';
3+
import { showAndLogWarningMessage } from '../helpers';
4+
import { SHOW_QUERY_TEXT_MSG } from '../query-history';
5+
import { VariantAnalysisManager } from './variant-analysis-manager';
6+
7+
export const createVariantAnalysisContentProvider = (variantAnalysisManager: VariantAnalysisManager): TextDocumentContentProvider => ({
8+
async provideTextDocumentContent(uri: Uri): Promise<string | undefined> {
9+
const params = new URLSearchParams(uri.query);
10+
11+
const variantAnalysisIdString = params.get('variantAnalysisId');
12+
if (!variantAnalysisIdString) {
13+
void showAndLogWarningMessage('Unable to show query text. No variant analysis ID provided.');
14+
return undefined;
15+
}
16+
const variantAnalysisId = parseInt(variantAnalysisIdString);
17+
18+
const variantAnalysis = await variantAnalysisManager.getVariantAnalysis(variantAnalysisId);
19+
if (!variantAnalysis) {
20+
void showAndLogWarningMessage('Unable to show query text. No variant analysis found.');
21+
return undefined;
22+
}
23+
24+
return SHOW_QUERY_TEXT_MSG + variantAnalysis.query.text;
25+
}
26+
});

extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
183183
name: `Variant analysis ${variantAnalysisId}`,
184184
filePath: `variant_analysis_${variantAnalysisId}.ql`,
185185
language: variantAnalysisResponse.query_language as VariantAnalysisQueryLanguage,
186+
text: '',
186187
},
187188
databases: {},
188189
executionStartTime: 0,

extensions/ql-vscode/src/remote-queries/variant-analysis-processor.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ export function processVariantAnalysis(
2727
query: {
2828
name: submission.query.name,
2929
filePath: submission.query.filePath,
30-
language: submission.query.language
30+
language: submission.query.language,
31+
text: submission.query.text,
3132
},
3233
databases: submission.databases,
3334
executionStartTime: submission.startTime
@@ -52,11 +53,7 @@ export function processUpdatedVariantAnalysis(
5253
const variantAnalysis: VariantAnalysis = {
5354
id: response.id,
5455
controllerRepoId: response.controller_repo.id,
55-
query: {
56-
name: previousVariantAnalysis.query.name,
57-
filePath: previousVariantAnalysis.query.filePath,
58-
language: previousVariantAnalysis.query.language
59-
},
56+
query: previousVariantAnalysis.query,
6057
databases: previousVariantAnalysis.databases,
6158
executionStartTime: previousVariantAnalysis.executionStartTime,
6259
status: processApiStatus(response.status),

extensions/ql-vscode/src/remote-queries/variant-analysis-view.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { commands, ExtensionContext, ViewColumn, window as Window, workspace } from 'vscode';
1+
import { commands, ExtensionContext, Uri, ViewColumn, window as Window, workspace } from 'vscode';
2+
import { URLSearchParams } from 'url';
23
import { AbstractWebview, WebviewPanelConfig } from '../abstract-webview';
34
import { logger } from '../logging';
45
import { FromVariantAnalysisMessage, ToVariantAnalysisMessage } from '../pure/interface-types';
@@ -92,6 +93,9 @@ export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessag
9293
case 'openQueryFile':
9394
await this.openQueryFile();
9495
break;
96+
case 'openQueryText':
97+
await this.openQueryText();
98+
break;
9599
default:
96100
assertNever(msg);
97101
}
@@ -130,4 +134,29 @@ export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessag
130134
void showAndLogWarningMessage(`Could not open file: ${variantAnalysis.query.filePath}`);
131135
}
132136
}
137+
138+
private async openQueryText(): Promise<void> {
139+
const variantAnalysis = await this.manager.getVariantAnalysis(this.variantAnalysisId);
140+
if (!variantAnalysis) {
141+
void showAndLogWarningMessage('Could not open variant analysis query text. Variant analysis not found.');
142+
return;
143+
}
144+
145+
const filename = variantAnalysis.query.filePath;
146+
147+
try {
148+
const params = new URLSearchParams({
149+
variantAnalysisId: variantAnalysis.id.toString(),
150+
});
151+
const uri = Uri.from({
152+
scheme: 'codeql-variant-analysis',
153+
path: filename,
154+
query: params.toString(),
155+
});
156+
const doc = await workspace.openTextDocument(uri);
157+
await Window.showTextDocument(doc, { preview: false });
158+
} catch (error) {
159+
void showAndLogWarningMessage('Could not open variant analysis query text. Failed to open text document.');
160+
}
161+
}
133162
}

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ const openQueryFile = () => {
2424
});
2525
};
2626

27+
const openQueryText = () => {
28+
vscode.postMessage({
29+
t: 'openQueryText',
30+
});
31+
};
32+
2733
export function VariantAnalysis({
2834
variantAnalysis: initialVariantAnalysis,
2935
repoStates: initialRepoStates = [],
@@ -75,7 +81,7 @@ export function VariantAnalysis({
7581
<VariantAnalysisHeader
7682
variantAnalysis={variantAnalysis}
7783
onOpenQueryFileClick={openQueryFile}
78-
onViewQueryTextClick={() => console.log('View query')}
84+
onViewQueryTextClick={openQueryText}
7985
onStopQueryClick={() => console.log('Stop query')}
8086
onCopyRepositoryListClick={() => console.log('Copy repository list')}
8187
onExportResultsClick={() => console.log('Export results')}

extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisAnalyzedRepos.spec.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ describe(VariantAnalysisAnalyzedRepos.name, () => {
1717
name: 'Example query',
1818
filePath: 'example.ql',
1919
language: VariantAnalysisQueryLanguage.Javascript,
20+
text: 'import javascript\nselect 1',
2021
},
2122
databases: {},
2223
executionStartTime: 1611234567890,

0 commit comments

Comments
 (0)