@@ -307,6 +307,37 @@ export async function findHaskellLanguageServer(
307
307
: null ;
308
308
}
309
309
310
+ const dontAskOnDownload = context . globalState . get ( "dontAskOnDownload" ) as boolean | null ;
311
+ if ( ! dontAskOnDownload ) {
312
+ const hlsInstalled = await toolInstalled ( context , logger , 'hls' , latestHLS ) ;
313
+ const cabalInstalled = await toolInstalled ( context , logger , 'cabal' , latestCabal ) ;
314
+ const stackInstalled = await toolInstalled ( context , logger , 'stack' , latestStack ) ;
315
+ const ghcInstalled = await executableExists ( 'ghc' ) ? [ true , 'ghc' , '' ] as [ boolean , string , string ] : await toolInstalled ( context , logger , 'ghc' , recGHC ! ) ;
316
+ const toInstall = [ hlsInstalled , cabalInstalled , stackInstalled , ghcInstalled ] . filter ( ( [ b , t , v ] ) => ! b ) . map ( ( [ _ , t , v ] ) => `${ t } -${ v } ` ) ;
317
+ logger . info ( `toInstall length: ${ toInstall . length } ` )
318
+ logger . info ( `toInstall: ${ toInstall } ` )
319
+ if ( toInstall . length > 0 ) {
320
+ const decision = await window . showInformationMessage ( `Need to download ${ toInstall . join ( ', ' ) } , continue?` , 'Yes' , 'No' , 'Yes, don\'t ask again' ) ;
321
+ if ( decision === 'Yes' ) {
322
+ } else if ( decision === 'Yes, don\'t ask again' ) {
323
+ context . globalState . update ( "dontAskOnDownload" , true ) ;
324
+ } else {
325
+ [ hlsInstalled , cabalInstalled , stackInstalled , ghcInstalled ] . forEach ( ( [ b , t ] ) => {
326
+ if ( ! b ) {
327
+ if ( t === 'hls' ) {
328
+ throw new MissingToolError ( 'hls' ) ;
329
+ } else if ( t === 'cabal' ) {
330
+ latestCabal = null ;
331
+ } else if ( t === 'stack' ) {
332
+ latestStack = null ;
333
+ } else if ( t === 'ghc' ) {
334
+ recGHC = null ;
335
+ }
336
+ }
337
+ } ) ;
338
+ }
339
+ }
340
+ }
310
341
const latestToolchainBindir = await callGHCup (
311
342
context ,
312
343
logger ,
@@ -338,6 +369,31 @@ export async function findHaskellLanguageServer(
338
369
}
339
370
}
340
371
372
+ if ( ! dontAskOnDownload ) {
373
+ const hlsInstalled = await toolInstalled ( context , logger , 'hls' , projectHls ) ;
374
+ const ghcInstalled = await toolInstalled ( context , logger , 'ghc' , projectGhc ) ;
375
+ const toInstall = [ hlsInstalled , ghcInstalled ] . filter ( ( [ b , t , v ] ) => ! b ) . map ( ( [ _ , t , v ] ) => `${ t } -${ v } ` ) ;
376
+ logger . info ( `toInstall length: ${ toInstall . length } ` )
377
+ logger . info ( `toInstall: ${ toInstall } ` )
378
+ if ( toInstall . length > 0 ) {
379
+ const decision = await window . showInformationMessage ( `Need to download ${ toInstall . join ( ', ' ) } , continue?` , 'Yes' , 'No' , 'Yes, don\'t ask again' ) ;
380
+ if ( decision === 'Yes' ) {
381
+ } else if ( decision === 'Yes, don\'t ask again' ) {
382
+ context . globalState . update ( "dontAskOnDownload" , true ) ;
383
+ } else {
384
+ [ hlsInstalled , ghcInstalled ] . forEach ( ( [ b , t ] ) => {
385
+ if ( ! b ) {
386
+ if ( t === 'hls' ) {
387
+ throw new MissingToolError ( 'hls' ) ;
388
+ } else if ( t === 'ghc' ) {
389
+ projectGhc = null ;
390
+ }
391
+ }
392
+ } ) ;
393
+ }
394
+ }
395
+ }
396
+
341
397
// now install said version in an isolated symlink directory
342
398
const hlsBinDir = await callGHCup (
343
399
context ,
@@ -666,6 +722,11 @@ async function getHLSesFromGHCup(context: ExtensionContext, logger: Logger): Pro
666
722
}
667
723
}
668
724
725
+ async function toolInstalled ( context : ExtensionContext , logger : Logger , tool : string , version : string ) : Promise < [ boolean , string , string ] > {
726
+ const b = await callGHCup ( context , logger , [ 'whereis' , tool , version ] , undefined , false ) . then ( x => true ) . catch ( x => false ) ;
727
+ return [ b , tool , version ] ;
728
+ }
729
+
669
730
/**
670
731
* Given a GHC version, download at least one HLS version that can be used.
671
732
* This also honours the OS architecture we are on.
0 commit comments