11import * as child_process from 'child_process' ;
22import * as fs from 'fs' ;
33import * as https from 'https' ;
4+ import * as os from 'os' ;
45import * as path from 'path' ;
56import { env , ExtensionContext , ProgressLocation , Uri , window , WorkspaceFolder } from 'vscode' ;
67import { downloadFile , executableExists , userAgentHeader } from './utils' ;
@@ -18,7 +19,7 @@ interface IAsset {
1819}
1920
2021// On Windows the executable needs to be stored somewhere with an .exe extension
21- const exeExtension = process . platform === 'win32' ? '.exe' : '' ;
22+ const exeExt = process . platform === 'win32' ? '.exe' : '' ;
2223
2324class MissingToolError extends Error {
2425 public readonly tool : string ;
@@ -57,6 +58,17 @@ class MissingToolError extends Error {
5758 }
5859}
5960
61+ // tslint:disable-next-line: max-classes-per-file
62+ class NoBinariesError extends Error {
63+ constructor ( hlsVersion : string , ghcVersion ?: string ) {
64+ if ( ghcVersion ) {
65+ super ( `haskell-language-server ${ hlsVersion } for GHC ${ ghcVersion } is not available on ${ os . type ( ) } ` ) ;
66+ } else {
67+ super ( `haskell-language-server ${ hlsVersion } is not available on ${ os . type ( ) } ` ) ;
68+ }
69+ }
70+ }
71+
6072/** Works out what the project's ghc version is, downloading haskell-language-server-wrapper
6173 * if needed. Returns null if there was an error in either downloading the wrapper or
6274 * in working out the ghc version
@@ -97,7 +109,7 @@ async function getProjectGhcVersion(context: ExtensionContext, dir: string, rele
97109
98110 // Otherwise search to see if we previously downloaded the wrapper
99111
100- const wrapperName = `haskell-language-server-wrapper-${ release . tag_name } -${ process . platform } ${ exeExtension } ` ;
112+ const wrapperName = `haskell-language-server-wrapper-${ release . tag_name } -${ process . platform } ${ exeExt } ` ;
101113 const downloadedWrapper = path . join ( context . globalStoragePath , wrapperName ) ;
102114
103115 if ( executableExists ( downloadedWrapper ) ) {
@@ -109,14 +121,14 @@ async function getProjectGhcVersion(context: ExtensionContext, dir: string, rele
109121 const githubOS = getGithubOS ( ) ;
110122 if ( githubOS === null ) {
111123 // Don't have any binaries available for this platform
112- throw Error ( `Couldn't find any haskell-language-server-wrapper binaries for ${ process . platform } ` ) ;
124+ throw new NoBinariesError ( release . tag_name ) ;
113125 }
114126
115- const assetName = `haskell-language-server-wrapper-${ githubOS } ${ exeExtension } .gz ` ;
116- const wrapperAsset = release . assets . find ( ( x ) => x . name === assetName ) ;
127+ const assetName = `haskell-language-server-wrapper-${ githubOS } ${ exeExt } ` ;
128+ const wrapperAsset = release . assets . find ( ( x ) => x . name . startsWith ( assetName ) ) ;
117129
118130 if ( ! wrapperAsset ) {
119- throw Error ( `Couldn't find any ${ assetName } binaries for release ${ release . tag_name } ` ) ;
131+ throw new NoBinariesError ( release . tag_name ) ;
120132 }
121133
122134 await downloadFile (
@@ -186,23 +198,25 @@ export async function downloadHaskellLanguageServer(
186198 } else {
187199 await window . showErrorMessage ( error . message ) ;
188200 }
201+ } else if ( error instanceof NoBinariesError ) {
202+ window . showInformationMessage ( error . message ) ;
189203 } else {
190204 // We couldn't figure out the right ghc version to download
191205 window . showErrorMessage ( `Couldn't figure out what GHC version the project is using:\n${ error . message } ` ) ;
192206 }
193207 return null ;
194208 }
195209
196- const assetName = `haskell-language-server-${ githubOS } -${ ghcVersion } ${ exeExtension } .gz` ;
197- const asset = release ?. assets . find ( ( x ) => x . name === assetName ) ;
210+ // When searching for binaries, use startsWith because the compression may differ
211+ // between .zip and .gz
212+ const assetName = `haskell-language-server-${ githubOS } -${ ghcVersion } ${ exeExt } ` ;
213+ const asset = release ?. assets . find ( ( x ) => x . name . startsWith ( assetName ) ) ;
198214 if ( ! asset ) {
199- window . showErrorMessage (
200- `Couldn't find any pre-built haskell-language-server binaries for ${ githubOS } and ${ ghcVersion } `
201- ) ;
215+ window . showInformationMessage ( new NoBinariesError ( release . tag_name , ghcVersion ) . message ) ;
202216 return null ;
203217 }
204218
205- const serverName = `haskell-language-server-${ release . tag_name } -${ process . platform } -${ ghcVersion } ${ exeExtension } ` ;
219+ const serverName = `haskell-language-server-${ release . tag_name } -${ process . platform } -${ ghcVersion } ${ exeExt } ` ;
206220 const binaryDest = path . join ( context . globalStoragePath , serverName ) ;
207221
208222 const title = `Downloading haskell-language-server ${ release . tag_name } for GHC ${ ghcVersion } ` ;
0 commit comments