Skip to content

Commit 67aebc4

Browse files
committed
refactor loadSessionWithOptions to improve pending file handling and error management
1 parent 6e04d28 commit 67aebc4

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

ghcide/session-loader/Development/IDE/Session.hs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -625,17 +625,18 @@ loadSessionWithOptions recorder SessionLoadingOptions{..} rootDir que = do
625625
let progMsg = "Setting up " <> T.pack (takeBaseName (cradleRootDir cradle))
626626
<> " (for " <> T.pack lfpLog <> ")"
627627

628-
pendingFiles' <- Set.fromList <$> (atomically $ flushTQueue pendingFilesTQueue)
628+
pendingFiles <- Set.insert cfp . Set.fromList <$> (atomically $ flushTQueue pendingFilesTQueue)
629629
errorFiles <- readIORef error_loading_files
630-
-- remove error files from pending files since error loading need to load one by one
631-
let pendingFiles = pendingFiles' `Set.difference` errorFiles
630+
old_files <- readIORef cradle_files
632631
-- if the file is in error loading files, we fall back to single loading mode
633-
let extraToLoads = if cfp `Set.member` errorFiles then Set.empty else pendingFiles
632+
let extraToLoads = if cfp `Set.member` errorFiles
633+
then Set.empty
634+
-- remove error files from pending files since error loading need to load one by one
635+
else Set.delete cfp $ pendingFiles `Set.difference` errorFiles
634636

635637
eopts <- mRunLspTCallback lspEnv (\act -> withIndefiniteProgress progMsg Nothing NotCancellable (const act)) $
636638
withTrace "Load cradle" $ \addTag -> do
637639
addTag "file" lfpLog
638-
old_files <- readIORef cradle_files
639640
res <- cradleToOptsAndLibDir recorder (sessionLoading clientConfig) cradle cfp (Set.toList $ Set.delete cfp $ extraToLoads <> old_files)
640641
addTag "result" (show res)
641642
return res
@@ -654,22 +655,21 @@ loadSessionWithOptions recorder SessionLoadingOptions{..} rootDir que = do
654655
-- put back to pending que if not listed in the results
655656
-- delete cfp even if we report No cradle target found for the cfp
656657
let remainPendingFiles = Set.delete cfp $ pendingFiles `Set.difference` allNewLoaded
657-
let newLoadedT = pendingFiles `Set.intersection` allNewLoaded
658+
let newLoaded = pendingFiles `Set.intersection` allNewLoaded
658659
atomically $ forM_ remainPendingFiles (writeTQueue pendingFilesTQueue)
659660
-- log new loaded files
660-
logWith recorder Info $ LogSessionNewLoadedFiles $ Set.toList newLoadedT
661-
atomicModifyIORef' cradle_files (\xs -> (newLoadedT <> xs,()))
662-
-- remove the file from error loading files
661+
logWith recorder Info $ LogSessionNewLoadedFiles $ Set.toList newLoaded
662+
-- remove all new loaded file from error loading files
663663
atomicModifyIORef' error_loading_files (\old -> (old `Set.difference` allNewLoaded, ()))
664+
atomicModifyIORef' cradle_files (\xs -> (newLoaded <> xs,()))
664665
return results
665666
| otherwise -> return (([renderPackageSetupException cfp GhcVersionMismatch{..}], Nothing),[])
666667
-- Failure case, either a cradle error or the none cradle
667668
Left err -> do
668669
if (not $ null extraToLoads)
669670
then do
670-
succLoaded_files <- readIORef cradle_files
671671
-- mark as less loaded files as failedLoadingFiles as possible
672-
let failedLoadingFiles = (Set.insert cfp extraToLoads) `Set.difference` succLoaded_files
672+
let failedLoadingFiles = (Set.insert cfp extraToLoads) `Set.difference` old_files
673673
atomicModifyIORef' error_loading_files (\xs -> (failedLoadingFiles <> xs,()))
674674
-- retry without other files
675675
atomically $ forM_ pendingFiles (writeTQueue pendingFilesTQueue)

0 commit comments

Comments
 (0)