Skip to content

Commit 20b4304

Browse files
committed
add ProgressReportingNoTrace
1 parent 124691f commit 20b4304

File tree

3 files changed

+68
-47
lines changed

3 files changed

+68
-47
lines changed

ghcide/src/Development/IDE/Core/Compile.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ import Data.Tuple.Extra (dupe)
7171
import Debug.Trace
7272
import Development.IDE.Core.FileStore (resetInterfaceStore)
7373
import Development.IDE.Core.Preprocessor
74-
import Development.IDE.Core.ProgressReporting (ProgressReporting (..))
74+
import Development.IDE.Core.ProgressReporting (ProgressReporting (..),
75+
progressReportingNoTrace, progressUpdate)
7576
import Development.IDE.Core.RuleTypes
7677
import Development.IDE.Core.Shake
7778
import Development.IDE.Core.Tracing (withTrace)

ghcide/src/Development/IDE/Core/ProgressReporting.hs

Lines changed: 64 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
1+
{-# LANGUAGE ScopedTypeVariables #-}
2+
{-# LANGUAGE TypeFamilies #-}
3+
14
module Development.IDE.Core.ProgressReporting
25
( ProgressEvent (..),
36
ProgressReporting (..),
7+
ProgressReportingNoTrace,
48
noProgressReporting,
59
progressReporting,
6-
progressReportingOutsideState,
10+
progressReportingNoTrace,
711
-- utilities, reexported for use in Core.Shake
812
mRunLspT,
913
mRunLspTCallback,
1014
-- for tests
1115
recordProgress,
1216
InProgressState (..),
17+
progressStop,
18+
progressUpdate
1319
)
1420
where
1521

@@ -42,15 +48,37 @@ data ProgressEvent
4248
| ProgressCompleted
4349
| ProgressStarted
4450

45-
data ProgressReporting m = ProgressReporting
46-
{ progressUpdate :: ProgressEvent -> m (),
47-
inProgress :: forall a. NormalizedFilePath -> m a -> m a,
48-
-- ^ see Note [ProgressReporting API and InProgressState]
49-
progressStop :: IO ()
51+
data ProgressReportingNoTrace m = ProgressReportingNoTrace
52+
{ progressUpdateI :: ProgressEvent -> m (),
53+
progressStopI :: IO ()
5054
-- ^ we are using IO here because creating and stopping the `ProgressReporting`
5155
-- is different from how we use it.
5256
}
5357

58+
data ProgressReporting m = ProgressReporting
59+
{
60+
inProgress :: forall a. NormalizedFilePath -> m a -> m a,
61+
-- ^ see Note [ProgressReporting API and InProgressState]
62+
progressReportingInner :: ProgressReportingNoTrace m
63+
}
64+
65+
66+
class ProgressReportingClass a where
67+
type M a :: * -> *
68+
progressUpdate :: a -> ProgressEvent -> M a ()
69+
progressStop :: a -> IO ()
70+
71+
instance ProgressReportingClass (ProgressReportingNoTrace m) where
72+
type M (ProgressReportingNoTrace m) = m
73+
progressUpdate = progressUpdateI
74+
progressStop = progressStopI
75+
76+
instance ProgressReportingClass (ProgressReporting m) where
77+
type M (ProgressReporting m) = m
78+
progressUpdate :: ProgressReporting m -> ProgressEvent -> M (ProgressReporting m) ()
79+
progressUpdate = progressUpdateI . progressReportingInner
80+
progressStop = progressStopI . progressReportingInner
81+
5482
{- Note [ProgressReporting API and InProgressState]
5583
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5684
The progress of tasks can be tracked in two ways:
@@ -67,13 +95,17 @@ An alternative design could involve using GADTs to eliminate this discrepancy be
6795
`InProgressState` and `InProgressStateOutSide`.
6896
-}
6997

98+
noProgressReportingNoTrace :: (MonadUnliftIO m) => (ProgressReportingNoTrace m)
99+
noProgressReportingNoTrace = ProgressReportingNoTrace
100+
{ progressUpdateI = const $ pure (),
101+
progressStopI = pure ()
102+
}
70103
noProgressReporting :: (MonadUnliftIO m) => IO (ProgressReporting m)
71104
noProgressReporting =
72105
return $
73106
ProgressReporting
74-
{ progressUpdate = const $ pure (),
75-
inProgress = const id,
76-
progressStop = pure ()
107+
{ inProgress = const id,
108+
progressReportingInner = noProgressReportingNoTrace
77109
}
78110

79111
-- | State used in 'delayedProgressReporting'
@@ -106,19 +138,12 @@ data InProgressState
106138
doneVar :: TVar Int,
107139
currentVar :: STM.Map NormalizedFilePath Int
108140
}
109-
| InProgressStateOutSide
110-
-- we transform the outside state into STM Int for progress reporting purposes
111-
{ -- | Number of files to do
112-
todo :: STM Int,
113-
-- | Number of files done
114-
done :: STM Int
115-
}
141+
116142

117143
newInProgress :: IO InProgressState
118144
newInProgress = InProgressState <$> newTVarIO 0 <*> newTVarIO 0 <*> STM.newIO
119145

120146
recordProgress :: InProgressState -> NormalizedFilePath -> (Int -> Int) -> IO ()
121-
recordProgress InProgressStateOutSide {} _ _ = return ()
122147
recordProgress InProgressState {..} file shift = do
123148
(prev, new) <- atomicallyNamed "recordProgress" $ STM.focus alterPrevAndNew file currentVar
124149
atomicallyNamed "recordProgress2" $ do
@@ -138,50 +163,45 @@ recordProgress InProgressState {..} file shift = do
138163
alter x = let x' = maybe (shift 0) shift x in Just x'
139164

140165

141-
-- | `progressReporting` initiates a new progress reporting session.
142-
-- It necessitates the active tracking of progress using the `inProgress` function.
143-
-- Refer to Note [ProgressReporting API and InProgressState] for more details.
144-
progressReporting ::
145-
(MonadUnliftIO m, MonadIO m) =>
146-
Maybe (LSP.LanguageContextEnv c) ->
147-
T.Text ->
148-
ProgressReportingStyle ->
149-
IO (ProgressReporting m)
150-
progressReporting = progressReporting' newInProgress
151-
152-
-- | `progressReportingOutsideState` initiates a new progress reporting session.
166+
-- | `progressReportingNoTrace` initiates a new progress reporting session.
153167
-- It functions similarly to `progressReporting`, but it utilizes an external state for progress tracking.
154168
-- Refer to Note [ProgressReporting API and InProgressState] for more details.
155-
progressReportingOutsideState ::
169+
progressReportingNoTrace ::
156170
(MonadUnliftIO m, MonadIO m) =>
157171
STM Int ->
158172
STM Int ->
159173
Maybe (LSP.LanguageContextEnv c) ->
160174
T.Text ->
161175
ProgressReportingStyle ->
162-
IO (ProgressReporting m)
163-
progressReportingOutsideState todo done = progressReporting' (pure $ InProgressStateOutSide todo done)
176+
IO (ProgressReportingNoTrace m)
177+
progressReportingNoTrace _ _ Nothing _title _optProgressStyle = return noProgressReportingNoTrace
178+
progressReportingNoTrace todo done (Just lspEnv) title optProgressStyle = do
179+
progressState <- newVar NotStarted
180+
let progressUpdateI event = liftIO $ updateStateVar $ Event event
181+
progressStopI = updateStateVar StopProgress
182+
updateStateVar = modifyVar_ progressState . updateState (progressCounter lspEnv title optProgressStyle todo done)
183+
return ProgressReportingNoTrace {..}
164184

165-
progressReporting' ::
185+
-- | `progressReporting` initiates a new progress reporting session.
186+
-- It necessitates the active tracking of progress using the `inProgress` function.
187+
-- Refer to Note [ProgressReporting API and InProgressState] for more details.
188+
progressReporting ::
189+
forall c m.
166190
(MonadUnliftIO m, MonadIO m) =>
167-
IO InProgressState ->
168191
Maybe (LSP.LanguageContextEnv c) ->
169192
T.Text ->
170193
ProgressReportingStyle ->
171194
IO (ProgressReporting m)
172-
progressReporting' _newState Nothing _title _optProgressStyle = noProgressReporting
173-
progressReporting' newState (Just lspEnv) title optProgressStyle = do
174-
inProgressState <- newState
175-
progressState <- newVar NotStarted
176-
let progressUpdate event = liftIO $ updateStateVar $ Event event
177-
progressStop = updateStateVar StopProgress
178-
updateStateVar = modifyVar_ progressState . updateState (lspShakeProgressNew inProgressState)
195+
progressReporting Nothing _title _optProgressStyle = noProgressReporting
196+
progressReporting (Just lspEnv) title optProgressStyle = do
197+
inProgressState <- newInProgress
198+
progressReportingInner <- progressReportingNoTrace (readTVar $ todoVar inProgressState)
199+
(readTVar $ doneVar inProgressState) (Just lspEnv) title optProgressStyle
200+
let
201+
inProgress :: forall a. NormalizedFilePath -> m a -> m a
179202
inProgress = updateStateForFile inProgressState
180203
return ProgressReporting {..}
181204
where
182-
lspShakeProgressNew :: InProgressState -> IO ()
183-
lspShakeProgressNew InProgressStateOutSide {..} = progressCounter lspEnv title optProgressStyle todo done
184-
lspShakeProgressNew InProgressState {..} = progressCounter lspEnv title optProgressStyle (readTVar todoVar) (readTVar doneVar)
185205
updateStateForFile inProgress file = UnliftIO.bracket (liftIO $ f succ) (const $ liftIO $ f pred) . const
186206
where
187207
-- This functions are deliberately eta-expanded to avoid space leaks.

ghcide/src/Development/IDE/Core/Shake.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ data HieDbWriter
244244
{ indexQueue :: IndexQueue
245245
, indexPending :: TVar (HMap.HashMap NormalizedFilePath Fingerprint) -- ^ Avoid unnecessary/out of date indexing
246246
, indexCompleted :: TVar Int -- ^ to report progress
247-
, indexProgressReporting :: ProgressReporting IO
247+
, indexProgressReporting :: ProgressReportingNoTrace IO
248248
}
249249

250250
-- | Actions to queue up on the index worker thread
@@ -676,7 +676,7 @@ shakeOpen recorder lspEnv defaultConfig idePlugins debouncer
676676
indexPending <- newTVarIO HMap.empty
677677
indexCompleted <- newTVarIO 0
678678
semanticTokensId <- newTVarIO 0
679-
indexProgressReporting <- progressReportingOutsideState
679+
indexProgressReporting <- progressReportingNoTrace
680680
(liftM2 (+) (length <$> readTVar indexPending) (readTVar indexCompleted))
681681
(readTVar indexCompleted)
682682
lspEnv "Indexing" optProgressStyle

0 commit comments

Comments
 (0)