packages feed

ghc-9.14.1: GHC/Types/PkgQual.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE LambdaCase #-}

module GHC.Types.PkgQual where

import GHC.Prelude
import GHC.Types.SourceText
import GHC.Unit.Types
import GHC.Utils.Binary
import GHC.Utils.Outputable

import Data.Data

-- | Package-qualifier as it was parsed
data RawPkgQual
  = NoRawPkgQual             -- ^ No package qualifier
  | RawPkgQual StringLiteral -- ^ Raw package qualifier string.
  deriving (Data)

-- | Package-qualifier after renaming
--
-- Renaming detects if "this" or the unit-id of the home-unit was used as a
-- package qualifier.
data PkgQual
  = NoPkgQual       -- ^ No package qualifier
  | ThisPkg  !UnitId -- ^ Import from home-unit
  | OtherPkg !UnitId -- ^ Import from another unit
  deriving (Data, Ord, Eq)

instance Outputable RawPkgQual where
  ppr = \case
    NoRawPkgQual -> empty
    RawPkgQual (StringLiteral st p _)
      -> pprWithSourceText st (doubleQuotes (ftext p))

instance Outputable PkgQual where
  ppr = \case
    NoPkgQual  -> empty
    ThisPkg u  -> doubleQuotes (ppr u)
    OtherPkg u -> doubleQuotes (ppr u)

instance Binary PkgQual where
  put_ bh NoPkgQual    = putByte bh 0
  put_ bh (ThisPkg u)  = do
    putByte bh 1
    put_ bh u
  put_ bh (OtherPkg u) = do
    putByte bh 2
    put_ bh u

  get bh = do
    tag <- getByte bh
    case tag of
      0 -> return NoPkgQual
      1 -> do u <- get bh
              return (ThisPkg u)
      2 -> do u <- get bh
              return (OtherPkg u)
      _ -> fail "instance Binary PkgQual: Invalid tag"