Skip to content

Commit c3236eb

Browse files
wz1000soulomoonmichaelpj
authored
ghcide: drop ghc-check and ghc-paths dependency (#4291)
* ghcide: drop ghc-check and ghc-paths dependency We don't really need these, as we don't use any of the fancy abi-hash checking features in ghc-check and instead rely on a wrapper script to do this. * Fix stylish --------- Co-authored-by: soulomoon <[email protected]> Co-authored-by: Michael Peyton Jones <[email protected]>
1 parent 7b8e2e5 commit c3236eb

File tree

3 files changed

+82
-113
lines changed

3 files changed

+82
-113
lines changed

ghcide/ghcide.cabal

-3
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ library
7474
, ghc >=9.2
7575
, ghc-boot
7676
, ghc-boot-th
77-
, ghc-check >=0.5.0.8
78-
, ghc-paths
7977
, ghc-trace-events
8078
, Glob
8179
, haddock-library >=1.8 && <1.12
@@ -205,7 +203,6 @@ library
205203
Development.IDE.Core.FileExists
206204
Development.IDE.GHC.CPP
207205
Development.IDE.GHC.Warnings
208-
Development.IDE.Session.VersionCheck
209206
Development.IDE.Types.Action
210207

211208
if flag(pedantic)

ghcide/session-loader/Development/IDE/Session.hs

+82-95
Original file line numberDiff line numberDiff line change
@@ -21,115 +21,115 @@ module Development.IDE.Session
2121
-- building with ghc-lib we need to make this Haskell agnostic, so no hie-bios!
2222

2323
import Control.Concurrent.Strict
24-
import Control.Exception.Safe as Safe
24+
import Control.Exception.Safe as Safe
2525
import Control.Monad
26-
import Control.Monad.Extra as Extra
26+
import Control.Monad.Extra as Extra
2727
import Control.Monad.IO.Class
28-
import qualified Crypto.Hash.SHA1 as H
29-
import Data.Aeson hiding (Error)
28+
import qualified Crypto.Hash.SHA1 as H
29+
import Data.Aeson hiding (Error)
3030
import Data.Bifunctor
31-
import qualified Data.ByteString.Base16 as B16
32-
import qualified Data.ByteString.Char8 as B
31+
import qualified Data.ByteString.Base16 as B16
32+
import qualified Data.ByteString.Char8 as B
3333
import Data.Default
3434
import Data.Either.Extra
3535
import Data.Function
36-
import Data.Hashable hiding (hash)
37-
import qualified Data.HashMap.Strict as HM
36+
import Data.Hashable hiding (hash)
37+
import qualified Data.HashMap.Strict as HM
3838
import Data.IORef
3939
import Data.List
40-
import Data.List.Extra as L
41-
import Data.List.NonEmpty (NonEmpty (..))
42-
import qualified Data.List.NonEmpty as NE
43-
import qualified Data.Map.Strict as Map
40+
import Data.List.Extra as L
41+
import Data.List.NonEmpty (NonEmpty (..))
42+
import qualified Data.List.NonEmpty as NE
43+
import qualified Data.Map.Strict as Map
4444
import Data.Maybe
4545
import Data.Proxy
46-
import qualified Data.Text as T
46+
import qualified Data.Text as T
4747
import Data.Time.Clock
4848
import Data.Version
4949
import Development.IDE.Core.RuleTypes
50-
import Development.IDE.Core.Shake hiding (Log, knownTargets,
51-
withHieDb)
52-
import qualified Development.IDE.GHC.Compat as Compat
50+
import Development.IDE.Core.Shake hiding (Log, knownTargets,
51+
withHieDb)
52+
import qualified Development.IDE.GHC.Compat as Compat
5353
import Development.IDE.GHC.Compat.CmdLine
54-
import Development.IDE.GHC.Compat.Core hiding (Target,
55-
TargetFile, TargetModule,
56-
Var, Warning, getOptions)
57-
import qualified Development.IDE.GHC.Compat.Core as GHC
58-
import Development.IDE.GHC.Compat.Env hiding (Logger)
59-
import Development.IDE.GHC.Compat.Units (UnitId)
54+
import Development.IDE.GHC.Compat.Core hiding (Target, TargetFile,
55+
TargetModule, Var,
56+
Warning, getOptions)
57+
import qualified Development.IDE.GHC.Compat.Core as GHC
58+
import Development.IDE.GHC.Compat.Env hiding (Logger)
59+
import Development.IDE.GHC.Compat.Units (UnitId)
6060
import Development.IDE.GHC.Util
61-
import Development.IDE.Graph (Action)
62-
import qualified Development.IDE.Session.Implicit as GhcIde
63-
import Development.IDE.Session.VersionCheck
61+
import Development.IDE.Graph (Action)
62+
import qualified Development.IDE.Session.Implicit as GhcIde
6463
import Development.IDE.Types.Diagnostics
6564
import Development.IDE.Types.Exports
66-
import Development.IDE.Types.HscEnvEq (HscEnvEq, newHscEnvEq,
67-
newHscEnvEqPreserveImportPaths)
65+
import Development.IDE.Types.HscEnvEq (HscEnvEq, newHscEnvEq,
66+
newHscEnvEqPreserveImportPaths)
6867
import Development.IDE.Types.Location
6968
import Development.IDE.Types.Options
70-
import GHC.Check
7169
import GHC.ResponseFile
72-
import qualified HIE.Bios as HieBios
73-
import HIE.Bios.Environment hiding (getCacheDir)
74-
import HIE.Bios.Types hiding (Log)
75-
import qualified HIE.Bios.Types as HieBios
76-
import Ide.Logger (Pretty (pretty),
77-
Priority (Debug, Error, Info, Warning),
78-
Recorder, WithPriority,
79-
cmapWithPrio, logWith,
80-
nest,
81-
toCologActionWithPrio,
82-
vcat, viaShow, (<+>))
83-
import Ide.Types (SessionLoadingPreferenceConfig (..),
84-
sessionLoading)
70+
import qualified HIE.Bios as HieBios
71+
import HIE.Bios.Environment hiding (getCacheDir)
72+
import HIE.Bios.Types hiding (Log)
73+
import qualified HIE.Bios.Types as HieBios
74+
import Ide.Logger (Pretty (pretty),
75+
Priority (Debug, Error, Info, Warning),
76+
Recorder, WithPriority,
77+
cmapWithPrio, logWith,
78+
nest,
79+
toCologActionWithPrio,
80+
vcat, viaShow, (<+>))
81+
import Ide.Types (SessionLoadingPreferenceConfig (..),
82+
sessionLoading)
8583
import Language.LSP.Protocol.Message
8684
import Language.LSP.Server
8785
import System.Directory
88-
import qualified System.Directory.Extra as IO
86+
import qualified System.Directory.Extra as IO
8987
import System.FilePath
9088
import System.Info
9189

92-
import Control.Applicative (Alternative ((<|>)))
90+
import Control.Applicative (Alternative ((<|>)))
9391
import Data.Void
9492

95-
import Control.Concurrent.STM.Stats (atomically, modifyTVar',
96-
readTVar, writeTVar)
93+
import Control.Concurrent.STM.Stats (atomically, modifyTVar',
94+
readTVar, writeTVar)
9795
import Control.Concurrent.STM.TQueue
9896
import Control.DeepSeq
99-
import Control.Exception (evaluate)
100-
import Control.Monad.IO.Unlift (MonadUnliftIO)
101-
import Control.Monad.Trans.Cont (ContT (ContT, runContT))
102-
import Data.Foldable (for_)
103-
import Data.HashMap.Strict (HashMap)
104-
import Data.HashSet (HashSet)
105-
import qualified Data.HashSet as Set
97+
import Control.Exception (evaluate)
98+
import Control.Monad.IO.Unlift (MonadUnliftIO)
99+
import Control.Monad.Trans.Cont (ContT (ContT, runContT))
100+
import Data.Foldable (for_)
101+
import Data.HashMap.Strict (HashMap)
102+
import Data.HashSet (HashSet)
103+
import qualified Data.HashSet as Set
106104
import Database.SQLite.Simple
107-
import Development.IDE.Core.Tracing (withTrace)
108-
import Development.IDE.Core.WorkerThread (awaitRunInThread,
109-
withWorkerQueue)
110-
import Development.IDE.Session.Diagnostics (renderCradleError)
111-
import Development.IDE.Types.Shake (WithHieDb,
112-
WithHieDbShield (..),
113-
toNoFileKey)
105+
import Development.IDE.Core.Tracing (withTrace)
106+
import Development.IDE.Core.WorkerThread (awaitRunInThread,
107+
withWorkerQueue)
108+
import Development.IDE.Session.Diagnostics (renderCradleError)
109+
import Development.IDE.Types.Shake (WithHieDb,
110+
WithHieDbShield (..),
111+
toNoFileKey)
114112
import HieDb.Create
115113
import HieDb.Types
116114
import HieDb.Utils
117-
import Ide.PluginUtils (toAbsolute)
118-
import qualified System.Random as Random
119-
import System.Random (RandomGen)
115+
import Ide.PluginUtils (toAbsolute)
116+
import qualified System.Random as Random
117+
import System.Random (RandomGen)
118+
import Text.ParserCombinators.ReadP (readP_to_S)
119+
120120

121121
-- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
122122

123123
#if MIN_VERSION_ghc(9,3,0)
124-
import qualified Data.Set as OS
125-
import qualified Development.IDE.GHC.Compat.Util as Compat
124+
import qualified Data.Set as OS
125+
import qualified Development.IDE.GHC.Compat.Util as Compat
126126
import GHC.Data.Graph.Directed
127127

128128
import GHC.Data.Bag
129-
import GHC.Driver.Env (hsc_all_home_unit_ids)
129+
import GHC.Driver.Env (hsc_all_home_unit_ids)
130130
import GHC.Driver.Errors.Types
131-
import GHC.Types.Error (errMsgDiagnostic,
132-
singleMessage)
131+
import GHC.Types.Error (errMsgDiagnostic,
132+
singleMessage)
133133
import GHC.Unit.State
134134
#endif
135135

@@ -147,7 +147,7 @@ data Log
147147
| LogDLLLoadError !String
148148
| LogCradlePath !FilePath
149149
| LogCradleNotFound !FilePath
150-
| LogSessionLoadingResult !(Either [CradleError] (ComponentOptions, FilePath))
150+
| LogSessionLoadingResult !(Either [CradleError] (ComponentOptions, FilePath, String))
151151
| LogCradle !(Cradle Void)
152152
| LogNoneCradleFound FilePath
153153
| LogNewComponentCache !(([FileDiagnostic], Maybe HscEnvEq), DependencyInfo)
@@ -654,16 +654,15 @@ loadSessionWithOptions recorder SessionLoadingOptions{..} rootDir que = do
654654
case eopts of
655655
-- The cradle gave us some options so get to work turning them
656656
-- into and HscEnv.
657-
Right (opts, libDir) -> do
658-
installationCheck <- ghcVersionChecker libDir
659-
case installationCheck of
660-
InstallationNotFound{..} ->
661-
error $ "GHC installation not found in libdir: " <> libdir
662-
InstallationMismatch{..} ->
663-
return (([renderPackageSetupException cfp GhcVersionMismatch{..}], Nothing),[])
664-
InstallationChecked _compileTime _ghcLibCheck -> do
665-
atomicModifyIORef' cradle_files (\xs -> (cfp:xs,()))
666-
session (hieYaml, toNormalizedFilePath' cfp, opts, libDir)
657+
Right (opts, libDir, version) -> do
658+
let compileTime = fullCompilerVersion
659+
case reverse $ readP_to_S parseVersion version of
660+
[] -> error $ "GHC version could not be parsed: " <> version
661+
((runTime, _):_)
662+
| compileTime == runTime -> do
663+
atomicModifyIORef' cradle_files (\xs -> (cfp:xs,()))
664+
session (hieYaml, toNormalizedFilePath' cfp, opts, libDir)
665+
| otherwise -> return (([renderPackageSetupException cfp GhcVersionMismatch{..}], Nothing),[])
667666
-- Failure case, either a cradle error or the none cradle
668667
Left err -> do
669668
dep_info <- getDependencyInfo (maybeToList hieYaml)
@@ -743,7 +742,7 @@ loadSessionWithOptions recorder SessionLoadingOptions{..} rootDir que = do
743742
-- This then builds dependencies or whatever based on the cradle, gets the
744743
-- GHC options/dynflags needed for the session and the GHC library directory
745744
cradleToOptsAndLibDir :: Recorder (WithPriority Log) -> SessionLoadingPreferenceConfig -> Cradle Void -> FilePath -> [FilePath]
746-
-> IO (Either [CradleError] (ComponentOptions, FilePath))
745+
-> IO (Either [CradleError] (ComponentOptions, FilePath, String))
747746
cradleToOptsAndLibDir recorder loadConfig cradle file old_fps = do
748747
-- let noneCradleFoundMessage :: FilePath -> T.Text
749748
-- noneCradleFoundMessage f = T.pack $ "none cradle found for " <> f <> ", ignoring the file"
@@ -754,9 +753,10 @@ cradleToOptsAndLibDir recorder loadConfig cradle file old_fps = do
754753
CradleSuccess r -> do
755754
-- Now get the GHC lib dir
756755
libDirRes <- getRuntimeGhcLibDir cradle
757-
case libDirRes of
756+
versionRes <- getRuntimeGhcVersion cradle
757+
case liftA2 (,) libDirRes versionRes of
758758
-- This is the successful path
759-
CradleSuccess libDir -> pure (Right (r, libDir))
759+
(CradleSuccess (libDir, version)) -> pure (Right (r, libDir, version))
760760
CradleFail err -> return (Left [err])
761761
CradleNone -> do
762762
logWith recorder Info $ LogNoneCradleFound file
@@ -1286,7 +1286,6 @@ data PackageSetupException
12861286
{ compileTime :: !Version
12871287
, runTime :: !Version
12881288
}
1289-
| PackageCheckFailed !NotCompatibleReason
12901289
deriving (Eq, Show, Typeable)
12911290

12921291
instance Exception PackageSetupException
@@ -1306,21 +1305,9 @@ showPackageSetupException GhcVersionMismatch{..} = unwords
13061305
,"\nThis is unsupported, ghcide must be compiled with the same GHC version as the project."
13071306
]
13081307
showPackageSetupException PackageSetupException{..} = unwords
1309-
[ "ghcide compiled by GHC", showVersion compilerVersion
1308+
[ "ghcide compiled by GHC", showVersion fullCompilerVersion
13101309
, "failed to load packages:", message <> "."
13111310
, "\nPlease ensure that ghcide is compiled with the same GHC installation as the project."]
1312-
showPackageSetupException (PackageCheckFailed PackageVersionMismatch{..}) = unwords
1313-
["ghcide compiled with package "
1314-
, packageName <> "-" <> showVersion compileTime
1315-
,"but project uses package"
1316-
, packageName <> "-" <> showVersion runTime
1317-
,"\nThis is unsupported, ghcide must be compiled with the same GHC installation as the project."
1318-
]
1319-
showPackageSetupException (PackageCheckFailed BasePackageAbiMismatch{..}) = unwords
1320-
["ghcide compiled with base-" <> showVersion compileTime <> "-" <> compileTimeAbi
1321-
,"but project uses base-" <> showVersion compileTime <> "-" <> runTimeAbi
1322-
,"\nThis is unsupported, ghcide must be compiled with the same GHC installation as the project."
1323-
]
13241311

13251312
renderPackageSetupException :: FilePath -> PackageSetupException -> (NormalizedFilePath, ShowDiagnostic, Diagnostic)
13261313
renderPackageSetupException fp e =

ghcide/session-loader/Development/IDE/Session/VersionCheck.hs

-15
This file was deleted.

0 commit comments

Comments
 (0)