content: {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE DeriveGeneric #-}
  
  module Distribution.Types.IncludeRenaming (
      IncludeRenaming(..),
      defaultIncludeRenaming,
      isDefaultIncludeRenaming,
  ) where
  
  import Prelude ()
  import Distribution.Compat.Prelude
  
  import Distribution.Types.ModuleRenaming
  
  import Distribution.Text
  
  import qualified Text.PrettyPrint as Disp
  import Text.PrettyPrint ((<+>), text)
  import Distribution.Compat.ReadP
  
  -- ---------------------------------------------------------------------------
  -- Module renaming
  
  -- | A renaming on an include: (provides renaming, requires renaming)
  data IncludeRenaming
      = IncludeRenaming {
          includeProvidesRn :: ModuleRenaming,
          includeRequiresRn :: ModuleRenaming
      }
      deriving (Show, Read, Eq, Ord, Typeable, Data, Generic)
  
  instance Binary IncludeRenaming
  
  -- | The 'defaultIncludeRenaming' applied when you only @build-depends@
  -- on a package.
  defaultIncludeRenaming :: IncludeRenaming
  defaultIncludeRenaming = IncludeRenaming defaultRenaming defaultRenaming
  
  -- | Is an 'IncludeRenaming' the default one?
  isDefaultIncludeRenaming :: IncludeRenaming -> Bool
  isDefaultIncludeRenaming (IncludeRenaming p r) = isDefaultRenaming p && isDefaultRenaming r
  
  instance Text IncludeRenaming where
      disp (IncludeRenaming prov_rn req_rn) =
          disp prov_rn
            <+> (if isDefaultRenaming req_rn
                  then Disp.empty
                  else text "requires" <+> disp req_rn)
      parse = do
          prov_rn <- parse
          req_rn <- (string "requires" >> skipSpaces >> parse) <++ return defaultRenaming
          -- Requirements don't really care if they're mentioned
          -- or not (since you can't thin a requirement.)  But
          -- we have a little hack in Configure to combine
          -- the provisions and requirements together before passing
          -- them to GHC, and so the most neutral choice for a requirement
          -- is for the "with" field to be False, so we correctly
          -- thin provisions.
          return (IncludeRenaming prov_rn req_rn)
  