Skip to content

Commit e08f070

Browse files
committed
keep track of visited keys in refreshDeps
1 parent 0e73a5c commit e08f070

File tree

1 file changed

+7
-6
lines changed
  • hls-graph/src/Development/IDE/Graph/Internal

1 file changed

+7
-6
lines changed

hls-graph/src/Development/IDE/Graph/Internal/Database.hs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,23 +136,24 @@ builder db@Database{..} stack keys = withRunInIO $ \(RunInIO run) -> do
136136
isDirty :: Foldable t => Result -> t (a, Result) -> Bool
137137
isDirty me = any (\(_,dep) -> resultBuilt me < resultChanged dep)
138138

139-
refreshDeps :: Database -> Stack -> Key -> Result -> [KeySet] -> AIO (IO Result)
140-
refreshDeps db stack key result = \case
139+
refreshDeps :: KeySet -> Database -> Stack -> Key -> Result -> [KeySet] -> AIO (IO Result)
140+
refreshDeps visited db stack key result = \case
141141
-- no more deps to refresh
142142
[] -> pure $ compute db stack key RunDependenciesSame (Just result)
143143
(dep:deps) -> do
144-
res <- builder db stack (toListKeySet dep)
144+
let newVisited = dep <> visited
145+
res <- builder db stack (toListKeySet (dep `differenceKeySet` visited))
145146
case res of
146147
Left res -> if isDirty result res
147148
-- restart the computation if any of the deps are dirty
148149
then asyncWithCleanUp $ liftIO $ compute db stack key RunDependenciesChanged (Just result)
149150
-- else kick the rest of the deps
150-
else refreshDeps db stack key result deps
151+
else refreshDeps newVisited db stack key result deps
151152
Right iores -> asyncWithCleanUp $ liftIO $ do
152153
res <- iores
153154
if isDirty result res
154155
then compute db stack key RunDependenciesChanged (Just result)
155-
else join $ runAIO $ refreshDeps db stack key result deps
156+
else join $ runAIO $ refreshDeps newVisited db stack key result deps
156157

157158
-- | Refresh a key:
158159
-- * If no dirty dependencies and we have evaluated the key previously, then we refresh it in the current thread.
@@ -162,7 +163,7 @@ refresh :: Database -> Stack -> Key -> Maybe Result -> AIO (IO Result)
162163
-- refresh _ st k _ | traceShow ("refresh", st, k) False = undefined
163164
refresh db stack key result = case (addStack key stack, result) of
164165
(Left e, _) -> throw e
165-
(Right stack, Just me@Result{resultDeps = ResultDeps deps}) -> refreshDeps db stack key me (reverse deps)
166+
(Right stack, Just me@Result{resultDeps = ResultDeps deps}) -> refreshDeps mempty db stack key me (reverse deps)
166167
(Right stack, _) ->
167168
asyncWithCleanUp $ liftIO $ compute db stack key RunDependenciesChanged result
168169

0 commit comments

Comments
 (0)