@@ -277,36 +277,34 @@ export async function findHaskellLanguageServer(
277
277
if ( promptBeforeDownloads ) {
278
278
const hlsInstalled = latestHLS
279
279
? await toolInstalled ( context , logger , 'hls' , latestHLS )
280
- : new InstalledTool ( 'hls' ) ;
280
+ : undefined ;
281
281
const cabalInstalled = latestCabal
282
282
? await toolInstalled ( context , logger , 'cabal' , latestCabal )
283
- : new InstalledTool ( 'cabal' ) ;
283
+ : undefined ;
284
284
const stackInstalled = latestStack
285
285
? await toolInstalled ( context , logger , 'stack' , latestStack )
286
- : new InstalledTool ( 'stack' ) ;
287
- const ghcInstalled = ( await executableExists ( 'ghc' ) )
288
- ? new InstalledTool ( 'ghc' )
289
- // if recGHC is null, that means user disabled automatic handling,
290
- // so we pretend it's installed in order to ignore it
291
- : ( recGHC !== null ? await toolInstalled ( context , logger , 'ghc' , recGHC ) : new InstalledTool ( 'ghc' ) ) ;
292
- const toInstall = [ hlsInstalled , cabalInstalled , stackInstalled , ghcInstalled ]
293
- . filter ( ( tool ) => ! tool . installed )
294
- . map ( ( tool ) => tool . nameWithVersion ) ;
286
+ : undefined ;
287
+ const ghcInstalled = executableExists ( 'ghc' )
288
+ ? new InstalledTool ( 'ghc' , await callAsync ( `ghc${ exeExt } ` , [ '--numeric-version' ] , logger , undefined , undefined , false ) )
289
+ // if recGHC is null, that means user disabled automatic handling,
290
+ : ( recGHC !== null ? await toolInstalled ( context , logger , 'ghc' , recGHC ) : undefined ) ;
291
+ const toInstall : InstalledTool [ ] = [ hlsInstalled , cabalInstalled , stackInstalled , ghcInstalled ]
292
+ . filter ( ( tool ) => tool && ! tool . installed ) as InstalledTool [ ] ;
295
293
if ( toInstall . length > 0 ) {
296
294
const decision = await window . showInformationMessage (
297
- `Need to download ${ toInstall . join ( ', ' ) } , continue?` ,
295
+ `Need to download ${ toInstall . map ( t => t . nameWithVersion ) . join ( ', ' ) } , continue?` ,
298
296
'Yes' ,
299
297
'No' ,
300
298
"Yes, don't ask again"
301
299
) ;
302
300
if ( decision === 'Yes' ) {
303
- logger . info ( `User accepted download for ${ toInstall . join ( ', ' ) } .` ) ;
301
+ logger . info ( `User accepted download for ${ toInstall . map ( t => t . nameWithVersion ) . join ( ', ' ) } .` ) ;
304
302
} else if ( decision === "Yes, don't ask again" ) {
305
- logger . info ( `User accepted download for ${ toInstall . join ( ', ' ) } and won't be asked again.` ) ;
303
+ logger . info ( `User accepted download for ${ toInstall . map ( t => t . nameWithVersion ) . join ( ', ' ) } and won't be asked again.` ) ;
306
304
workspace . getConfiguration ( 'haskell' ) . update ( 'promptBeforeDownloads' , false ) ;
307
305
} else {
308
- [ hlsInstalled , cabalInstalled , stackInstalled , ghcInstalled ] . forEach ( ( tool ) => {
309
- if ( ! tool . installed ) {
306
+ toInstall . forEach ( ( tool ) => {
307
+ if ( tool !== undefined && ! tool . installed ) {
310
308
if ( tool . name === 'hls' ) {
311
309
throw new MissingToolError ( 'hls' ) ;
312
310
} else if ( tool . name === 'cabal' ) {
@@ -357,28 +355,27 @@ export async function findHaskellLanguageServer(
357
355
if ( promptBeforeDownloads ) {
358
356
const hlsInstalled = projectHls
359
357
? await toolInstalled ( context , logger , 'hls' , projectHls )
360
- : new InstalledTool ( 'hls' ) ;
358
+ : undefined ;
361
359
const ghcInstalled = projectGhc
362
360
? await toolInstalled ( context , logger , 'ghc' , projectGhc )
363
- : new InstalledTool ( 'ghc' ) ;
364
- const toInstall = [ hlsInstalled , ghcInstalled ]
365
- . filter ( ( tool ) => ! tool . installed )
366
- . map ( ( tool ) => tool . nameWithVersion ) ;
361
+ : undefined ;
362
+ const toInstall : InstalledTool [ ] = [ hlsInstalled , ghcInstalled ]
363
+ . filter ( ( tool ) => tool && ! tool . installed ) as InstalledTool [ ] ;
367
364
if ( toInstall . length > 0 ) {
368
365
const decision = await window . showInformationMessage (
369
- `Need to download ${ toInstall . join ( ', ' ) } , continue?` ,
366
+ `Need to download ${ toInstall . map ( t => t . nameWithVersion ) . join ( ', ' ) } , continue?` ,
370
367
{ modal : true } ,
371
368
'Yes' ,
372
369
'No' ,
373
370
"Yes, don't ask again"
374
371
) ;
375
372
if ( decision === 'Yes' ) {
376
- logger . info ( `User accepted download for ${ toInstall . join ( ', ' ) } .` ) ;
373
+ logger . info ( `User accepted download for ${ toInstall . map ( t => t . nameWithVersion ) . join ( ', ' ) } .` ) ;
377
374
} else if ( decision === "Yes, don't ask again" ) {
378
- logger . info ( `User accepted download for ${ toInstall . join ( ', ' ) } and won't be asked again.` ) ;
375
+ logger . info ( `User accepted download for ${ toInstall . map ( t => t . nameWithVersion ) . join ( ', ' ) } and won't be asked again.` ) ;
379
376
workspace . getConfiguration ( 'haskell' ) . update ( 'promptBeforeDownloads' , false ) ;
380
377
} else {
381
- [ hlsInstalled , ghcInstalled ] . forEach ( ( tool ) => {
378
+ toInstall . forEach ( ( tool ) => {
382
379
if ( ! tool . installed ) {
383
380
if ( tool . name === 'hls' ) {
384
381
throw new MissingToolError ( 'hls' ) ;
@@ -403,7 +400,7 @@ export async function findHaskellLanguageServer(
403
400
...( projectGhc ? [ '--ghc' , projectGhc ] : [ ] ) ,
404
401
'--install' ,
405
402
] ,
406
- `Installing project specific toolchain: HLS- ${ projectHls } , GHC- ${ projectGhc } , cabal- ${ latestCabal } , stack-${ latestStack } ` ,
403
+ `Installing project specific toolchain: ${ [ [ 'hls' , projectHls ] , [ ' GHC' , projectGhc ] , [ ' cabal' , latestCabal ] , [ ' stack' , latestStack ] ] . filter ( t => t [ 1 ] ) . map ( t => ` ${ t [ 0 ] } -${ t [ 1 ] } ` ) . join ( ', ' ) } ` ,
407
404
true
408
405
) ;
409
406
0 commit comments