@@ -21,115 +21,115 @@ module Development.IDE.Session
21
21
-- building with ghc-lib we need to make this Haskell agnostic, so no hie-bios!
22
22
23
23
import Control.Concurrent.Strict
24
- import Control.Exception.Safe as Safe
24
+ import Control.Exception.Safe as Safe
25
25
import Control.Monad
26
- import Control.Monad.Extra as Extra
26
+ import Control.Monad.Extra as Extra
27
27
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 )
30
30
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
33
33
import Data.Default
34
34
import Data.Either.Extra
35
35
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
38
38
import Data.IORef
39
39
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
44
44
import Data.Maybe
45
45
import Data.Proxy
46
- import qualified Data.Text as T
46
+ import qualified Data.Text as T
47
47
import Data.Time.Clock
48
48
import Data.Version
49
49
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
53
53
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 )
60
60
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
64
63
import Development.IDE.Types.Diagnostics
65
64
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 )
68
67
import Development.IDE.Types.Location
69
68
import Development.IDE.Types.Options
70
- import GHC.Check
71
69
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 )
85
83
import Language.LSP.Protocol.Message
86
84
import Language.LSP.Server
87
85
import System.Directory
88
- import qualified System.Directory.Extra as IO
86
+ import qualified System.Directory.Extra as IO
89
87
import System.FilePath
90
88
import System.Info
91
89
92
- import Control.Applicative (Alternative ((<|>) ))
90
+ import Control.Applicative (Alternative ((<|>) ))
93
91
import Data.Void
94
92
95
- import Control.Concurrent.STM.Stats (atomically , modifyTVar' ,
96
- readTVar , writeTVar )
93
+ import Control.Concurrent.STM.Stats (atomically , modifyTVar' ,
94
+ readTVar , writeTVar )
97
95
import Control.Concurrent.STM.TQueue
98
96
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
106
104
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 )
114
112
import HieDb.Create
115
113
import HieDb.Types
116
114
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
+
120
120
121
121
-- See Note [Guidelines For Using CPP In GHCIDE Import Statements]
122
122
123
123
#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
126
126
import GHC.Data.Graph.Directed
127
127
128
128
import GHC.Data.Bag
129
- import GHC.Driver.Env (hsc_all_home_unit_ids )
129
+ import GHC.Driver.Env (hsc_all_home_unit_ids )
130
130
import GHC.Driver.Errors.Types
131
- import GHC.Types.Error (errMsgDiagnostic ,
132
- singleMessage )
131
+ import GHC.Types.Error (errMsgDiagnostic ,
132
+ singleMessage )
133
133
import GHC.Unit.State
134
134
#endif
135
135
@@ -147,7 +147,7 @@ data Log
147
147
| LogDLLLoadError ! String
148
148
| LogCradlePath ! FilePath
149
149
| LogCradleNotFound ! FilePath
150
- | LogSessionLoadingResult ! (Either [CradleError ] (ComponentOptions , FilePath ))
150
+ | LogSessionLoadingResult ! (Either [CradleError ] (ComponentOptions , FilePath , String ))
151
151
| LogCradle ! (Cradle Void )
152
152
| LogNoneCradleFound FilePath
153
153
| LogNewComponentCache ! (([FileDiagnostic ], Maybe HscEnvEq ), DependencyInfo )
@@ -654,16 +654,15 @@ loadSessionWithOptions recorder SessionLoadingOptions{..} rootDir que = do
654
654
case eopts of
655
655
-- The cradle gave us some options so get to work turning them
656
656
-- 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 ),[] )
667
666
-- Failure case, either a cradle error or the none cradle
668
667
Left err -> do
669
668
dep_info <- getDependencyInfo (maybeToList hieYaml)
@@ -743,7 +742,7 @@ loadSessionWithOptions recorder SessionLoadingOptions{..} rootDir que = do
743
742
-- This then builds dependencies or whatever based on the cradle, gets the
744
743
-- GHC options/dynflags needed for the session and the GHC library directory
745
744
cradleToOptsAndLibDir :: Recorder (WithPriority Log ) -> SessionLoadingPreferenceConfig -> Cradle Void -> FilePath -> [FilePath ]
746
- -> IO (Either [CradleError ] (ComponentOptions , FilePath ))
745
+ -> IO (Either [CradleError ] (ComponentOptions , FilePath , String ))
747
746
cradleToOptsAndLibDir recorder loadConfig cradle file old_fps = do
748
747
-- let noneCradleFoundMessage :: FilePath -> T.Text
749
748
-- noneCradleFoundMessage f = T.pack $ "none cradle found for " <> f <> ", ignoring the file"
@@ -754,9 +753,10 @@ cradleToOptsAndLibDir recorder loadConfig cradle file old_fps = do
754
753
CradleSuccess r -> do
755
754
-- Now get the GHC lib dir
756
755
libDirRes <- getRuntimeGhcLibDir cradle
757
- case libDirRes of
756
+ versionRes <- getRuntimeGhcVersion cradle
757
+ case liftA2 (,) libDirRes versionRes of
758
758
-- This is the successful path
759
- CradleSuccess libDir -> pure (Right (r, libDir))
759
+ ( CradleSuccess ( libDir, version)) -> pure (Right (r, libDir, version ))
760
760
CradleFail err -> return (Left [err])
761
761
CradleNone -> do
762
762
logWith recorder Info $ LogNoneCradleFound file
@@ -1286,7 +1286,6 @@ data PackageSetupException
1286
1286
{ compileTime :: ! Version
1287
1287
, runTime :: ! Version
1288
1288
}
1289
- | PackageCheckFailed ! NotCompatibleReason
1290
1289
deriving (Eq , Show , Typeable )
1291
1290
1292
1291
instance Exception PackageSetupException
@@ -1306,21 +1305,9 @@ showPackageSetupException GhcVersionMismatch{..} = unwords
1306
1305
," \n This is unsupported, ghcide must be compiled with the same GHC version as the project."
1307
1306
]
1308
1307
showPackageSetupException PackageSetupException {.. } = unwords
1309
- [ " ghcide compiled by GHC" , showVersion compilerVersion
1308
+ [ " ghcide compiled by GHC" , showVersion fullCompilerVersion
1310
1309
, " failed to load packages:" , message <> " ."
1311
1310
, " \n Please 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
- ," \n This 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
- ," \n This is unsupported, ghcide must be compiled with the same GHC installation as the project."
1323
- ]
1324
1311
1325
1312
renderPackageSetupException :: FilePath -> PackageSetupException -> (NormalizedFilePath , ShowDiagnostic , Diagnostic )
1326
1313
renderPackageSetupException fp e =
0 commit comments