@@ -4,6 +4,8 @@ import * as path from 'path';
44import * as tmp from 'tmp' ;
55import { promisify } from 'util' ;
66import * as vscode from 'vscode' ;
7+ import { ErrorCodes , ResponseError } from 'vscode-languageclient' ;
8+
79import * as cli from './cli' ;
810import { DatabaseItem , getUpgradesDirectories } from './databases' ;
911import * 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+ }
0 commit comments