From 3754f41a3521cc4ad61275c3ffb57111504c28c0 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Mon, 14 Feb 2022 15:06:15 +0100 Subject: [PATCH 1/3] Improve wrapper cradle errors --- exe/Wrapper.hs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/exe/Wrapper.hs b/exe/Wrapper.hs index f98760e89e..09c649c53f 100644 --- a/exe/Wrapper.hs +++ b/exe/Wrapper.hs @@ -1,5 +1,6 @@ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE CPP #-} -- | This module is based on the hie-wrapper.sh script in -- https://github.com/alanz/vscode-hie-server @@ -114,8 +115,18 @@ launchHaskellLanguageServer parsedArgs = do callProcess e args #else let Cradle { cradleOptsProg = CradleAction { runGhcCmd } } = cradle - (CradleSuccess ghcBinary) <- fmap trim <$> runGhcCmd ["-v0", "-package-env=-", "-e", "putStr =<< System.Environment.getExecutablePath"] - (CradleSuccess libdir) <- HieBios.getRuntimeGhcLibDir cradle + ghcBinary <- (fmap trim <$> runGhcCmd ["-v0", "-package-env=-", "-e", "putStr =<< System.Environment.getExecutablePath"]) + >>= \case + CradleSuccess ghc -> do + return ghc + CradleFail error -> die $ "Failed to get project GHC executable path:" ++ show error + CradleNone -> die "Failed get project GHC executable path, since we have a none cradle" + libdir <- HieBios.getRuntimeGhcLibDir cradle + >>= \case + CradleSuccess lib -> do + return lib + CradleFail error -> die $ "Failed to get project GHC libdir path:" ++ show error + CradleNone -> die "Failed get project GHC libdir path, since we have a none cradle" env <- Map.fromList <$> getEnvironment let newEnv = Map.insert "GHC_BIN" ghcBinary $ Map.insert "GHC_LIBDIR" libdir env executeFile e True args (Just (Map.toList newEnv)) From 1265474f92dea053cae2a9d67fadde04d7c336d4 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Mon, 14 Feb 2022 15:30:04 +0100 Subject: [PATCH 2/3] Refactor cradle result unpacking --- exe/Wrapper.hs | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/exe/Wrapper.hs b/exe/Wrapper.hs index 09c649c53f..2951237444 100644 --- a/exe/Wrapper.hs +++ b/exe/Wrapper.hs @@ -1,6 +1,5 @@ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE NamedFieldPuns #-} -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE CPP #-} -- | This module is based on the hie-wrapper.sh script in -- https://github.com/alanz/vscode-hie-server @@ -116,22 +115,20 @@ launchHaskellLanguageServer parsedArgs = do #else let Cradle { cradleOptsProg = CradleAction { runGhcCmd } } = cradle ghcBinary <- (fmap trim <$> runGhcCmd ["-v0", "-package-env=-", "-e", "putStr =<< System.Environment.getExecutablePath"]) - >>= \case - CradleSuccess ghc -> do - return ghc - CradleFail error -> die $ "Failed to get project GHC executable path:" ++ show error - CradleNone -> die "Failed get project GHC executable path, since we have a none cradle" + >>= cradleResult "Failed to get project GHC executable path" libdir <- HieBios.getRuntimeGhcLibDir cradle - >>= \case - CradleSuccess lib -> do - return lib - CradleFail error -> die $ "Failed to get project GHC libdir path:" ++ show error - CradleNone -> die "Failed get project GHC libdir path, since we have a none cradle" + >>= cradleResult "Failed to get project GHC libdir path" env <- Map.fromList <$> getEnvironment let newEnv = Map.insert "GHC_BIN" ghcBinary $ Map.insert "GHC_LIBDIR" libdir env executeFile e True args (Just (Map.toList newEnv)) #endif + +cradleResult :: String -> CradleLoadResult a -> IO a +cradleResult _ (CradleSuccess a) = pure a +cradleResult str (CradleFail e) = die $ str ++ ": " ++ show e +cradleResult str CradleNone = die $ str ++ ": no cradle" + -- | Version of 'getRuntimeGhcVersion' that dies if we can't get it, and also -- checks to see if the tool is missing if it is one of getRuntimeGhcVersion' :: Show a => Cradle a -> IO String @@ -145,12 +142,7 @@ getRuntimeGhcVersion' cradle = do Direct -> checkToolExists "ghc" _ -> pure () - ghcVersionRes <- HieBios.getRuntimeGhcVersion cradle - case ghcVersionRes of - CradleSuccess ver -> do - return ver - CradleFail error -> die $ "Failed to get project GHC version:" ++ show error - CradleNone -> die "Failed get project GHC version, since we have a none cradle" + HieBios.getRuntimeGhcVersion cradle >>= cradleResult "Failed to get project GHC version" where checkToolExists exe = do exists <- findExecutable exe From 9bb90877c29f32dec5863a885c638fcd05957886 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Mon, 14 Feb 2022 15:30:22 +0100 Subject: [PATCH 3/3] Fix runGhcCmd when NoImplicitPrelude is on --- exe/Wrapper.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exe/Wrapper.hs b/exe/Wrapper.hs index 2951237444..ffc8db4389 100644 --- a/exe/Wrapper.hs +++ b/exe/Wrapper.hs @@ -114,7 +114,8 @@ launchHaskellLanguageServer parsedArgs = do callProcess e args #else let Cradle { cradleOptsProg = CradleAction { runGhcCmd } } = cradle - ghcBinary <- (fmap trim <$> runGhcCmd ["-v0", "-package-env=-", "-e", "putStr =<< System.Environment.getExecutablePath"]) + -- we need to be compatible with NoImplicitPrelude + ghcBinary <- (fmap trim <$> runGhcCmd ["-v0", "-package-env=-", "-e", "do e <- System.Environment.getExecutablePath ; System.IO.putStr e"]) >>= cradleResult "Failed to get project GHC executable path" libdir <- HieBios.getRuntimeGhcLibDir cradle >>= cradleResult "Failed to get project GHC libdir path"