@@ -86,6 +86,7 @@ import Control.Concurrent.STM.TVar
86
86
import Data.IntMap.Strict (IntMap )
87
87
import qualified Data.IntMap.Strict as IntMap
88
88
import Data.List
89
+ import Data.List.Extra (nubOrdOn )
89
90
import qualified Data.Map as M
90
91
import Data.Maybe
91
92
import qualified Data.Text.Utf16.Rope as Rope
@@ -159,6 +160,9 @@ import qualified Data.IntMap as IM
159
160
import GHC.Unit.Module.Graph
160
161
import GHC.Unit.Env
161
162
#endif
163
+ #if MIN_VERSION_ghc(9,2,0)
164
+ import GHC (mgModSummaries )
165
+ #endif
162
166
163
167
data Log
164
168
= LogShake Shake. Log
@@ -792,10 +796,31 @@ ghcSessionDepsDefinition fullModSummary GhcSessionDepsConfig{..} env file = do
792
796
depSessions <- map hscEnv <$> uses_ (GhcSessionDeps_ fullModSummary) deps
793
797
ifaces <- uses_ GetModIface deps
794
798
let inLoadOrder = map (\ HiFileResult {.. } -> HomeModInfo hirModIface hirModDetails Nothing ) ifaces
795
- mg <- depModuleGraph <$>
799
+ mg <- do
796
800
if 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
799
824
session' <- liftIO $ mergeEnvs hsc mg ms inLoadOrder depSessions
800
825
801
826
Just <$> liftIO (newHscEnvEqWithImportPaths (envImportPaths env) session' [] )
0 commit comments