@@ -22,6 +22,7 @@ import Data.Foldable (for_)
22
22
import Data.Functor (($>) )
23
23
import qualified Data.HashMap.Strict as HMap
24
24
import qualified Data.Text as T
25
+ import Data.Tuple.Extra (dupe )
25
26
import Data.Unique
26
27
import Development.IDE.GHC.Orphans ()
27
28
import Development.IDE.Graph hiding (ShakeValue )
@@ -31,7 +32,7 @@ import qualified Language.LSP.Server as LSP
31
32
import Language.LSP.Types
32
33
import qualified Language.LSP.Types as LSP
33
34
import System.Time.Extra
34
- import UnliftIO.Exception (bracket_ )
35
+ import UnliftIO.Exception (bracket_ , evaluate )
35
36
36
37
data ProgressEvent
37
38
= KickStarted
@@ -100,11 +101,11 @@ delayedProgressReporting
100
101
-> ProgressReportingStyle
101
102
-> IO ProgressReporting
102
103
delayedProgressReporting before after lspEnv optProgressStyle = do
103
- inProgressVar <- newVar $ InProgress 0 0 mempty
104
- progressState <- newVar NotStarted
104
+ inProgressVar <- newMVar $ InProgress 0 0 mempty
105
+ progressState <- newMVar NotStarted
105
106
let progressUpdate event = updateStateVar $ Event event
106
107
progressStop = updateStateVar StopProgress
107
- updateStateVar = modifyVar_ progressState . updateState (mRunLspT lspEnv $ lspShakeProgress inProgressVar)
108
+ updateStateVar = modifyMVar_ progressState . updateState (mRunLspT lspEnv $ lspShakeProgress inProgressVar)
108
109
109
110
inProgress :: NormalizedFilePath -> Action a -> Action a
110
111
inProgress = withProgressVar inProgressVar
@@ -116,10 +117,10 @@ delayedProgressReporting before after lspEnv optProgressStyle = do
116
117
liftIO $ sleep before
117
118
u <- ProgressTextToken . T. pack . show . hashUnique <$> liftIO newUnique
118
119
119
- b <- liftIO newBarrier
120
+ b <- liftIO newEmptyMVar
120
121
void $ LSP. sendRequest LSP. SWindowWorkDoneProgressCreate
121
- LSP. WorkDoneProgressCreateParams { _token = u } $ liftIO . signalBarrier b
122
- ready <- liftIO $ waitBarrier b
122
+ LSP. WorkDoneProgressCreateParams { _token = u } $ liftIO . putMVar b
123
+ ready <- liftIO $ takeMVar b
123
124
124
125
for_ ready $ const $ bracket_ (start u) (stop u) (loop u 0 )
125
126
where
@@ -143,7 +144,7 @@ delayedProgressReporting before after lspEnv optProgressStyle = do
143
144
loop _ _ | optProgressStyle == NoProgress =
144
145
forever $ liftIO $ threadDelay maxBound
145
146
loop id prev = do
146
- InProgress {.. } <- liftIO $ readVar inProgress
147
+ InProgress {.. } <- liftIO $ readMVar inProgress
147
148
liftIO $ sleep after
148
149
if todo == 0 then loop id 0 else do
149
150
let next = 100 * fromIntegral done / fromIntegral todo
@@ -171,7 +172,7 @@ delayedProgressReporting before after lspEnv optProgressStyle = do
171
172
-- Do not remove the eta-expansion without profiling a session with at
172
173
-- least 1000 modifications.
173
174
where
174
- f shift = modifyVar' var $ recordProgress file shift
175
+ f shift = modifyMVar var $ evaluate . dupe . recordProgress file shift
175
176
176
177
mRunLspT :: Applicative m => Maybe (LSP. LanguageContextEnv c ) -> LSP. LspT c m () -> m ()
177
178
mRunLspT (Just lspEnv) f = LSP. runLspT lspEnv f
0 commit comments