@@ -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