Skip to content

Commit 059a75c

Browse files
authored
Merge pull request #266 from aeisenberg/timeout
Display timeout warning and display canceled queries
2 parents dfab590 + c2e0f25 commit 059a75c

File tree

8 files changed

+64
-36
lines changed

8 files changed

+64
-36
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { commands, Disposable, ExtensionContext, extensions, ProgressLocation, ProgressOptions, window as Window, Uri } from 'vscode';
2-
import { ErrorCodes, LanguageClient, ResponseError } from 'vscode-languageclient';
2+
import { LanguageClient } from 'vscode-languageclient';
33
import * as archiveFilesystemProvider from './archive-filesystem-provider';
44
import { DistributionConfigListener, QueryServerConfigListener, QueryHistoryConfigListener } from './config';
55
import { DatabaseManager } from './databases';
@@ -278,18 +278,14 @@ async function activateWithInstalledDistribution(ctx: ExtensionContext, distribu
278278
const info = await compileAndRunQueryAgainstDatabase(cliServer, qs, dbItem, quickEval, selectedQuery);
279279
const item = qhm.addQuery(info);
280280
await showResultsForCompletedQuery(item, WebviewReveal.NotForced);
281-
}
282-
catch (e) {
281+
} catch (e) {
283282
if (e instanceof UserCancellationException) {
284-
logger.log(e.message);
285-
}
286-
else if (e instanceof ResponseError && e.code == ErrorCodes.RequestCancelled) {
287-
logger.log(e.message);
288-
}
289-
else if (e instanceof Error)
283+
helpers.showAndLogWarningMessage(e.message);
284+
} else if (e instanceof Error) {
290285
helpers.showAndLogErrorMessage(e.message);
291-
else
286+
} else {
292287
throw e;
288+
}
293289
}
294290
}
295291
}

extensions/ql-vscode/src/query-results.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export class CompletedQuery implements QueryWithResults {
6868
return `timed out after ${this.result.evaluationTime / 1000} seconds`;
6969
case messages.QueryResultType.OTHER_ERROR:
7070
default:
71-
return `failed`;
71+
return this.result.message ? `failed: ${this.result.message}` : 'failed';
7272
}
7373
}
7474

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

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import * as path from 'path';
44
import * as tmp from 'tmp';
55
import { promisify } from 'util';
66
import * as vscode from 'vscode';
7+
import { ErrorCodes, ResponseError } from 'vscode-languageclient';
8+
79
import * as cli from './cli';
810
import { DatabaseItem, getUpgradesDirectories } from './databases';
911
import * as helpers from './helpers';
@@ -103,13 +105,19 @@ export class QueryInfo {
103105
} finally {
104106
qs.unRegisterCallback(callbackId);
105107
}
106-
return result || { evaluationTime: 0, message: "No result from server", queryId: -1, runId: callbackId, resultType: messages.QueryResultType.OTHER_ERROR };
108+
return result || {
109+
evaluationTime: 0,
110+
message: "No result from server",
111+
queryId: -1,
112+
runId: callbackId,
113+
resultType: messages.QueryResultType.OTHER_ERROR
114+
};
107115
}
108116

109117
async compile(
110118
qs: qsClient.QueryServerClient,
111119
): Promise<messages.CompilationMessage[]> {
112-
let compiled: messages.CheckQueryResult;
120+
let compiled: messages.CheckQueryResult | undefined;
113121
try {
114122
const params: messages.CompileQueryParams = {
115123
compilationOptions: {
@@ -140,8 +148,7 @@ export class QueryInfo {
140148
} finally {
141149
qs.logger.log(" - - - COMPILATION DONE - - - ");
142150
}
143-
144-
return (compiled.messages || []).filter(msg => msg.severity == 0);
151+
return (compiled?.messages || []).filter(msg => msg.severity === messages.Severity.ERROR);
145152
}
146153

147154
/**
@@ -411,10 +418,24 @@ export async function compileAndRunQueryAgainstDatabase(
411418
const query = new QueryInfo(qlProgram, db, packConfig.dbscheme, quickEvalPosition, metadata);
412419
await checkDbschemeCompatibility(cliServer, qs, query);
413420

414-
const errors = await query.compile(qs);
421+
let errors;
422+
try {
423+
errors = await query.compile(qs);
424+
} catch (e) {
425+
if (e instanceof ResponseError && e.code == ErrorCodes.RequestCancelled) {
426+
return createSyntheticResult(query, db, historyItemOptions, 'Query cancelled', messages.QueryResultType.CANCELLATION);
427+
} else {
428+
throw e;
429+
}
430+
}
415431

416432
if (errors.length == 0) {
417433
const result = await query.run(qs);
434+
if (result.resultType !== messages.QueryResultType.SUCCESS) {
435+
const message = result.message || 'Failed to run query';
436+
logger.log(message);
437+
helpers.showAndLogErrorMessage(message);
438+
}
418439
return {
419440
query,
420441
result,
@@ -448,20 +469,31 @@ export async function compileAndRunQueryAgainstDatabase(
448469
" and choose CodeQL Query Server from the dropdown.");
449470
}
450471

451-
return {
452-
query,
453-
result: {
454-
evaluationTime: 0,
455-
resultType: messages.QueryResultType.OTHER_ERROR,
456-
queryId: -1,
457-
runId: -1,
458-
message: "Query had compilation errors"
459-
},
460-
database: {
461-
name: db.name,
462-
databaseUri: db.databaseUri.toString(true)
463-
},
464-
options: historyItemOptions,
465-
};
472+
return createSyntheticResult(query, db, historyItemOptions, 'Query had compilation errors', messages.QueryResultType.OTHER_ERROR);
466473
}
467474
}
475+
476+
function createSyntheticResult(
477+
query: QueryInfo,
478+
db: DatabaseItem,
479+
historyItemOptions: QueryHistoryItemOptions,
480+
message: string,
481+
resultType: number
482+
) {
483+
484+
return {
485+
query,
486+
result: {
487+
evaluationTime: 0,
488+
resultType: resultType,
489+
queryId: -1,
490+
runId: -1,
491+
message
492+
},
493+
database: {
494+
name: db.name,
495+
databaseUri: db.databaseUri.toString(true)
496+
},
497+
options: historyItemOptions,
498+
};
499+
}

extensions/ql-vscode/src/vscode-tests/index-template.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,4 @@ export function runTestsInDirectory(testsRoot: string): Promise<void> {
5858
}
5959
});
6060
});
61-
}
61+
}

extensions/ql-vscode/src/vscode-tests/minimal-workspace/activation.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ describe('launching with a minimal workspace', async () => {
2323
assert(ext!.isActive);
2424
}, 1000);
2525
});
26-
});
26+
});
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import { runTestsInDirectory } from '../index-template';
22
export function run(): Promise<void> {
33
return runTestsInDirectory(__dirname);
4-
}
4+
}

extensions/ql-vscode/src/vscode-tests/no-workspace/activation.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ describe('launching with no specified workspace', () => {
1010
it('should not activate the extension at first', () => {
1111
assert(ext!.isActive === false);
1212
});
13-
});
13+
});
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import { runTestsInDirectory } from '../index-template';
22
export function run(): Promise<void> {
33
return runTestsInDirectory(__dirname);
4-
}
4+
}

0 commit comments

Comments
 (0)