@@ -625,17 +625,18 @@ loadSessionWithOptions recorder SessionLoadingOptions{..} rootDir que = do
625
625
let progMsg = " Setting up " <> T. pack (takeBaseName (cradleRootDir cradle))
626
626
<> " (for " <> T. pack lfpLog <> " )"
627
627
628
- pendingFiles' <- Set. fromList <$> (atomically $ flushTQueue pendingFilesTQueue)
628
+ pendingFiles <- Set. insert cfp . Set. fromList <$> (atomically $ flushTQueue pendingFilesTQueue)
629
629
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
632
631
-- 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
634
636
635
637
eopts <- mRunLspTCallback lspEnv (\ act -> withIndefiniteProgress progMsg Nothing NotCancellable (const act)) $
636
638
withTrace " Load cradle" $ \ addTag -> do
637
639
addTag " file" lfpLog
638
- old_files <- readIORef cradle_files
639
640
res <- cradleToOptsAndLibDir recorder (sessionLoading clientConfig) cradle cfp (Set. toList $ Set. delete cfp $ extraToLoads <> old_files)
640
641
addTag " result" (show res)
641
642
return res
@@ -654,22 +655,21 @@ loadSessionWithOptions recorder SessionLoadingOptions{..} rootDir que = do
654
655
-- put back to pending que if not listed in the results
655
656
-- delete cfp even if we report No cradle target found for the cfp
656
657
let remainPendingFiles = Set. delete cfp $ pendingFiles `Set.difference` allNewLoaded
657
- let newLoadedT = pendingFiles `Set.intersection` allNewLoaded
658
+ let newLoaded = pendingFiles `Set.intersection` allNewLoaded
658
659
atomically $ forM_ remainPendingFiles (writeTQueue pendingFilesTQueue)
659
660
-- 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
663
663
atomicModifyIORef' error_loading_files (\ old -> (old `Set.difference` allNewLoaded, () ))
664
+ atomicModifyIORef' cradle_files (\ xs -> (newLoaded <> xs,() ))
664
665
return results
665
666
| otherwise -> return (([renderPackageSetupException cfp GhcVersionMismatch {.. }], Nothing ),[] )
666
667
-- Failure case, either a cradle error or the none cradle
667
668
Left err -> do
668
669
if (not $ null extraToLoads)
669
670
then do
670
- succLoaded_files <- readIORef cradle_files
671
671
-- 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
673
673
atomicModifyIORef' error_loading_files (\ xs -> (failedLoadingFiles <> xs,() ))
674
674
-- retry without other files
675
675
atomically $ forM_ pendingFiles (writeTQueue pendingFilesTQueue)
0 commit comments