2323-- always stored as real Haskell values, whereas Shake serialises all 'A' values
2424-- between runs. To deserialise a Shake value, we just consult Values.
2525module Development.IDE.Core.Shake (
26- IdeState , shakeExtras ,
26+ IdeState , shakeSessionInit , shakeExtras ,
2727 ShakeExtras (.. ), getShakeExtras , getShakeExtrasRules ,
2828 KnownTargets , Target (.. ), toKnownFiles ,
2929 IdeRule , IdeResult ,
@@ -32,6 +32,7 @@ module Development.IDE.Core.Shake(
3232 shakeRestart ,
3333 shakeEnqueue ,
3434 shakeProfile ,
35+ newSession ,
3536 use , useNoFile , uses , useWithStaleFast , useWithStaleFast' , delayedAction ,
3637 FastResult (.. ),
3738 use_ , useNoFile_ , uses_ ,
@@ -110,6 +111,11 @@ import Development.IDE.Core.Tracing
110111import Development.IDE.GHC.Compat (NameCacheUpdater (.. ),
111112 upNameCache )
112113import Development.IDE.GHC.Orphans ()
114+ import Development.IDE.Graph hiding (ShakeValue )
115+ import qualified Development.IDE.Graph as Shake
116+ import Development.IDE.Graph.Classes
117+ import Development.IDE.Graph.Database
118+ import Development.IDE.Graph.Rule
113119import Development.IDE.Types.Action
114120import Development.IDE.Types.Diagnostics
115121import Development.IDE.Types.Exports
@@ -119,11 +125,6 @@ import Development.IDE.Types.Logger hiding (Priority)
119125import qualified Development.IDE.Types.Logger as Logger
120126import Development.IDE.Types.Options
121127import Development.IDE.Types.Shake
122- import Development.IDE.Graph hiding (ShakeValue )
123- import qualified Development.IDE.Graph as Shake
124- import Development.IDE.Graph.Classes
125- import Development.IDE.Graph.Database
126- import Development.IDE.Graph.Rule
127128import GHC.Generics
128129import Language.LSP.Diagnostics
129130import qualified Language.LSP.Server as LSP
@@ -187,8 +188,6 @@ data ShakeExtras = ShakeExtras
187188 ,progressUpdate :: ProgressEvent -> IO ()
188189 ,ideTesting :: IdeTesting
189190 -- ^ Whether to enable additional lsp messages used by the test suite for checking invariants
190- ,session :: MVar ShakeSession
191- -- ^ Used in the GhcSession rule to forcefully restart the session after adding a new component
192191 ,restartShakeSession :: [DelayedAction () ] -> IO ()
193192 ,ideNc :: IORef NameCache
194193 -- | A mapping of module name to known target (or candidate targets, if missing)
@@ -488,7 +487,6 @@ shakeOpen lspEnv defaultConfig logger debouncer
488487 positionMapping <- newVar HMap. empty
489488 knownTargetsVar <- newVar $ hashed HMap. empty
490489 let restartShakeSession = shakeRestart ideState
491- let session = shakeSession
492490 mostRecentProgressEvent <- newTVarIO KickCompleted
493491 persistentKeys <- newVar HMap. empty
494492 let progressUpdate = atomically . writeTVar mostRecentProgressEvent
@@ -511,8 +509,7 @@ shakeOpen lspEnv defaultConfig logger debouncer
511509 opts { shakeExtra = newShakeExtra shakeExtras }
512510 rules
513511 shakeDb <- shakeDbM
514- initSession <- newSession shakeExtras shakeDb []
515- shakeSession <- newMVar initSession
512+ shakeSession <- newEmptyMVar
516513 shakeDatabaseProfile <- shakeDatabaseProfileIO shakeProfileDir
517514 let ideState = IdeState {.. }
518515
@@ -611,6 +608,12 @@ shakeOpen lspEnv defaultConfig logger debouncer
611608 }
612609 loop id next
613610
611+ -- | Must be called in the 'Initialized' handler and only once
612+ shakeSessionInit :: IdeState -> IO ()
613+ shakeSessionInit IdeState {.. } = do
614+ initSession <- newSession shakeExtras shakeDb []
615+ putMVar shakeSession initSession
616+
614617shakeProfile :: IdeState -> FilePath -> IO ()
615618shakeProfile IdeState {.. } = shakeProfileDatabase shakeDb
616619
0 commit comments