@@ -86,6 +86,7 @@ import Control.Concurrent.STM.TVar
8686import Data.IntMap.Strict (IntMap )
8787import qualified Data.IntMap.Strict as IntMap
8888import Data.List
89+ import Data.List.Extra (nubOrdOn )
8990import qualified Data.Map as M
9091import Data.Maybe
9192import qualified Data.Text.Utf16.Rope as Rope
@@ -159,6 +160,9 @@ import qualified Data.IntMap as IM
159160import GHC.Unit.Module.Graph
160161import GHC.Unit.Env
161162#endif
163+ #if MIN_VERSION_ghc(9,2,0)
164+ import GHC (mgModSummaries )
165+ #endif
162166
163167data Log
164168= LogShake Shake. Log
@@ -792,10 +796,31 @@ ghcSessionDepsDefinition fullModSummary GhcSessionDepsConfig{..} env file = do
792796 depSessions <- map hscEnv <$> uses_ (GhcSessionDeps_ fullModSummary) deps
793797 ifaces <- uses_ GetModIface deps
794798let inLoadOrder = map (\ HiFileResult {.. } -> HomeModInfo hirModIface hirModDetails Nothing ) ifaces
795- mg <- depModuleGraph <$>
799+ mg <- do
796800if fullModuleGraph
797- then useNoFile_ GetModuleGraph
798- else dependencyInfoForFiles [file]
801+ then depModuleGraph <$> useNoFile_ GetModuleGraph
802+ else do
803+ let mgs = map hsc_mod_graph depSessions
804+ #if MIN_VERSION_ghc(9,3,0)
805+ -- On GHC 9.4+, the module graph contains not only ModSummary's but each `ModuleNode` in the graph
806+ -- also points to all the direct descendants of the current module. To get the keys for the descendants
807+ -- we must get their `ModSummary`s
808+ ! final_deps <- do
809+ dep_mss <- map msrModSummary <$> uses_ GetModSummaryWithoutTimestamps deps
810+ return $!! map (NodeKey_Module . msKey) dep_mss
811+ let module_graph_nodes =
812+ nubOrdOn mkNodeKey (ModuleNode final_deps ms : concatMap mgModSummaries' mgs)
813+ #else
814+ let module_graph_nodes =
815+ #if MIN_VERSION_ghc(9,2,0)
816+ -- We don't do any instantiation for backpack at this point of time, so it is OK to use
817+ -- 'extendModSummaryNoDeps'.
818+ -- This may have to change in the future.
819+ map extendModSummaryNoDeps $
820+ #endif
821+ nubOrdOn ms_mod (ms : concatMap mgModSummaries mgs)
822+ #endif
823+ pure $ mkModuleGraph module_graph_nodes
799824 session' <- liftIO $ mergeEnvs hsc mg ms inLoadOrder depSessions
800825
801826Just <$> liftIO (newHscEnvEqWithImportPaths (envImportPaths env) session' [] )
0 commit comments