diff --git a/README.md b/README.md index 0a1d4aba..db906f9a 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,7 @@ sudo dnf install libicu-devel ncurses-devel In order to avoid problems with long paths on Windows you can do the following: -1. Edit the group policy: set "Enable Win32 long paths" to "Enabled" (Works +1. In the `Local Group Policy Editor`: `Local Computer Policy -> Computer Configuration -> Administrative Templates -> System -> Filesystem` set `Enable Win32 long paths` to `Enabled` (Works only for Windows 10). 2. Clone the `haskell-ide-engine` to the root of your logical drive (e.g. to diff --git a/haskell-ide-engine.cabal b/haskell-ide-engine.cabal index f55d52f4..3415552d 100644 --- a/haskell-ide-engine.cabal +++ b/haskell-ide-engine.cabal @@ -71,8 +71,8 @@ library , gitrev >= 1.1 , haddock-api , haddock-library - , haskell-lsp == 0.17.* - , haskell-lsp-types == 0.17.* + , haskell-lsp == 0.18.* + , haskell-lsp-types == 0.18.* , haskell-src-exts , hie-plugin-api , hoogle >= 5.0.13 @@ -196,11 +196,12 @@ test-suite unit-test , free , ghc , haskell-ide-engine - , haskell-lsp-types == 0.17.* + , haskell-lsp-types == 0.18.* , hie-test-utils , hie-plugin-api , hoogle > 5.0.11 , hspec + , process , quickcheck-instances , text , unordered-containers @@ -284,8 +285,8 @@ test-suite func-test , filepath , lsp-test >= 0.8.0.0 , haskell-ide-engine - , haskell-lsp-types == 0.17.* - , haskell-lsp == 0.17.* + , haskell-lsp-types == 0.18.* + , haskell-lsp == 0.18.* , hie-test-utils , hie-plugin-api , hspec diff --git a/hie-plugin-api/Haskell/Ide/Engine/PluginUtils.hs b/hie-plugin-api/Haskell/Ide/Engine/PluginUtils.hs index 557ec615..6d428694 100644 --- a/hie-plugin-api/Haskell/Ide/Engine/PluginUtils.hs +++ b/hie-plugin-api/Haskell/Ide/Engine/PluginUtils.hs @@ -275,7 +275,7 @@ readVFS :: (MonadIde m, MonadIO m) => Uri -> m (Maybe T.Text) readVFS uri = do mvf <- getVirtualFile uri case mvf of - Just (VirtualFile _ txt _) -> return $ Just (Rope.toText txt) + Just (VirtualFile _ txt) -> return $ Just (Rope.toText txt) Nothing -> return Nothing getRangeFromVFS :: (MonadIde m, MonadIO m) => Uri -> Range -> m (Maybe T.Text) diff --git a/hie-plugin-api/hie-plugin-api.cabal b/hie-plugin-api/hie-plugin-api.cabal index 02759d40..4c496f62 100644 --- a/hie-plugin-api/hie-plugin-api.cabal +++ b/hie-plugin-api/hie-plugin-api.cabal @@ -45,7 +45,7 @@ library , ghc , ghc-mod-core >= 5.9.0.0 , ghc-project-types >= 5.9.0.0 - , haskell-lsp == 0.17.* + , haskell-lsp == 0.18.* , hslogger , monad-control , mtl diff --git a/install/src/Stack.hs b/install/src/Stack.hs index eef3126a..210d406e 100644 --- a/install/src/Stack.hs +++ b/install/src/Stack.hs @@ -3,11 +3,13 @@ module Stack where import Development.Shake import Development.Shake.Command import Development.Shake.FilePath +import Control.Exception import Control.Monad import Data.List import System.Directory ( copyFile ) import System.FilePath ( searchPathSeparator, () ) import System.Environment ( lookupEnv, setEnv, getEnvironment ) +import System.IO.Error ( isDoesNotExistError ) import BuildSystem import Version import Print @@ -102,7 +104,11 @@ stackBuildFailMsg = -- |Run actions without the stack cached binaries withoutStackCachedBinaries :: Action a -> Action a withoutStackCachedBinaries action = do - mbPath <- liftIO (lookupEnv "PATH") + + let getEnvErrorHandler e | isDoesNotExistError e = return Nothing + | otherwise = throwIO e + + mbPath <- liftIO (lookupEnv "PATH" `catch` getEnvErrorHandler) case (mbPath, isRunFromStack) of diff --git a/src/Haskell/Ide/Engine/Plugin/Liquid.hs b/src/Haskell/Ide/Engine/Plugin/Liquid.hs index d2bbdf2c..4868a770 100644 --- a/src/Haskell/Ide/Engine/Plugin/Liquid.hs +++ b/src/Haskell/Ide/Engine/Plugin/Liquid.hs @@ -166,10 +166,19 @@ runLiquidHaskell fp = do cp = (shell cmd) { cwd = Just dir } -- logm $ "runLiquidHaskell:cmd=[" ++ cmd ++ "]" mpp <- lookupEnv "GHC_PACKAGE_PATH" + mge <- lookupEnv "GHC_ENVIRONMENT" -- logm $ "runLiquidHaskell:mpp=[" ++ show mpp ++ "]" + -- env <- getEnvironment + -- logm $ "runLiquidHaskell:env=[" ++ show env ++ "]" (ec,o,e) <- bracket - (unsetEnv "GHC_PACKAGE_PATH") - (\_ -> mapM_ (setEnv "GHC_PACKAGE_PATH") mpp) + (do + unsetEnv "GHC_ENVIRONMENT" + unsetEnv "GHC_PACKAGE_PATH" + ) + (\_ -> do + mapM_ (setEnv "GHC_PACKAGE_PATH") mpp + mapM_ (setEnv "GHC_ENVIRONMENT" ) mge + ) (\_ -> readCreateProcessWithExitCode cp "") -- logm $ "runLiquidHaskell:v=" ++ show (ec,o,e) return $ Just (ec,[o,e]) diff --git a/src/Haskell/Ide/Engine/Transport/LspStdio.hs b/src/Haskell/Ide/Engine/Transport/LspStdio.hs index 07860e11..576bdc79 100644 --- a/src/Haskell/Ide/Engine/Transport/LspStdio.hs +++ b/src/Haskell/Ide/Engine/Transport/LspStdio.hs @@ -219,8 +219,8 @@ mapFileFromVfs tn vtdi = do vfsFunc <- asksLspFuncs Core.getVirtualFileFunc mvf <- liftIO $ vfsFunc (J.toNormalizedUri uri) case (mvf, uriToFilePath uri) of - (Just (VFS.VirtualFile _ yitext _), Just fp) -> do - let text' = Rope.toString yitext + (Just (VFS.VirtualFile _ rope), Just fp) -> do + let text' = Rope.toString rope -- text = "{-# LINE 1 \"" ++ fp ++ "\"#-}\n" <> text' let req = GReq tn (Just uri) Nothing Nothing (const $ return ()) $ IdeResultOk <$> do @@ -798,7 +798,7 @@ withDocumentContents reqId uri f = do (J.responseId reqId) J.InvalidRequest "Document was not open" - Just (VFS.VirtualFile _ txt _) -> f (Rope.toText txt) + Just (VFS.VirtualFile _ txt) -> f (Rope.toText txt) -- | Get the currently configured formatter provider. -- The currently configured formatter provider is defined in @Config@ by PluginId. @@ -966,14 +966,15 @@ syncOptions = J.TextDocumentSyncOptions hieOptions :: [T.Text] -> Core.Options hieOptions commandIds = def { Core.textDocumentSync = Just syncOptions - , Core.completionKinds = Just ["."] + -- The characters that trigger completion automatically. + , Core.completionTriggerCharacters = Just ['.'] -- As of 2018-05-24, vscode needs the commands to be registered -- otherwise they will not be available as codeActions (will be -- silently ignored, despite UI showing to the contrary). -- -- Hopefully the end May 2018 vscode release will stabilise -- this, it is a major rework of the machinery anyway. - , Core.executeCommandCommands = commandIds + , Core.executeCommandCommands = Just commandIds } diff --git a/stack-8.4.2.yaml b/stack-8.4.2.yaml index f7d20a30..25a57277 100644 --- a/stack-8.4.2.yaml +++ b/stack-8.4.2.yaml @@ -19,14 +19,14 @@ extra-deps: - ghc-lib-parser-8.8.1 - haddock-api-2.20.0 - haddock-library-1.6.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - haskell-src-exts-1.21.1 - haskell-src-exts-util-0.2.5 - hlint-2.2.3 - hoogle-5.0.17.11 - hsimport-0.11.0 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2 - pretty-show-1.8.2 - rope-utf16-splay-0.3.1.0 diff --git a/stack-8.4.3.yaml b/stack-8.4.3.yaml index 728ba2ef..8b912ef1 100644 --- a/stack-8.4.3.yaml +++ b/stack-8.4.3.yaml @@ -19,14 +19,14 @@ extra-deps: - ghc-lib-parser-8.8.1 - haddock-api-2.20.0 - haddock-library-1.6.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - haskell-src-exts-1.21.1 - haskell-src-exts-util-0.2.5 - hlint-2.2.3 - hoogle-5.0.17.11 - hsimport-0.11.0 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2 - pretty-show-1.8.2 - rope-utf16-splay-0.3.1.0 diff --git a/stack-8.4.4.yaml b/stack-8.4.4.yaml index 05258f8d..b820d620 100644 --- a/stack-8.4.4.yaml +++ b/stack-8.4.4.yaml @@ -18,14 +18,14 @@ extra-deps: - ghc-lib-parser-8.8.1 - haddock-api-2.20.0 - haddock-library-1.6.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - haskell-src-exts-1.21.1 - haskell-src-exts-util-0.2.5 - hlint-2.2.3 - hoogle-5.0.17.11 - hsimport-0.11.0 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2 - optparse-simple-0.1.0 - pretty-show-1.9.5 diff --git a/stack-8.6.1.yaml b/stack-8.6.1.yaml index 08b24e7b..be46a7c8 100644 --- a/stack-8.6.1.yaml +++ b/stack-8.6.1.yaml @@ -22,14 +22,14 @@ extra-deps: - floskell-0.10.1 - ghc-lib-parser-8.8.1 - haddock-api-2.21.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - haskell-src-exts-1.21.1 - haskell-src-exts-util-0.2.5 - hlint-2.2.3 - hoogle-5.0.17.11 - hsimport-0.11.0 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2 - monad-memo-0.4.1 - monoid-subclasses-0.4.6.1 diff --git a/stack-8.6.2.yaml b/stack-8.6.2.yaml index 8228d859..87bb2c77 100644 --- a/stack-8.6.2.yaml +++ b/stack-8.6.2.yaml @@ -18,14 +18,14 @@ extra-deps: - floskell-0.10.1 - ghc-lib-parser-8.8.1 - haddock-api-2.21.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - haskell-src-exts-1.21.1 - haskell-src-exts-util-0.2.5 - hlint-2.2.3 - hoogle-5.0.17.11 - hsimport-0.11.0 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2 - monad-memo-0.4.1 - multistate-0.8.0.1 diff --git a/stack-8.6.3.yaml b/stack-8.6.3.yaml index a7d8a85c..c980dc1b 100644 --- a/stack-8.6.3.yaml +++ b/stack-8.6.3.yaml @@ -17,14 +17,14 @@ extra-deps: - floskell-0.10.1 - ghc-lib-parser-8.8.1 - haddock-api-2.21.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - haskell-src-exts-1.21.1 - haskell-src-exts-util-0.2.5 - hlint-2.2.3 - hoogle-5.0.17.11 - hsimport-0.11.0 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2 - monad-memo-0.4.1 - multistate-0.8.0.1 diff --git a/stack-8.6.4.yaml b/stack-8.6.4.yaml index adea017a..521474b0 100644 --- a/stack-8.6.4.yaml +++ b/stack-8.6.4.yaml @@ -17,13 +17,13 @@ extra-deps: - floskell-0.10.1 - ghc-lib-parser-8.8.1 - haddock-api-2.22.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - haskell-src-exts-1.21.1 - hlint-2.2.3 - hoogle-5.0.17.11 - hsimport-0.11.0 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2@rev:1 - monad-memo-0.4.1 - multistate-0.8.0.1 diff --git a/stack-8.6.5.yaml b/stack-8.6.5.yaml index 3bf0af29..73e7a010 100644 --- a/stack-8.6.5.yaml +++ b/stack-8.6.5.yaml @@ -18,12 +18,12 @@ extra-deps: - floskell-0.10.1 - ghc-lib-parser-8.8.1 - haddock-api-2.22.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - hlint-2.2.3 - hsimport-0.11.0 - hoogle-5.0.17.11 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2@rev:1 - syz-0.2.0.0 - temporary-1.2.1.1 diff --git a/stack.yaml b/stack.yaml index 0acbf41f..37fc5655 100644 --- a/stack.yaml +++ b/stack.yaml @@ -18,11 +18,11 @@ extra-deps: - floskell-0.10.1 - ghc-lib-parser-8.8.1 - haddock-api-2.22.0 -- haskell-lsp-0.17.0.0 -- haskell-lsp-types-0.17.0.0 +- haskell-lsp-0.18.0.0 +- haskell-lsp-types-0.18.0.0 - hlint-2.2.3 - hsimport-0.11.0 -- lsp-test-0.8.0.0 +- lsp-test-0.8.2.0 - monad-dijkstra-0.1.1.2@rev:1 - syz-0.2.0.0 - temporary-1.2.1.1 diff --git a/test/dispatcher/Main.hs b/test/dispatcher/Main.hs index 0fe09ff7..7be2f170 100644 --- a/test/dispatcher/Main.hs +++ b/test/dispatcher/Main.hs @@ -71,12 +71,13 @@ startServer :: IO (Scheduler IO, TChan LogVal, ThreadId) startServer = do scheduler <- newScheduler plugins testOptions logChan <- newTChanIO - dispatcher <- forkIO $ + dispatcher <- forkIO $ do + flushStackEnvironment runScheduler - scheduler - (\lid errCode e -> logToChan logChan ("received an error", Left (lid, errCode, e))) - (\g x -> g x) - def + scheduler + (\lid errCode e -> logToChan logChan ("received an error", Left (lid, errCode, e))) + (\g x -> g x) + def return (scheduler, logChan, dispatcher) diff --git a/test/functional/FunctionalCodeActionsSpec.hs b/test/functional/FunctionalCodeActionsSpec.hs index bfcb9e37..80fb2310 100644 --- a/test/functional/FunctionalCodeActionsSpec.hs +++ b/test/functional/FunctionalCodeActionsSpec.hs @@ -212,31 +212,33 @@ spec = describe "code actions" $ do ] ] describe "add package suggestions" $ do - it "adds to .cabal files" $ runSession hieCommand fullCaps "test/testdata/addPackageTest/cabal-exe" $ do - doc <- openDoc "AddPackage.hs" "haskell" + it "adds to .cabal files" $ do + flushStackEnvironment + runSession hieCommand fullCaps "test/testdata/addPackageTest/cabal-exe" $ do + doc <- openDoc "AddPackage.hs" "haskell" - -- ignore the first empty hlint diagnostic publish - [_,diag:_] <- count 2 waitForDiagnostics + -- ignore the first empty hlint diagnostic publish + [_,diag:_] <- count 2 waitForDiagnostics - let prefixes = [ "Could not load module `Data.Text'" -- Windows && GHC >= 8.6 - , "Could not find module `Data.Text'" -- Windows - , "Could not load module ‘Data.Text’" -- GHC >= 8.6 - , "Could not find module ‘Data.Text’" - ] - in liftIO $ diag ^. L.message `shouldSatisfy` \m -> any (`T.isPrefixOf` m) prefixes + let prefixes = [ "Could not load module `Data.Text'" -- Windows && GHC >= 8.6 + , "Could not find module `Data.Text'" -- Windows + , "Could not load module ‘Data.Text’" -- GHC >= 8.6 + , "Could not find module ‘Data.Text’" + ] + in liftIO $ diag ^. L.message `shouldSatisfy` \m -> any (`T.isPrefixOf` m) prefixes - acts <- getAllCodeActions doc - let (CACodeAction action:_) = acts + acts <- getAllCodeActions doc + let (CACodeAction action:_) = acts - liftIO $ do - action ^. L.title `shouldBe` "Add text as a dependency" - action ^. L.kind `shouldBe` Just CodeActionQuickFix - action ^. L.command . _Just . L.command `shouldSatisfy` T.isSuffixOf "package:add" + liftIO $ do + action ^. L.title `shouldBe` "Add text as a dependency" + action ^. L.kind `shouldBe` Just CodeActionQuickFix + action ^. L.command . _Just . L.command `shouldSatisfy` T.isSuffixOf "package:add" - executeCodeAction action + executeCodeAction action - contents <- getDocumentEdit . TextDocumentIdentifier =<< getDocUri "add-package-test.cabal" - liftIO $ T.lines contents `shouldSatisfy` \x -> any (\l -> "text -any" `T.isSuffixOf` (x !! l)) [15, 16] + contents <- getDocumentEdit . TextDocumentIdentifier =<< getDocUri "add-package-test.cabal" + liftIO $ T.lines contents `shouldSatisfy` \x -> any (\l -> "text -any" `T.isSuffixOf` (x !! l)) [15, 16] it "adds to hpack package.yaml files" $ runSession hieCommand fullCaps "test/testdata/addPackageTest/hpack-exe" $ do diff --git a/test/functional/FunctionalLiquidSpec.hs b/test/functional/FunctionalLiquidSpec.hs index b1f7fc29..1cac42bb 100644 --- a/test/functional/FunctionalLiquidSpec.hs +++ b/test/functional/FunctionalLiquidSpec.hs @@ -98,11 +98,16 @@ spec = describe "liquid haskell diagnostics" $ do -- liftIO $ show diags3 `shouldBe` "" liftIO $ do length diags3 `shouldBe` 1 - d ^. range `shouldBe` Range (Position 8 0) (Position 8 7) + d ^. range `shouldBe` Range (Position 8 0) (Position 8 11) d ^. severity `shouldBe` Just DsError d ^. code `shouldBe` Nothing d ^. source `shouldBe` Just "liquid" - d ^. message `shouldSatisfy` (T.isPrefixOf "Error: Liquid Type Mismatch\n Inferred type\n VV : {v : Int | v == (7 : int)}\n \n not a subtype of Required type\n VV : {VV : Int | VV mod 2 == 0}\n") + d ^. message `shouldSatisfy` T.isPrefixOf ("Error: Liquid Type Mismatch\n" <> + " Inferred type\n" <> + " VV : {v : GHC.Types.Int | v == 7}\n" <> + " \n" <> + " not a subtype of Required type\n" <> + " VV : {VV : GHC.Types.Int | VV mod 2 == 0}\n ") -- --------------------------------------------------------------------- diff --git a/test/unit/LiquidSpec.hs b/test/unit/LiquidSpec.hs index 2acafe4f..16191fb6 100644 --- a/test/unit/LiquidSpec.hs +++ b/test/unit/LiquidSpec.hs @@ -3,16 +3,19 @@ module LiquidSpec where import Data.Aeson +import Data.List import qualified Data.ByteString.Lazy as BS import qualified Data.Text as T import qualified Data.Text.IO as T import Data.Monoid ((<>)) -import Data.Maybe (isJust) import Haskell.Ide.Engine.MonadTypes import Haskell.Ide.Engine.Plugin.Liquid import System.Directory +import System.Exit import System.FilePath +import System.Process import Test.Hspec +-- import Control.Monad.IO.Class main :: IO () main = hspec spec @@ -24,22 +27,27 @@ spec = do -- --------------------------------- - it "finds liquid haskell exe in $PATH" $ findExecutable "liquid" >>= (`shouldSatisfy` isJust) + it "the liquid haskell exe in $PATH has the supported version" $ do + mexe <- findExecutable "liquid" + case mexe of + Nothing -> expectationFailure "liquid haskell exe is NOT in $PATH" + Just exe -> do + version <- readProcess exe ["--numeric-version"] "" + version `shouldSatisfy` isPrefixOf "0.8.6.2" -- --------------------------------- - -- AZ: this test has been moved to func-tests, stack > 2.1 sets - -- its own package environment, we can't run it from here. - - -- -- This produces some products in /test/testdata/liquid/.liquid/ that is used in subsequent test - -- it "runs the liquid haskell exe" $ do - -- let - -- fp = cwd "test/testdata/liquid/Evens.hs" - -- -- fp = "/home/alanz/tmp/haskell-proc-play/Evens.hs" - -- -- uri = filePathToUri fp - -- Just (ef, (msg:_)) <- runLiquidHaskell fp - -- msg `shouldSatisfy` isPrefixOf "RESULT\n[{\"start\":{\"line\":9,\"column\":1},\"stop\":{\"line\":9,\"column\":8},\"message\":\"Error: Liquid Type Mismatch\\n Inferred type\\n VV : {v : Int | v == (7 : int)}\\n \\n not a subtype of Required type\\n VV : {VV : Int | VV mod 2 == 0}\\n" - -- ef `shouldBe` ExitFailure 1 + -- This produces some products in /test/testdata/liquid/.liquid/ + -- that are used in subsequent test + it "runs the liquid haskell exe" $ do + let + fp = cwd "test/testdata/liquid/Evens.hs" + Just (ef, (msg:_)) <- runLiquidHaskell fp + -- liftIO $ putStrLn $ "msg=" ++ msg + -- liftIO $ putStrLn $ "msg=" ++ unlines (drop 3 (lines msg)) + let msg' = unlines (drop 3 (lines msg)) + msg' `shouldSatisfy` isInfixOf "RESULT\n[{\"start\":{\"line\"" + ef `shouldBe` ExitFailure 1 -- --------------------------------- it "gets annot file paths" $ do @@ -60,12 +68,15 @@ spec = do let Just v = decode jf :: Maybe LiquidJson let [LE { start, stop, message }] = errors v start `shouldBe` LP 9 1 - stop `shouldBe` LP 9 8 + stop `shouldBe` LP 9 12 message `shouldSatisfy` T.isPrefixOf - ("Error: Liquid Type Mismatch\n Inferred type\n" <> - " VV : {v : Int | v == (7 : int)}\n \n" <> + ("Error: Liquid Type Mismatch\n" <> + " Inferred type\n" <> + " VV : {v : GHC.Types.Int | v == 7}\n" <> + " \n" <> " not a subtype of Required type\n" <> - " VV : {VV : Int | VV mod 2 == 0}\n") + " VV : {VV : GHC.Types.Int | VV mod 2 == 0}\n" <> + " ") -- --------------------------------- @@ -100,8 +111,8 @@ spec = do take 2 ts `shouldBe` [LE (LP 1 1) (LP 1 1) "GHC.Types.Module" - ,LE (LP 6 1) (LP 6 10) "[{v : GHC.Types.Int | v mod 2 == 0}]"] - length ts `shouldBe` 38 + ,LE (LP 6 1) (LP 6 10) "[{VV : GHC.Types.Int | VV mod 2 == 0}]"] + length ts `shouldBe` 53 -- --------------------------------- @@ -112,8 +123,8 @@ spec = do take 2 ts `shouldBe` [LE (LP 1 1) (LP 1 1) "GHC.Types.Module" - ,LE (LP 6 1) (LP 6 10) "[{v : GHC.Types.Int | v mod 2 == 0}]"] - length ts `shouldBe` 38 + ,LE (LP 6 1) (LP 6 10) "[{VV : GHC.Types.Int | VV mod 2 == 0}]"] + length ts `shouldBe` 53 -- --------------------------------- diff --git a/test/utils/TestUtils.hs b/test/utils/TestUtils.hs index 233b2e97..9ae27a06 100644 --- a/test/utils/TestUtils.hs +++ b/test/utils/TestUtils.hs @@ -15,6 +15,7 @@ module TestUtils , hieCommandVomit , hieCommandExamplePlugin , getHspecFormattedConfig + , flushStackEnvironment ) where import Control.Concurrent.STM @@ -54,6 +55,7 @@ testOptions = defaultOptions { testCommand :: (ToJSON a, Typeable b, ToJSON b, Show b, Eq b) => IdePlugins -> IdeGhcM (IdeResult b) -> PluginId -> CommandName -> a -> IdeResult b -> IO () testCommand testPlugins act plugin cmd arg res = do + flushStackEnvironment (newApiRes, oldApiRes) <- runIGM testPlugins $ do new <- act old <- makeRequest plugin cmd arg @@ -285,3 +287,14 @@ xmlFormatter = silent { -- --------------------------------------------------------------------- +flushStackEnvironment :: IO () +flushStackEnvironment = do + -- We need to clear these environment variables to prevent + -- collisions with stack usages + -- See https://github.com/commercialhaskell/stack/issues/4875 + unsetEnv "GHC_PACKAGE_PATH" + unsetEnv "GHC_ENVIRONMENT" + unsetEnv "HASKELL_PACKAGE_SANDBOX" + unsetEnv "HASKELL_PACKAGE_SANDBOXES" + +-- ---------------------------------------------------------------------