    module Data.GI.CodeGen.Constant
        ( genConstant
        ) where

    #if !MIN_VERSION_base(4,11,0)
    import Data.Monoid ((<>))
    #endif
    import Data.Text (Text)

    import Data.GI.CodeGen.API
    import Data.GI.CodeGen.Code
    import Data.GI.CodeGen.Conversions
    import Data.GI.CodeGen.Haddock (deprecatedPragma, writeDocumentation,
                                    RelativeDocPosition(..))
    import Data.GI.CodeGen.Type
    import Data.GI.CodeGen.Util (tshow, ucFirst)

    -- | Data for a bidrectional pattern synonym. It is either a simple
    -- one of the form "pattern Name = value :: Type" or an explicit one
    -- of the form
    -- > pattern Name <- (view -> value) :: Type where
    -- >    Name = expression value :: Type
    data PatternSynonym = SimpleSynonym PSValue PSType
                        | ExplicitSynonym PSView PSExpression PSValue PSType

    -- Some simple types for legibility
    type PSValue = Text
    type PSType = Text
    type PSView = Text
    type PSExpression = Text

    writePattern :: Text -> PatternSynonym -> CodeGen e ()
    writePattern :: forall e. Text -> PatternSynonym -> CodeGen e ()
    writePattern Text
    name (SimpleSynonym Text
    value Text
    t) = Text -> CodeGen e ()
    forall e. Text -> CodeGen e ()
    line (Text -> CodeGen e ()) -> Text -> CodeGen e ()
    forall a b. (a -> b) -> a -> b
    $
          Text
    "pattern " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text -> Text
    ucFirst Text
    name Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " = " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    value Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " :: " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    t
    writePattern Text
    name (ExplicitSynonym Text
    view Text
    expression Text
    value Text
    t) = do
      -- Supported only on ghc >= 7.10
      BaseVersion -> CodeGen e ()
    forall e. BaseVersion -> CodeGen e ()
    setModuleMinBase BaseVersion
    Base48
      Text -> CodeGen e ()
    forall e. Text -> CodeGen e ()
    line (Text -> CodeGen e ()) -> Text -> CodeGen e ()
    forall a b. (a -> b) -> a -> b
    $ Text
    "pattern " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text -> Text
    ucFirst Text
    name Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " <- (" Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    view Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " -> "
               Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    value Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    ") :: " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    t Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " where"
      CodeGen e () -> CodeGen e ()
    forall e a. CodeGen e a -> CodeGen e a
    indent (CodeGen e () -> CodeGen e ()) -> CodeGen e () -> CodeGen e ()
    forall a b. (a -> b) -> a -> b
    $ Text -> CodeGen e ()
    forall e. Text -> CodeGen e ()
    line (Text -> CodeGen e ()) -> Text -> CodeGen e ()
    forall a b. (a -> b) -> a -> b
    $
              Text -> Text
    ucFirst Text
    name Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " = " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    expression Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    value Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " :: " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    t

    genConstant :: Name -> Constant -> CodeGen e ()
    genConstant :: forall e. Name -> Constant -> CodeGen e ()
    genConstant (Name Text
    _ Text
    name) Constant
    c = CodeGen e () -> CodeGen e ()
    forall e a. CodeGen e a -> CodeGen e a
    group (CodeGen e () -> CodeGen e ()) -> CodeGen e () -> CodeGen e ()
    forall a b. (a -> b) -> a -> b
    $ do
      [Text] -> CodeGen e ()
    forall e. [Text] -> CodeGen e ()
    setLanguagePragmas [Text
    "PatternSynonyms", Text
    "ScopedTypeVariables", Text
    "ViewPatterns"]
      Text -> Maybe DeprecationInfo -> CodeGen e ()
    forall e. Text -> Maybe DeprecationInfo -> CodeGen e ()
    deprecatedPragma Text
    name (Constant -> Maybe DeprecationInfo
    constantDeprecated Constant
    c)

      (CGError -> CodeGen e ()) -> ExcCodeGen () -> CodeGen e ()
    forall e a. (CGError -> CodeGen e a) -> ExcCodeGen a -> CodeGen e a
    handleCGExc (\CGError
    e -> do
                      Text -> CodeGen e ()
    forall e. Text -> CodeGen e ()
    line (Text -> CodeGen e ()) -> Text -> CodeGen e ()
    forall a b. (a -> b) -> a -> b
    $ Text
    "-- XXX: Could not generate constant"
                      CGError -> CodeGen e ()
    forall e. CGError -> CodeGen e ()
    printCGError CGError
    e
                  )
        (do RelativeDocPosition -> Documentation -> ExcCodeGen ()
    forall e. RelativeDocPosition -> Documentation -> CodeGen e ()
    writeDocumentation RelativeDocPosition
    DocBeforeSymbol (Constant -> Documentation
    constantDocumentation Constant
    c)
            Text -> Type -> Text -> ExcCodeGen ()
    assignValue Text
    name (Constant -> Type
    constantType Constant
    c) (Constant -> Text
    constantValue Constant
    c)
            HaddockSection -> Text -> ExcCodeGen ()
    forall e. HaddockSection -> Text -> CodeGen e ()
    export HaddockSection
    ToplevelSection (Text
    "pattern " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text -> Text
    ucFirst Text
    name))

    -- | Assign to the given name the given constant value, in a way that
    -- can be assigned to the corresponding Haskell type.
    assignValue :: Text -> Type -> Text -> ExcCodeGen ()
    assignValue :: Text -> Type -> Text -> ExcCodeGen ()
    assignValue Text
    name t :: Type
    t@(TBasicType BasicType
    TPtr) Text
    value = do
      ht <- TypeRep -> Text
    typeShow (TypeRep -> Text)
    -> ReaderT
         CodeGenConfig
         (StateT (CGState, ModuleInfo) (Except CGError))
         TypeRep
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Type
    -> ReaderT
         CodeGenConfig
         (StateT (CGState, ModuleInfo) (Except CGError))
         TypeRep
    forall e. Type -> CodeGen e TypeRep
    haskellType Type
    t
      writePattern name (ExplicitSynonym "ptrToIntPtr" "intPtrToPtr" value ht)
    assignValue Text
    name t :: Type
    t@(TBasicType BasicType
    b) Text
    value = do
      ht <- TypeRep -> Text
    typeShow (TypeRep -> Text)
    -> ReaderT
         CodeGenConfig
         (StateT (CGState, ModuleInfo) (Except CGError))
         TypeRep
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Type
    -> ReaderT
         CodeGenConfig
         (StateT (CGState, ModuleInfo) (Except CGError))
         TypeRep
    forall e. Type -> CodeGen e TypeRep
    haskellType Type
    t
      hv <- showBasicType b value
      writePattern name (SimpleSynonym hv ht)
    assignValue Text
    name t :: Type
    t@(TInterface Name
    _) Text
    value = do
      ht <- TypeRep -> Text
    typeShow (TypeRep -> Text)
    -> ReaderT
         CodeGenConfig
         (StateT (CGState, ModuleInfo) (Except CGError))
         TypeRep
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> Type
    -> ReaderT
         CodeGenConfig
         (StateT (CGState, ModuleInfo) (Except CGError))
         TypeRep
    forall e. Type -> CodeGen e TypeRep
    haskellType Type
    t
      api <- findAPI t
      case api of
        Just (APIEnum Enumeration
    _) ->
            Text -> PatternSynonym -> ExcCodeGen ()
    forall e. Text -> PatternSynonym -> CodeGen e ()
    writePattern Text
    name (Text -> Text -> Text -> Text -> PatternSynonym
    ExplicitSynonym Text
    "fromEnum" Text
    "toEnum" Text
    value Text
    ht)
        Just (APIFlags Flags
    _) -> do
            -- gflagsToWord and wordToGFlags are polymorphic, so in this
            -- case we need to specialize so the type of the pattern is
            -- not ambiguous.
            let wordValue :: Text
    wordValue = Text
    "(" Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    value Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    " :: Word64)"
            Text -> PatternSynonym -> ExcCodeGen ()
    forall e. Text -> PatternSynonym -> CodeGen e ()
    writePattern Text
    name (Text -> Text -> Text -> Text -> PatternSynonym
    ExplicitSynonym Text
    "gflagsToWord" Text
    "wordToGFlags" Text
    wordValue Text
    ht)
        Maybe API
    _ -> Text -> ExcCodeGen ()
    forall a. Text -> ExcCodeGen a
    notImplementedError (Text -> ExcCodeGen ()) -> Text -> ExcCodeGen ()
    forall a b. (a -> b) -> a -> b
    $ Text
    "Don't know how to treat constants of type " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Type -> Text
    forall a. Show a => a -> Text
    tshow Type
    t
    assignValue Text
    _ Type
    t Text
    _ = Text -> ExcCodeGen ()
    forall a. Text -> ExcCodeGen a
    notImplementedError (Text -> ExcCodeGen ()) -> Text -> ExcCodeGen ()
    forall a b. (a -> b) -> a -> b
    $ Text
    "Don't know how to treat constants of type " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Type -> Text
    forall a. Show a => a -> Text
    tshow Type
    t

    -- | Show a basic type, in a way that can be assigned to the
    -- corresponding Haskell type.
    showBasicType                  :: BasicType -> Text -> ExcCodeGen Text
    showBasicType :: BasicType
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    showBasicType BasicType
    TInt     Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TUInt    Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TLong    Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TULong   Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TInt8    Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TUInt8   Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TInt16   Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TUInt16  Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TInt32   Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TUInt32  Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TInt64   Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TUInt64  Text
    i       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    i
    showBasicType BasicType
    TBoolean Text
    "0"     = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    "P.False"
    showBasicType BasicType
    TBoolean Text
    "false" = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    "P.False"
    showBasicType BasicType
    TBoolean Text
    "1"     = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    "P.True"
    showBasicType BasicType
    TBoolean Text
    "true"  = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    "P.True"
    showBasicType BasicType
    TBoolean Text
    b       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a. Text -> ExcCodeGen a
    notImplementedError (Text
     -> ReaderT
          CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text)
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a b. (a -> b) -> a -> b
    $ Text
    "Could not parse boolean \"" Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    b Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    "\""
    showBasicType BasicType
    TFloat   Text
    f       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    f
    showBasicType BasicType
    TDouble  Text
    d       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    d
    showBasicType BasicType
    TUTF8    Text
    s       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Text
     -> ReaderT
          CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text)
    -> (Text -> Text)
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Text -> Text
    forall a. Show a => a -> Text
    tshow (Text
     -> ReaderT
          CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text)
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a b. (a -> b) -> a -> b
    $ Text
    s
    showBasicType BasicType
    TFileName Text
    fn     = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Text
     -> ReaderT
          CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text)
    -> (Text -> Text)
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Text -> Text
    forall a. Show a => a -> Text
    tshow (Text
     -> ReaderT
          CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text)
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a b. (a -> b) -> a -> b
    $ Text
    fn
    showBasicType BasicType
    TUniChar Text
    c       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Text
     -> ReaderT
          CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text)
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a b. (a -> b) -> a -> b
    $ Text
    "'" Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    c Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    "'"
    showBasicType BasicType
    TGType   Text
    gtype   = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Text
     -> ReaderT
          CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text)
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a b. (a -> b) -> a -> b
    $ Text
    "GType " Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> Text
    gtype
    showBasicType BasicType
    TIntPtr  Text
    ptr     = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    ptr
    showBasicType BasicType
    TUIntPtr Text
    ptr     = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    ptr
    showBasicType BasicType
    TShort   Text
    s       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    s
    showBasicType BasicType
    TUShort  Text
    u       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    u
    showBasicType BasicType
    TSSize   Text
    s       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    s
    showBasicType BasicType
    TSize    Text
    s       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    s
    showBasicType BasicType
    Ttime_t  Text
    t       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    t
    showBasicType BasicType
    Toff_t   Text
    o       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    o
    showBasicType BasicType
    Tdev_t   Text
    d       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    d
    showBasicType BasicType
    Tgid_t   Text
    g       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    g
    showBasicType BasicType
    Tpid_t   Text
    p       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    p
    showBasicType BasicType
    Tsocklen_t Text
    l     = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    l
    showBasicType BasicType
    Tuid_t   Text
    u       = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a.
    a
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    u
    -- We take care of this one separately above
    showBasicType BasicType
    TPtr    Text
    _        = Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a. Text -> ExcCodeGen a
    notImplementedError (Text
     -> ReaderT
          CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text)
    -> Text
    -> ReaderT
         CodeGenConfig (StateT (CGState, ModuleInfo) (Except CGError)) Text
    forall a b. (a -> b) -> a -> b
    $ Text
    "Cannot directly show a pointer"