@@ -85,11 +85,9 @@ class NoBinariesError extends Error {
85
85
const supportedReleasesLink =
86
86
'[See the list of supported versions here](https://github.com/haskell/vscode-haskell#supported-ghc-versions)' ;
87
87
if ( ghcVersion ) {
88
- super ( `haskell-language-server ${ hlsVersion } or earlier for GHC ${ ghcVersion } is not available on ${ os . type ( ) } .
89
- ${ supportedReleasesLink } ` ) ;
88
+ super ( `haskell-language-server ${ hlsVersion } or earlier for GHC ${ ghcVersion } is not available on ${ os . type ( ) } . ${ supportedReleasesLink } ` ) ;
90
89
} else {
91
- super ( `haskell-language-server ${ hlsVersion } is not available on ${ os . type ( ) } .
92
- ${ supportedReleasesLink } ` ) ;
90
+ super ( `haskell-language-server ${ hlsVersion } is not available on ${ os . type ( ) } . ${ supportedReleasesLink } ` ) ;
93
91
}
94
92
}
95
93
}
@@ -246,11 +244,13 @@ async function getReleaseMetadata(
246
244
247
245
async function readCachedReleaseData ( ) : Promise < IRelease [ ] | null > {
248
246
try {
247
+ logger . info ( `Reading cached release data at ${ offlineCache } ` ) ;
249
248
const cachedInfo = await promisify ( fs . readFile ) ( offlineCache , { encoding : 'utf-8' } ) ;
250
249
return validate . parseAndValidate ( cachedInfo , cachedReleaseValidator ) ;
251
250
} catch ( err : any ) {
252
251
// If file doesn't exist, return null, otherwise consider it a failure
253
252
if ( err . code === 'ENOENT' ) {
253
+ logger . warn ( `No cached release data found at ${ offlineCache } ` ) ;
254
254
return null ;
255
255
}
256
256
throw err ;
@@ -260,6 +260,8 @@ async function getReleaseMetadata(
260
260
const updateBehaviour = workspace . getConfiguration ( 'haskell' ) . get ( 'updateBehavior' ) as UpdateBehaviour ;
261
261
262
262
if ( updateBehaviour === 'never-check' ) {
263
+ logger . warn ( "As 'haskell.updateBehaviour' config option is set to 'never-check' " +
264
+ 'we try to use the possibly obsolete cached release data' ) ;
263
265
return readCachedReleaseData ( ) ;
264
266
}
265
267
@@ -298,11 +300,13 @@ async function getReleaseMetadata(
298
300
const cachedInfoParsed = await readCachedReleaseData ( ) ;
299
301
300
302
window . showWarningMessage (
301
- `Couldn't get the latest haskell-language-server releases from GitHub, used local cache instead:\n${ githubError . message } `
303
+ "Couldn't get the latest haskell-language-server releases from GitHub, used local cache instead: " +
304
+ githubError . message
302
305
) ;
303
306
return cachedInfoParsed ;
304
307
} catch ( fileError ) {
305
- throw new Error ( `Couldn't get the latest haskell-language-server releases from GitHub:\n${ githubError . message } ` ) ;
308
+ throw new Error ( "Couldn't get the latest haskell-language-server releases from GitHub: " +
309
+ githubError . message ) ;
306
310
}
307
311
}
308
312
}
@@ -341,16 +345,16 @@ export async function downloadHaskellLanguageServer(
341
345
342
346
logger . info ( 'Fetching the latest release from GitHub or from cache' ) ;
343
347
const releases = await getReleaseMetadata ( context , storagePath , logger ) ;
348
+ const updateBehaviour = workspace . getConfiguration ( 'haskell' ) . get ( 'updateBehavior' ) as UpdateBehaviour ;
344
349
if ( ! releases ) {
345
350
let message = "Couldn't find any pre-built haskell-language-server binaries" ;
346
- const updateBehaviour = workspace . getConfiguration ( 'haskell' ) . get ( 'updateBehavior' ) as UpdateBehaviour ;
347
351
if ( updateBehaviour === 'never-check' ) {
348
352
message += ' (and checking for newer versions is disabled)' ;
349
353
}
350
354
window . showErrorMessage ( message ) ;
351
355
return null ;
352
356
}
353
- logger . info ( `The latest release is ${ releases [ 0 ] . tag_name } ` ) ;
357
+ logger . info ( `The latest known release is ${ releases [ 0 ] . tag_name } ` ) ;
354
358
logger . info ( 'Figure out the ghc version to use or advertise an installation link for missing components' ) ;
355
359
const dir : string = folder ?. uri ?. fsPath ?? path . dirname ( resource . fsPath ) ;
356
360
let ghcVersion : string ;
@@ -370,7 +374,7 @@ export async function downloadHaskellLanguageServer(
370
374
window . showInformationMessage ( error . message ) ;
371
375
} else if ( error instanceof Error ) {
372
376
// We couldn't figure out the right ghc version to download
373
- window . showErrorMessage ( `Couldn't figure out what GHC version the project is using:\n ${ error . message } ` ) ;
377
+ window . showErrorMessage ( `Couldn't figure out what GHC version the project is using: ${ error . message } ` ) ;
374
378
}
375
379
return null ;
376
380
}
@@ -382,31 +386,38 @@ export async function downloadHaskellLanguageServer(
382
386
const release = releases ?. find ( r => r . assets . find ( ( x ) => x . name . startsWith ( assetName ) ) ) ;
383
387
const asset = release ?. assets . find ( ( x ) => x . name . startsWith ( assetName ) ) ;
384
388
if ( ! asset ) {
385
- logger . error (
386
- `No binary ${ assetName } found in the release assets`
387
- ) ;
388
- window . showInformationMessage ( new NoBinariesError ( releases [ 0 ] . tag_name , ghcVersion ) . message ) ;
389
+ let msg = new NoBinariesError ( releases [ 0 ] . tag_name , ghcVersion ) . message ;
390
+ if ( updateBehaviour === 'never-check' ) {
391
+ msg += ". Consider set 'haskell.updateBehaviour' to 'up-to-date' to check if another release includes the missing binary" ;
392
+ }
393
+ logger . error ( msg ) ;
394
+ window . showErrorMessage ( msg ) ;
389
395
return null ;
390
396
}
391
397
392
398
const serverName = `haskell-language-server-${ release ?. tag_name } -${ process . platform } -${ ghcVersion } ${ exeExt } ` ;
393
399
const binaryDest = path . join ( storagePath , serverName ) ;
394
400
401
+ logger . info ( `Looking for an existing ${ binaryDest } or download it from release assets` ) ;
395
402
const title = `Downloading haskell-language-server ${ release ?. tag_name } for GHC ${ ghcVersion } ` ;
396
- logger . info ( title ) ;
403
+
397
404
const downloaded = await downloadFile ( title , asset . browser_download_url , binaryDest ) ;
398
405
if ( ghcVersion . startsWith ( '9.' ) ) {
399
406
const warning =
400
407
'Currently, HLS supports GHC 9 only partially. ' +
401
- 'See [issue #297](https://github.com/haskell/haskell-language-server/issues/297) for more detail .' ;
408
+ 'See [issue #297](https://github.com/haskell/haskell-language-server/issues/297) for more details .' ;
402
409
logger . warn ( warning ) ;
403
- window . showWarningMessage ( warning ) ;
410
+ if ( downloaded ) {
411
+ window . showWarningMessage ( warning ) ;
412
+ }
404
413
}
405
414
if ( release ?. tag_name !== releases [ 0 ] . tag_name ) {
406
- const warning = `haskell-language-server ${ releases [ 0 ] . tag_name } for GHC ${ ghcVersion } is not available on ${ os . type ( ) } . Falling back to haskell-language-server ${ release ?. tag_name } ` ;
415
+ const warning =
416
+ `haskell-language-server ${ releases [ 0 ] . tag_name } for GHC ${ ghcVersion } is not available on ${ os . type ( ) } . ` +
417
+ `Falling back to haskell-language-server ${ release ?. tag_name } ` ;
407
418
logger . warn ( warning ) ;
408
419
if ( downloaded ) {
409
- window . showInformationMessage ( warning ) ;
420
+ window . showWarningMessage ( warning ) ;
410
421
}
411
422
}
412
423
return binaryDest ;
0 commit comments