From 8c5617558cdeb0d6ef57deafd89332db81c16829 Mon Sep 17 00:00:00 2001 From: jneira Date: Tue, 19 May 2020 08:14:55 +0200 Subject: [PATCH 1/7] Use cabal-helper patched version for win That version has a fix to avoid recompiling the cabal-helper executable in windows See https://github.com/DanielG/cabal-helper/pull/117 --- cabal.project | 6 ++++++ stack-8.10.1.yaml | 4 +++- stack-8.6.4.yaml | 4 +++- stack-8.6.5.yaml | 4 +++- stack-8.8.2.yaml | 4 +++- stack-8.8.3.yaml | 4 +++- 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/cabal.project b/cabal.project index 77e059b75f..daa34d4515 100644 --- a/cabal.project +++ b/cabal.project @@ -13,6 +13,12 @@ source-repository-package location: https://github.com/peti/cabal-plan tag: 894b76c0b6bf8f7d2f881431df1f13959a8fce87 +-- See https://github.com/DanielG/cabal-helper/pull/117 +source-repository-package + type: git + location: https://github.com/jneira/cabal-helper + tag: 27736afc4360ec8e2f2e5e7cddf34e2289d3a2cb + tests: true documentation: true diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index ce9d352f61..dc729bdca8 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -7,7 +7,9 @@ packages: extra-deps: - Cabal-3.2.0.0 -- cabal-helper-1.1.0.0 +# - cabal-helper-1.1.0.0 +- github: jneira/cabal-helper + commit: 27736afc4360ec8e2f2e5e7cddf34e2289d3a2cb # See https://github.com/haskell-hvr/cabal-plan/pull/55 - github: peti/cabal-plan commit: 894b76c0b6bf8f7d2f881431df1f13959a8fce87 diff --git a/stack-8.6.4.yaml b/stack-8.6.4.yaml index b69b0dfaf7..eed2afadd4 100644 --- a/stack-8.6.4.yaml +++ b/stack-8.6.4.yaml @@ -11,7 +11,9 @@ extra-deps: - bytestring-trie-0.2.5.0 - Cabal-3.0.2.0 - cabal-doctest-1.0.8 -- cabal-helper-1.1.0.0 +# - cabal-helper-1.1.0.0 +- github: jneira/cabal-helper + commit: 27736afc4360ec8e2f2e5e7cddf34e2289d3a2cb - cabal-plan-0.5.0.0 - constrained-dynamic-0.1.0.0 # - ghcide-0.1.0 diff --git a/stack-8.6.5.yaml b/stack-8.6.5.yaml index c15beacabd..d4d3257f05 100644 --- a/stack-8.6.5.yaml +++ b/stack-8.6.5.yaml @@ -10,7 +10,9 @@ extra-deps: - brittany-0.12.1.1@rev:2 - butcher-1.3.3.1 - Cabal-3.0.2.0 -- cabal-helper-1.1.0.0 +# - cabal-helper-1.1.0.0 +- github: jneira/cabal-helper + commit: 27736afc4360ec8e2f2e5e7cddf34e2289d3a2cb - cabal-plan-0.6.2.0 - clock-0.7.2 - extra-1.7.1 diff --git a/stack-8.8.2.yaml b/stack-8.8.2.yaml index 42c038cacb..9678ff76b4 100644 --- a/stack-8.8.2.yaml +++ b/stack-8.8.2.yaml @@ -7,7 +7,9 @@ packages: extra-deps: - apply-refact-0.7.0.0 - bytestring-trie-0.2.5.0 -- cabal-helper-1.1.0.0 +# - cabal-helper-1.1.0.0 +- github: jneira/cabal-helper + commit: 27736afc4360ec8e2f2e5e7cddf34e2289d3a2cb - clock-0.7.2 - constrained-dynamic-0.1.0.0 - floskell-0.10.3 diff --git a/stack-8.8.3.yaml b/stack-8.8.3.yaml index 597c9dfb40..18752255b5 100644 --- a/stack-8.8.3.yaml +++ b/stack-8.8.3.yaml @@ -7,7 +7,9 @@ packages: extra-deps: - apply-refact-0.7.0.0 - bytestring-trie-0.2.5.0 -- cabal-helper-1.1.0.0 +# - cabal-helper-1.1.0.0 +- github: jneira/cabal-helper + commit: 27736afc4360ec8e2f2e5e7cddf34e2289d3a2cb - clock-0.7.2 - constrained-dynamic-0.1.0.0 - floskell-0.10.3 From 30925599f3f19c899ebad3a6a0299eb78d5c3693 Mon Sep 17 00:00:00 2001 From: jneira Date: Tue, 28 Apr 2020 01:03:35 +0200 Subject: [PATCH 2/7] Use cabal-helper cradle instead implicit one --- exe/Main.hs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exe/Main.hs b/exe/Main.hs index 6a2ec8c3e3..e2f9aad09f 100644 --- a/exe/Main.hs +++ b/exe/Main.hs @@ -62,6 +62,7 @@ import HIE.Bios.Environment (addCmdOpts, makeDynFlagsAbsolut import HIE.Bios.Types import HscTypes (HscEnv(..), ic_dflags) import qualified Language.Haskell.LSP.Core as LSP +import Ide.Cradle import Ide.Logger import Ide.Plugin import Ide.Plugin.Config @@ -98,6 +99,7 @@ import Ide.Plugin.Ormolu as Ormolu import Ide.Plugin.Brittany as Brittany #endif import Ide.Plugin.Pragmas as Pragmas +import Data.Void (vacuous) -- --------------------------------------------------------------------- @@ -443,7 +445,7 @@ loadSession dir = do -- throwing an async exception void $ forkIO $ do putStrLn $ "Consulting the cradle for " <> show file - cradle <- maybe (loadImplicitCradle $ addTrailingPathSeparator dir) loadCradle hieYaml + cradle <- maybe (cabalHelperCradle cfp) (fmap vacuous . loadCradle) hieYaml eopts <- cradleToSessionOpts cradle cfp print eopts case eopts of From 047aeac9d7ae7eaa93449176cfa4ac7fea12324f Mon Sep 17 00:00:00 2001 From: jneira Date: Thu, 14 May 2020 13:33:45 +0200 Subject: [PATCH 3/7] Fallback to hie-bios implicit cradle We switch to cabal-helper cradle but adding a fallback to hie-bios default implicit one --- exe/Main.hs | 2 +- src/Ide/Cradle.hs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/exe/Main.hs b/exe/Main.hs index e2f9aad09f..8b572c9217 100644 --- a/exe/Main.hs +++ b/exe/Main.hs @@ -445,7 +445,7 @@ loadSession dir = do -- throwing an async exception void $ forkIO $ do putStrLn $ "Consulting the cradle for " <> show file - cradle <- maybe (cabalHelperCradle cfp) (fmap vacuous . loadCradle) hieYaml + cradle <- maybe (implicitCradle cfp) (fmap vacuous . loadCradle) hieYaml eopts <- cradleToSessionOpts cradle cfp print eopts case eopts of diff --git a/src/Ide/Cradle.hs b/src/Ide/Cradle.hs index 9211df2453..6548a8a008 100644 --- a/src/Ide/Cradle.hs +++ b/src/Ide/Cradle.hs @@ -58,6 +58,28 @@ findLocalCradle fp = do logm $ "Module \"" ++ fp ++ "\" is loaded by Cradle: " ++ show crdl return crdl +implicitCradle :: FilePath -> IO (Cradle CabalHelper) +implicitCradle fp = do + crd@Cradle + { cradleOptsProg = CradleAction { actionName, runCradle = chRunCradle} + } <- cabalHelperCradle fp + return $ crd { + cradleOptsProg = + CradleAction + { actionName + , runCradle = \logF fp -> do + res <- chRunCradle logF fp + case res of + CradleFail (CradleError _ex stde) -> do + debugm $ "Error loading " ++ cradleDisplay crd ++ ": " ++ unlines stde + debugm $ "Fallback to hie-bios implicit cradle" + implCradle :: Cradle CabalHelper <- loadImplicitCradle fp + implRes <- (runCradle (cradleOptsProg implCradle)) logF fp + return implRes + _ -> return res + } + } + -- | Check if the given cradle is a stack cradle. -- This might be used to determine the GHC version to use on the project. -- If it is a stack-cradle, we have to use @"stack path --compiler-exe"@ From 334d4602f95be5ceda74f9f2be4d78ff5fd45083 Mon Sep 17 00:00:00 2001 From: jneira Date: Thu, 14 May 2020 21:43:13 +0200 Subject: [PATCH 4/7] Mention cabal-helper in the warning --- src/Ide/Cradle.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ide/Cradle.hs b/src/Ide/Cradle.hs index 6548a8a008..2ea8f3ac6c 100644 --- a/src/Ide/Cradle.hs +++ b/src/Ide/Cradle.hs @@ -71,8 +71,8 @@ implicitCradle fp = do res <- chRunCradle logF fp case res of CradleFail (CradleError _ex stde) -> do - debugm $ "Error loading " ++ cradleDisplay crd ++ ": " ++ unlines stde - debugm $ "Fallback to hie-bios implicit cradle" + warningm $ "Error loading " ++ cradleDisplay crd ++ "using cabal-helper: " ++ unlines stde + warningm $ "Fallback to hie-bios implicit cradle" implCradle :: Cradle CabalHelper <- loadImplicitCradle fp implRes <- (runCradle (cradleOptsProg implCradle)) logF fp return implRes From 612dc2049dcab4194572d6109c55bf32eb5cdc02 Mon Sep 17 00:00:00 2001 From: jneira Date: Fri, 15 May 2020 01:09:49 +0200 Subject: [PATCH 5/7] Remove unused variable warning --- exe/Main.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exe/Main.hs b/exe/Main.hs index 8b572c9217..dff112d1b1 100644 --- a/exe/Main.hs +++ b/exe/Main.hs @@ -298,7 +298,7 @@ setNameCache nc hsc = hsc { hsc_NC = nc } -- components mapping to the same hie,yaml file are mapped to the same -- HscEnv which is updated as new components are discovered. loadSession :: FilePath -> Action (FilePath -> Action (IdeResult HscEnvEq)) -loadSession dir = do +loadSession _dir = do nc <- ideNc <$> getShakeExtras liftIO $ do -- Mapping from hie.yaml file to HscEnv, one per hie.yaml file From 7246790de7d19455f7d2512d10e95483dfbf7da0 Mon Sep 17 00:00:00 2001 From: jneira Date: Fri, 15 May 2020 01:11:00 +0200 Subject: [PATCH 6/7] Fallback if cabal-helper throws an Exception --- src/Ide/Cradle.hs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Ide/Cradle.hs b/src/Ide/Cradle.hs index 2ea8f3ac6c..5d09c41bce 100644 --- a/src/Ide/Cradle.hs +++ b/src/Ide/Cradle.hs @@ -32,6 +32,7 @@ import System.Directory (getCurrentDirectory, canonicalizePath, findEx import System.Exit import System.FilePath import System.Process (readCreateProcessWithExitCode, shell, CreateProcess(..)) +import Exception (tryIO) -- --------------------------------------------------------------------- @@ -68,15 +69,17 @@ implicitCradle fp = do CradleAction { actionName , runCradle = \logF fp -> do - res <- chRunCradle logF fp + let fallback errMsg = do + warningm $ "Error loading " ++ cradleDisplay crd ++ " using cabal-helper: " ++ errMsg + warningm $ "Fallback to hie-bios implicit cradle" + implCradle :: Cradle CabalHelper <- loadImplicitCradle fp + implRes <- (runCradle (cradleOptsProg implCradle)) logF fp + return implRes + res <- tryIO $ chRunCradle logF fp case res of - CradleFail (CradleError _ex stde) -> do - warningm $ "Error loading " ++ cradleDisplay crd ++ "using cabal-helper: " ++ unlines stde - warningm $ "Fallback to hie-bios implicit cradle" - implCradle :: Cradle CabalHelper <- loadImplicitCradle fp - implRes <- (runCradle (cradleOptsProg implCradle)) logF fp - return implRes - _ -> return res + Left x -> fallback (show x) + Right (CradleFail (CradleError _ex stde)) -> fallback (unlines stde) + Right chRes -> return chRes } } From 9969b75785ba8d6e5538c177f297008d4038e992 Mon Sep 17 00:00:00 2001 From: jneira Date: Tue, 19 May 2020 15:28:41 +0200 Subject: [PATCH 7/7] Switch order of falback for implicit cradle In absence of an explicit hie.yaml config the code tries the hie-bios implicit cradle with a fallback to the cabal-helper one --- src/Ide/Cradle.hs | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/Ide/Cradle.hs b/src/Ide/Cradle.hs index 5d09c41bce..838622a5ad 100644 --- a/src/Ide/Cradle.hs +++ b/src/Ide/Cradle.hs @@ -60,22 +60,30 @@ findLocalCradle fp = do return crdl implicitCradle :: FilePath -> IO (Cradle CabalHelper) -implicitCradle fp = do +implicitCradle fp = cradleFallback main fallback + where main = loadImplicitCradle fp + fallback = cabalHelperCradle fp + +cradleFallback :: IO (Cradle CabalHelper) -> IO (Cradle CabalHelper) -> IO (Cradle CabalHelper) +cradleFallback mainCradle fallbackCradle = do crd@Cradle - { cradleOptsProg = CradleAction { actionName, runCradle = chRunCradle} - } <- cabalHelperCradle fp + { cradleOptsProg = CradleAction { actionName = mActionName, runCradle = mRunCradle} + } <- mainCradle + Cradle + { cradleOptsProg = CradleAction { actionName = fbActionName, runCradle = fbRunCradle} + } <- fallbackCradle return $ crd { cradleOptsProg = CradleAction - { actionName + { actionName = mActionName , runCradle = \logF fp -> do let fallback errMsg = do - warningm $ "Error loading " ++ cradleDisplay crd ++ " using cabal-helper: " ++ errMsg - warningm $ "Fallback to hie-bios implicit cradle" - implCradle :: Cradle CabalHelper <- loadImplicitCradle fp - implRes <- (runCradle (cradleOptsProg implCradle)) logF fp - return implRes - res <- tryIO $ chRunCradle logF fp + warningm $ "Error loading " ++ cradleDisplay crd + ++ " using cradle action " ++ show mActionName ++ ": " ++ errMsg + warningm $ "Fallback to cradle action " ++ show fbActionName + fbRes <- fbRunCradle logF fp + return fbRes + res <- tryIO $ mRunCradle logF fp case res of Left x -> fallback (show x) Right (CradleFail (CradleError _ex stde)) -> fallback (unlines stde)