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_ ,
@@ -508,8 +509,7 @@ shakeOpen lspEnv defaultConfig logger debouncer
508
509
opts { shakeExtra = newShakeExtra shakeExtras }
509
510
rules
510
511
shakeDb <- shakeDbM
511
- initSession <- newSession shakeExtras shakeDb []
512
- shakeSession <- newMVar initSession
512
+ shakeSession <- newEmptyMVar
513
513
shakeDatabaseProfile <- shakeDatabaseProfileIO shakeProfileDir
514
514
let ideState = IdeState {.. }
515
515
@@ -608,6 +608,12 @@ shakeOpen lspEnv defaultConfig logger debouncer
608
608
}
609
609
loop id next
610
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
+
611
617
shakeProfile :: IdeState -> FilePath -> IO ()
612
618
shakeProfile IdeState {.. } = shakeProfileDatabase shakeDb
613
619
0 commit comments