content: module GHC.Unit.Module.Status
     ( HscBackendAction(..), HscRecompStatus (..)
     )
  where
  
  import GHC.Prelude
  
  import GHC.Unit
  import GHC.Unit.Module.ModGuts
  import GHC.Unit.Module.ModIface
  
  import GHC.Utils.Fingerprint
  import GHC.Utils.Outputable
  import GHC.Unit.Home.ModInfo
  
  -- | Status of a module in incremental compilation
  data HscRecompStatus
      -- | Nothing to do because code already exists.
      = HscUpToDate ModIface HomeModLinkable
      -- | Recompilation of module, or update of interface is required. Optionally
      -- pass the old interface hash to avoid updating the existing interface when
      -- it has not changed.
      | HscRecompNeeded (Maybe Fingerprint)
  
  -- | Action to perform in backend compilation
  data HscBackendAction
      -- | Update the boot and signature file results.
      = HscUpdate ModIface
      -- | Recompile this module.
      | HscRecomp
          { hscs_guts           :: CgGuts
            -- ^ Information for the code generator.
          , hscs_mod_location   :: !ModLocation
            -- ^ Module info
          , hscs_partial_iface  :: !PartialModIface
            -- ^ Partial interface
          , hscs_old_iface_hash :: !(Maybe Fingerprint)
            -- ^ Old interface hash for this compilation, if an old interface file
            -- exists. Pass to `hscMaybeWriteIface` when writing the interface to
            -- avoid updating the existing interface when the interface isn't
            -- changed.
          }
  
  instance Outputable HscRecompStatus where
    ppr HscUpToDate{} = text "HscUpToDate"
    ppr HscRecompNeeded{} = text "HscRecompNeeded"
  
  instance Outputable HscBackendAction where
    ppr (HscUpdate mi) = text "Update:" <+> (ppr (mi_module mi))
    ppr (HscRecomp _ ml _mi _mf) = text "Recomp:" <+> ppr ml
  