{-# LANGUAGE RecordWildCards #-}

-- | Names used in code generation
--
-- Intended for unqualified.
module Data.Record.Anon.Internal.Plugin.Source.Names (
    -- * large-anon
    LargeAnonNames(..)
  , getLargeAnonNames
  ) where

import Data.Record.Anon.Internal.Plugin.Source.GhcShim
import Data.Record.Anon.Internal.Plugin.Source.Options (Mode(..))

{-------------------------------------------------------------------------------
  large-anon
-------------------------------------------------------------------------------}

-- | Named required for code generation
--
-- All names are expected to be exact.
data LargeAnonNames = LargeAnonNames {
      LargeAnonNames -> RdrName
largeAnon_empty        :: RdrName
    , LargeAnonNames -> RdrName
largeAnon_insert       :: RdrName
    , LargeAnonNames -> RdrName
largeAnon_applyPending :: RdrName
    , LargeAnonNames -> RdrName
largeAnon_letRecordT   :: RdrName
    , LargeAnonNames -> RdrName
largeAnon_letInsertAs  :: RdrName
    , LargeAnonNames -> RdrName
typelet_castEqual      :: RdrName
    }

getLargeAnonNames :: Mode -> Hsc LargeAnonNames
getLargeAnonNames :: Mode -> Hsc LargeAnonNames
getLargeAnonNames Mode
mode = do
    -- We avoid importing names from other packages; see detailed discussion
    -- in "Data.Record.Anon.Plugin.Internal.Runtime".
    RdrName
largeAnon_empty        <- Name -> RdrName
Exact (Name -> RdrName) -> Hsc Name -> Hsc RdrName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HasCallStack =>
ModuleName -> Maybe FastString -> String -> Hsc Name
ModuleName -> Maybe FastString -> String -> Hsc Name
lookupName ModuleName
modl Maybe FastString
forall a. Maybe a
Nothing String
"empty"
    RdrName
largeAnon_insert       <- Name -> RdrName
Exact (Name -> RdrName) -> Hsc Name -> Hsc RdrName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HasCallStack =>
ModuleName -> Maybe FastString -> String -> Hsc Name
ModuleName -> Maybe FastString -> String -> Hsc Name
lookupName ModuleName
modl Maybe FastString
forall a. Maybe a
Nothing String
"insert"
    RdrName
largeAnon_applyPending <- Name -> RdrName
Exact (Name -> RdrName) -> Hsc Name -> Hsc RdrName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HasCallStack =>
ModuleName -> Maybe FastString -> String -> Hsc Name
ModuleName -> Maybe FastString -> String -> Hsc Name
lookupName ModuleName
modl Maybe FastString
forall a. Maybe a
Nothing String
"applyPending"
    RdrName
largeAnon_letRecordT   <- Name -> RdrName
Exact (Name -> RdrName) -> Hsc Name -> Hsc RdrName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HasCallStack =>
ModuleName -> Maybe FastString -> String -> Hsc Name
ModuleName -> Maybe FastString -> String -> Hsc Name
lookupName ModuleName
modl Maybe FastString
forall a. Maybe a
Nothing String
"letRecordT"
    RdrName
largeAnon_letInsertAs  <- Name -> RdrName
Exact (Name -> RdrName) -> Hsc Name -> Hsc RdrName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HasCallStack =>
ModuleName -> Maybe FastString -> String -> Hsc Name
ModuleName -> Maybe FastString -> String -> Hsc Name
lookupName ModuleName
modl Maybe FastString
forall a. Maybe a
Nothing String
"letInsertAs"
    RdrName
typelet_castEqual      <- Name -> RdrName
Exact (Name -> RdrName) -> Hsc Name -> Hsc RdrName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HasCallStack =>
ModuleName -> Maybe FastString -> String -> Hsc Name
ModuleName -> Maybe FastString -> String -> Hsc Name
lookupName ModuleName
modl Maybe FastString
forall a. Maybe a
Nothing String
"castEqual"
    LargeAnonNames -> Hsc LargeAnonNames
forall a. a -> Hsc a
forall (m :: * -> *) a. Monad m => a -> m a
return LargeAnonNames{RdrName
largeAnon_empty :: RdrName
largeAnon_insert :: RdrName
largeAnon_applyPending :: RdrName
largeAnon_letRecordT :: RdrName
largeAnon_letInsertAs :: RdrName
typelet_castEqual :: RdrName
largeAnon_empty :: RdrName
largeAnon_insert :: RdrName
largeAnon_applyPending :: RdrName
largeAnon_letRecordT :: RdrName
largeAnon_letInsertAs :: RdrName
typelet_castEqual :: RdrName
..}
  where
    modl :: ModuleName
    modl :: ModuleName
modl = case Mode
mode of
             Mode
Simple   -> String -> ModuleName
mkModuleName String
"Data.Record.Anon.Simple"
             Mode
Advanced -> String -> ModuleName
mkModuleName String
"Data.Record.Anon.Advanced"