23
23
-- always stored as real Haskell values, whereas Shake serialises all 'A' values
24
24
-- between runs. To deserialise a Shake value, we just consult Values.
25
25
module Development.IDE.Core.Shake (
26
- IdeState , shakeExtras ,
26
+ IdeState , shakeSessionInit , shakeExtras ,
27
27
ShakeExtras (.. ), getShakeExtras , getShakeExtrasRules ,
28
28
KnownTargets , Target (.. ), toKnownFiles ,
29
29
IdeRule , IdeResult ,
@@ -32,6 +32,7 @@ module Development.IDE.Core.Shake(
32
32
shakeRestart ,
33
33
shakeEnqueue ,
34
34
shakeProfile ,
35
+ newSession ,
35
36
use , useNoFile , uses , useWithStaleFast , useWithStaleFast' , delayedAction ,
36
37
FastResult (.. ),
37
38
use_ , useNoFile_ , uses_ ,
@@ -110,6 +111,11 @@ import Development.IDE.Core.Tracing
110
111
import Development.IDE.GHC.Compat (NameCacheUpdater (.. ),
111
112
upNameCache )
112
113
import 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
113
119
import Development.IDE.Types.Action
114
120
import Development.IDE.Types.Diagnostics
115
121
import Development.IDE.Types.Exports
@@ -119,11 +125,6 @@ import Development.IDE.Types.Logger hiding (Priority)
119
125
import qualified Development.IDE.Types.Logger as Logger
120
126
import Development.IDE.Types.Options
121
127
import 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
127
128
import GHC.Generics
128
129
import Language.LSP.Diagnostics
129
130
import qualified Language.LSP.Server as LSP
@@ -187,8 +188,6 @@ data ShakeExtras = ShakeExtras
187
188
,progressUpdate :: ProgressEvent -> IO ()
188
189
,ideTesting :: IdeTesting
189
190
-- ^ 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
192
191
,restartShakeSession :: [DelayedAction () ] -> IO ()
193
192
,ideNc :: IORef NameCache
194
193
-- | A mapping of module name to known target (or candidate targets, if missing)
@@ -488,7 +487,6 @@ shakeOpen lspEnv defaultConfig logger debouncer
488
487
positionMapping <- newVar HMap. empty
489
488
knownTargetsVar <- newVar $ hashed HMap. empty
490
489
let restartShakeSession = shakeRestart ideState
491
- let session = shakeSession
492
490
mostRecentProgressEvent <- newTVarIO KickCompleted
493
491
persistentKeys <- newVar HMap. empty
494
492
let progressUpdate = atomically . writeTVar mostRecentProgressEvent
@@ -511,8 +509,7 @@ shakeOpen lspEnv defaultConfig logger debouncer
511
509
opts { shakeExtra = newShakeExtra shakeExtras }
512
510
rules
513
511
shakeDb <- shakeDbM
514
- initSession <- newSession shakeExtras shakeDb []
515
- shakeSession <- newMVar initSession
512
+ shakeSession <- newEmptyMVar
516
513
shakeDatabaseProfile <- shakeDatabaseProfileIO shakeProfileDir
517
514
let ideState = IdeState {.. }
518
515
@@ -611,6 +608,12 @@ shakeOpen lspEnv defaultConfig logger debouncer
611
608
}
612
609
loop id next
613
610
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
+
614
617
shakeProfile :: IdeState -> FilePath -> IO ()
615
618
shakeProfile IdeState {.. } = shakeProfileDatabase shakeDb
616
619
0 commit comments