GHC/Types/Target.hs

    module GHC.Types.Target
       ( Target(..)
       , TargetId(..)
       , InputFileBuffer
       , pprTarget
       , pprTargetId
       )
    where

    import GHC.Prelude
    import GHC.Driver.Phases ( Phase )
    import GHC.Unit
    import GHC.Data.StringBuffer ( StringBuffer )
    import GHC.Utils.Outputable

    import Data.Time

    -- | A compilation target.
    --
    -- A target may be supplied with the actual text of the
    -- module.  If so, use this instead of the file contents (this
    -- is for use in an IDE where the file hasn't been saved by
    -- the user yet).
    data Target
      = Target {
          targetId           :: TargetId, -- ^ module or filename
          targetAllowObjCode :: Bool,     -- ^ object code allowed?
          targetContents     :: Maybe (InputFileBuffer, UTCTime)
          -- ^ Optional in-memory buffer containing the source code GHC should
          -- use for this target instead of reading it from disk.
          --
          -- Since GHC version 8.10 modules which require preprocessors such as
          -- Literate Haskell or CPP to run are also supported.
          --
          -- If a corresponding source file does not exist on disk this will
          -- result in a 'SourceError' exception if @targetId = TargetModule _@
          -- is used. However together with @targetId = TargetFile _@ GHC will
          -- not complain about the file missing.
        }

    data TargetId
      = TargetModule ModuleName
            -- ^ A module name: search for the file
      | TargetFile FilePath (Maybe Phase)
            -- ^ A filename: preprocess & parse it to find the module name.
            -- If specified, the Phase indicates how to compile this file
            -- (which phase to start from).  Nothing indicates the starting phase
            -- should be determined from the suffix of the filename.
      deriving Eq

    type InputFileBuffer = StringBuffer

    pprTarget :: Target -> SDoc
    pprTarget (Target id obj _) =
        (if obj then empty else char '*') <> pprTargetId id

    instance Outputable Target where
        ppr = pprTarget

    pprTargetId :: TargetId -> SDoc
    pprTargetId (TargetModule m) = ppr m
    pprTargetId (TargetFile f _) = text f

    instance Outputable TargetId where
        ppr = pprTargetId