{-# LANGUAGE CPP #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-- OPTIONS_GHC -ddump-splices #-}

module Demangler.PPrint () where

import           Control.Applicative
import           Data.Char
import           Data.List.NonEmpty ( NonEmpty((:|)) )
import qualified Data.List.NonEmpty as NEL
import           Data.Text ( Text )
import qualified Data.Text as T
import           Text.Sayable

import           Demangler.Context
import           Demangler.Engine
import           Demangler.Structure


#ifdef MIN_VERSION_panic
import           Panic

-- Debug function to cause a Panic with -fdebug builds, or return a placeholder
-- in non-debug mode.  This is usually used for unfinished portions of the
-- output, to provide a useful panic when in development mode but to avoid
-- crashing in normal mode.  Note that the demangling process uses a similar
-- function to fail the parse; here, the parse has completed and we are simply
-- generating output, so we don't have the option to "revert" to the original.
-- Instead, emitting invalid output (without failing) is the most useful
-- operation, since the valid form of that output is not currently
-- known/implemented.
cannotSay :: PanicComponent a => a -> String -> [String] -> b
cannotSay = panic
#else
cannotSay :: a -> String -> [String] -> Saying saytag
cannotSay :: forall a (saytag :: Symbol).
a -> String -> [String] -> Saying saytag
cannotSay a
_ String
_ [String]
rsn = Text -> Text
t'Text
"OUTFMT?:{ " Text -> [String] -> Saying saytag
forall (tag :: Symbol) m e (t :: * -> *).
(Sayable tag m, Sayable tag e, Foldable t) =>
m -> t e -> Saying tag
&* [String]
rsn Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'}'
#endif


data PrefixUQN = PUC Prefix UnqualifiedName
data PrefixCDtor = PCDC Prefix CtorDtor

$(return [])

ctxLst :: forall saytag t a b .
          Sayable saytag (WithContext a)
       => Functor t
       => Foldable t
       => t a -> WithContext b -> Saying saytag
ctxLst :: forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst t a
l WithContext b
wc = Text -> Text
t'Text
"" Text -> t (WithContext a) -> Saying saytag
forall (tag :: Symbol) m e (t :: * -> *).
(Sayable tag m, Sayable tag e, Foldable t) =>
m -> t e -> Saying tag
&+* t a -> WithContext b -> t (WithContext a)
forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx t a
l WithContext b
wc

ctxLst' :: Sayable saytag (WithContext a)
        => Functor t
        => Foldable t
        => t a -> WithContext b -> Text -> Saying saytag
ctxLst' :: forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' t a
l WithContext b
wc Text
sep = Text
sep Text -> t (WithContext a) -> Saying saytag
forall (tag :: Symbol) m e (t :: * -> *).
(Sayable tag m, Sayable tag e, Foldable t) =>
m -> t e -> Saying tag
&:* t a -> WithContext b -> t (WithContext a)
forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx t a
l WithContext b
wc

wCtx :: Functor t => t a -> WithContext b -> t (WithContext a)
wCtx :: forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx t a
a WithContext b
wc = WithContext b -> a -> WithContext a
forall a b. WithContext a -> b -> WithContext b
withContext WithContext b
wc (a -> WithContext a) -> t a -> t (WithContext a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> t a
a


----------------------------------------------------------------------
-- Sayable instances for printing demangled results

instance {-# OVERLAPPING #-}
  ( Sayable "diagnostic" (WithContext Encoding)
  ) => Sayable "diagnostic" Result where
  sayable :: Result -> Saying "diagnostic"
sayable = \case
    (Original Coord
i, Context
c) -> WithContext () -> Coord -> Text
forall a. WithContext a -> Coord -> Text
contextStr (() -> Context -> WithContext ()
forall a. a -> Context -> WithContext a
addContext () Context
c) Coord
i Text -> Text -> Saying "diagnostic"
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"{orig}"
    (Encoded Encoding
e, Context
c) -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @"diagnostic" (WithContext Encoding -> Saying "diagnostic")
-> WithContext Encoding -> Saying "diagnostic"
forall a b. (a -> b) -> a -> b
$ Encoding -> Context -> WithContext Encoding
forall a. a -> Context -> WithContext a
addContext Encoding
e Context
c
    (VendorExtended Encoding
d Coord
i, Context
c) ->
      let (Text
s1,Text
s2) = (Char -> Bool) -> Text -> (Text, Text)
T.span Char -> Bool
isAlphaNum (Text -> (Text, Text)) -> Text -> (Text, Text)
forall a b. (a -> b) -> a -> b
$ WithContext () -> Coord -> Text
forall a. WithContext a -> Coord -> Text
contextStr (() -> Context -> WithContext ()
forall a. a -> Context -> WithContext a
addContext () Context
c) Coord
i
      in Encoding -> Context -> WithContext Encoding
forall a. a -> Context -> WithContext a
addContext Encoding
d Context
c WithContext Encoding -> Text -> Saying "diagnostic"
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"[clone" Saying "diagnostic" -> Text -> Saying "diagnostic"
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text
s1 Saying "diagnostic" -> Char -> Saying "diagnostic"
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
']' Saying "diagnostic" -> Text -> Saying "diagnostic"
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text
s2

instance {-# OVERLAPPABLE #-}
  ( Sayable saytag (WithContext Encoding)
  ) => Sayable saytag Result where
  sayable :: Result -> Saying saytag
sayable = \case
    (Original Coord
i, Context
c) -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext () -> Coord -> Text
forall a. WithContext a -> Coord -> Text
contextStr (() -> Context -> WithContext ()
forall a. a -> Context -> WithContext a
addContext () Context
c) Coord
i
    (Encoded Encoding
e, Context
c) -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Encoding -> Saying saytag)
-> WithContext Encoding -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Encoding -> Context -> WithContext Encoding
forall a. a -> Context -> WithContext a
addContext Encoding
e Context
c
    (VendorExtended Encoding
d Coord
i, Context
c) ->
      let (Text
s1,Text
s2) = (Char -> Bool) -> Text -> (Text, Text)
T.span Char -> Bool
isAlphaNum (Text -> (Text, Text)) -> Text -> (Text, Text)
forall a b. (a -> b) -> a -> b
$ WithContext () -> Coord -> Text
forall a. WithContext a -> Coord -> Text
contextStr (() -> Context -> WithContext ()
forall a. a -> Context -> WithContext a
addContext () Context
c) Coord
i
      in Encoding -> Context -> WithContext Encoding
forall a. a -> Context -> WithContext a
addContext Encoding
d Context
c WithContext Encoding -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"[clone" Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'.' Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text
s1 Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
']' Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text
s2

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''Encoding
  ) => Sayable saytag (WithContext Encoding) where
  sayable :: WithContext Encoding -> Saying saytag
sayable WithContext Encoding
wc =
    case WithContext Encoding -> Encoding
forall a. WithContext a -> a
contextData WithContext Encoding
wc of
      -- Note: if the function has only a single void argument, print "()"
      -- instead of "(void)"; these are semantically the same, but demangling
      -- emits the former.
      --
      -- Another tricky part is that the FunctionName may contain qualifiers
      -- (esp. "const") but for a function these must be placed at the end,
      -- following the arguments.
      --
      -- Additionally, if this function is being printed as part of a template
      -- argument, then do not print the arguments.  This conforms to GCC c++filt
      -- output, although llvm-cxxfilt *does* print the arguments, however, the
      -- testing oracle is c++filt.
      EncFunc FunctionName
f Maybe Type_
rty (BaseType BaseType
Void :| []) -> WithContext Encoding
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
forall (saytag :: Symbol) a.
Sayable saytag (WithContext Type_) =>
WithContext a
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
sayFunction WithContext Encoding
wc FunctionName
f Maybe Type_
rty []
      EncFunc FunctionName
f Maybe Type_
rty NonEmpty Type_
t -> WithContext Encoding
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
forall (saytag :: Symbol) a.
Sayable saytag (WithContext Type_) =>
WithContext a
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
sayFunction WithContext Encoding
wc FunctionName
f Maybe Type_
rty ([Type_] -> Saying saytag) -> [Type_] -> Saying saytag
forall a b. (a -> b) -> a -> b
$ NonEmpty Type_ -> [Type_]
forall a. NonEmpty a -> [a]
NEL.toList NonEmpty Type_
t
      -- n.b. static functions don't have any visible difference in demangled
      -- form.
      EncStaticFunc FunctionName
f Maybe Type_
rty (BaseType BaseType
Void :| []) -> WithContext Encoding
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
forall (saytag :: Symbol) a.
Sayable saytag (WithContext Type_) =>
WithContext a
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
sayFunction WithContext Encoding
wc FunctionName
f Maybe Type_
rty []
      EncStaticFunc FunctionName
f Maybe Type_
rty NonEmpty Type_
t -> WithContext Encoding
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
forall (saytag :: Symbol) a.
Sayable saytag (WithContext Type_) =>
WithContext a
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
sayFunction WithContext Encoding
wc FunctionName
f Maybe Type_
rty ([Type_] -> Saying saytag) -> [Type_] -> Saying saytag
forall a b. (a -> b) -> a -> b
$ NonEmpty Type_ -> [Type_]
forall a. NonEmpty a -> [a]
NEL.toList NonEmpty Type_
t
      EncConstStructData UnqualifiedName
nm -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext UnqualifiedName -> Saying saytag)
-> WithContext UnqualifiedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Encoding
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Encoding
wc UnqualifiedName
nm
      EncData Name
nm -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Name -> Saying saytag)
-> WithContext Name -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Encoding -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Encoding
wc Name
nm
      EncSpecial SpecialName
sn -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext SpecialName -> Saying saytag)
-> WithContext SpecialName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Encoding -> SpecialName -> WithContext SpecialName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Encoding
wc SpecialName
sn

sayFunction :: Sayable saytag (WithContext Type_)
            => WithContext a -> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
sayFunction :: forall (saytag :: Symbol) a.
Sayable saytag (WithContext Type_) =>
WithContext a
-> FunctionName -> Maybe Type_ -> [Type_] -> Saying saytag
sayFunction WithContext a
wc FunctionName
fn Maybe Type_
mbRet [Type_]
args =
  let (Name
nm,[CVQualifier]
q) = FunctionName -> (Name, [CVQualifier])
cleanFunctionName FunctionName
fn
      part1 :: Saying saytag
part1 = case Maybe Type_
mbRet of
                Maybe Type_
Nothing -> WithContext a -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext a
wc Name
nm WithContext Name -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
""
                Just Type_
rty -> WithContext a -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext a
wc Type_
rty WithContext Type_ -> WithContext Name -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext a -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext a
wc Name
nm
      part2 :: Saying saytag
part2 = if WithContext a -> Bool
forall a. WithContext a -> Bool
isTemplateArgContext WithContext a
wc
              then Saying saytag
part1
              else Saying saytag
part1 Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [Type_] -> WithContext a -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [Type_]
args WithContext a
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
  in if [CVQualifier] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [CVQualifier]
q then Saying saytag
part2 else Saying saytag
part2 Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- [CVQualifier] -> WithContext a -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [CVQualifier]
q WithContext a
wc Text
" "

instance Sayable saytag (WithContext a)
  => Sayable saytag (NonEmpty (WithContext a)) where
  sayable :: NonEmpty (WithContext a) -> Saying saytag
sayable NonEmpty (WithContext a)
l = Text -> Text
t'Text
"" Text -> NonEmpty (WithContext a) -> Saying saytag
forall (tag :: Symbol) m e (t :: * -> *).
(Sayable tag m, Sayable tag e, Foldable t) =>
m -> t e -> Saying tag
&+* NonEmpty (WithContext a)
l

instance {-# OVERLAPPABLE #-} Sayable saytag (WithContext a)
  => Sayable saytag (WithContext (NonEmpty a)) where
  sayable :: WithContext (NonEmpty a) -> Saying saytag
sayable WithContext (NonEmpty a)
wc = NonEmpty a -> WithContext (NonEmpty a) -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst (WithContext (NonEmpty a) -> NonEmpty a
forall a. WithContext a -> a
contextData WithContext (NonEmpty a)
wc) WithContext (NonEmpty a)
wc

cleanFunctionName :: FunctionName -> (Name, [CVQualifier])
cleanFunctionName :: FunctionName -> (Name, [CVQualifier])
cleanFunctionName (FunctionName Name
nm) =
  case Name
nm of
    NameNested (NestedName Prefix
p UnqualifiedName
u [CVQualifier]
cvq Maybe RefQualifier
mbrq) ->
      (NestedName -> Name
NameNested (NestedName -> Name) -> NestedName -> Name
forall a b. (a -> b) -> a -> b
$ Prefix
-> UnqualifiedName
-> [CVQualifier]
-> Maybe RefQualifier
-> NestedName
NestedName Prefix
p UnqualifiedName
u [] Maybe RefQualifier
mbrq, [CVQualifier]
cvq)
    NameNested (NestedTemplateName TemplatePrefix
tp TemplateArgs
ta [CVQualifier]
cvq Maybe RefQualifier
mbrq) ->
      (NestedName -> Name
NameNested (NestedName -> Name) -> NestedName -> Name
forall a b. (a -> b) -> a -> b
$ TemplatePrefix
-> TemplateArgs
-> [CVQualifier]
-> Maybe RefQualifier
-> NestedName
NestedTemplateName TemplatePrefix
tp TemplateArgs
ta [] Maybe RefQualifier
mbrq, [CVQualifier]
cvq)
    Name
_ -> (Name
nm, [])

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''SpecialName
  ) => Sayable saytag (WithContext SpecialName) where
  sayable :: WithContext SpecialName -> Saying saytag
sayable WithContext SpecialName
wc =
    case WithContext SpecialName -> SpecialName
forall a. WithContext a -> a
contextData WithContext SpecialName
wc of
      VirtualTable Type_
ty -> Text -> Text
t'Text
"vtable for" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SpecialName -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SpecialName
wc Type_
ty
      TemplateParameterObj TemplateArg
ta -> Text -> Text
t'Text
"template parameter object for" Text -> WithContext TemplateArg -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SpecialName -> TemplateArg -> WithContext TemplateArg
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SpecialName
wc TemplateArg
ta
      VTT Type_
ty -> Text -> Text
t'Text
"VTT for" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SpecialName -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SpecialName
wc Type_
ty
      TypeInfo Type_
ty -> Text -> Text
t'Text
"typeinfo for" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SpecialName -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SpecialName
wc Type_
ty
      TypeInfoName Type_
ty -> Text -> Text
t'Text
"typeinfo name for" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SpecialName -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SpecialName
wc Type_
ty
      CtorVTable ()
_ -> Text -> Text
t'Text
"construction vtable for" Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"()"
      Thunk (VirtualOffset Coord
_o1 Coord
_o2) Encoding
enc -> Text -> Text
t'Text
"virtual thunk to" Text -> WithContext Encoding -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SpecialName -> Encoding -> WithContext Encoding
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SpecialName
wc Encoding
enc
      Thunk (NonVirtualOffset Coord
_o1) Encoding
enc -> Text -> Text
t'Text
"non-virtual thunk to" Text -> WithContext Encoding -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SpecialName -> Encoding -> WithContext Encoding
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SpecialName
wc Encoding
enc


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''FunctionName
  ) => Sayable saytag (WithContext FunctionName) where
  sayable :: WithContext FunctionName -> Saying saytag
sayable WithContext FunctionName
wc = let FunctionName Name
n = WithContext FunctionName -> FunctionName
forall a. WithContext a -> a
contextData WithContext FunctionName
wc
               in forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Name -> Saying saytag)
-> WithContext Name -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext FunctionName -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext FunctionName
wc Name
n


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''Name
  ) => Sayable saytag (WithContext Name) where
  sayable :: WithContext Name -> Saying saytag
sayable WithContext Name
wc =
    case WithContext Name -> Name
forall a. WithContext a -> a
contextData WithContext Name
wc of
      NameNested NestedName
nn -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext NestedName -> Saying saytag)
-> WithContext NestedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Name -> NestedName -> WithContext NestedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Name
wc NestedName
nn
      UnscopedName UnscopedName
usn -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext UnscopedName -> Saying saytag)
-> WithContext UnscopedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Name -> UnscopedName -> WithContext UnscopedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Name
wc UnscopedName
usn
      UnscopedTemplateName Name
nn TemplateArgs
ta -> WithContext Name -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Name
wc Name
nn WithContext Name -> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Name -> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Name
wc TemplateArgs
ta
      LocalName Encoding
fs Name
fe Maybe Discriminator
_discr -> WithContext Name -> Encoding -> WithContext Encoding
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Name
wc Encoding
fs WithContext Encoding -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::" Saying saytag -> WithContext Name -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Name -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Name
wc Name
fe -- Discriminators are invisible in demangled form
      StringLitName Encoding
fs Maybe Discriminator
_discr -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Encoding -> Saying saytag)
-> WithContext Encoding -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Name -> Encoding -> WithContext Encoding
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Name
wc Encoding
fs  -- Discriminators are invisible in demangled form


-- Note: this should never actually be used, but the sayableConstraints template
-- haskell production doesn't know that.
instance Sayable saytag Discriminator where
  sayable :: Discriminator -> Saying saytag
sayable Discriminator
_ = forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
""
instance Sayable saytag (WithContext Discriminator) where
  sayable :: WithContext Discriminator -> Saying saytag
sayable WithContext Discriminator
_ = forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
""

instance {--# OVERLAPPABLE #-}
  $(sayableConstraints ''UnscopedName
   ) =>  Sayable saytag (WithContext UnscopedName) where
  sayable :: WithContext UnscopedName -> Saying saytag
sayable WithContext UnscopedName
wc =
    case WithContext UnscopedName -> UnscopedName
forall a. WithContext a -> a
contextData WithContext UnscopedName
wc of
      UnScName Bool
False UnqualifiedName
uqn -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext UnqualifiedName -> Saying saytag)
-> WithContext UnqualifiedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnscopedName
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnscopedName
wc UnqualifiedName
uqn
      UnScName Bool
True UnqualifiedName
uqn -> Text -> Text
t'Text
"std::" Text -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnscopedName
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnscopedName
wc UnqualifiedName
uqn
      UnScSubst Substitution
subs -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Substitution -> Saying saytag)
-> WithContext Substitution -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnscopedName
-> Substitution -> WithContext Substitution
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnscopedName
wc Substitution
subs


instance {-# OVERLAPPABLE #-} Sayable saytag (WithContext Coord) where
  sayable :: WithContext Coord -> Saying saytag
sayable WithContext Coord
wc = forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Coord -> Coord -> Text
forall a. WithContext a -> Coord -> Text
contextStr WithContext Coord
wc (Coord -> Text) -> Coord -> Text
forall a b. (a -> b) -> a -> b
$ WithContext Coord -> Coord
forall a. WithContext a -> a
contextData WithContext Coord
wc


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''UnqualifiedName
  ) =>  Sayable saytag (WithContext UnqualifiedName) where
  sayable :: WithContext UnqualifiedName -> Saying saytag
sayable WithContext UnqualifiedName
wc =
    case WithContext UnqualifiedName -> UnqualifiedName
forall a. WithContext a -> a
contextData WithContext UnqualifiedName
wc of
      SourceName SourceName
i [] -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext SourceName -> Saying saytag)
-> WithContext SourceName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnqualifiedName -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnqualifiedName
wc SourceName
i
      SourceName SourceName
i [ABI_Tag]
tags -> WithContext UnqualifiedName -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnqualifiedName
wc SourceName
i WithContext SourceName -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [ABI_Tag] -> WithContext UnqualifiedName -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [ABI_Tag]
tags WithContext UnqualifiedName
wc Text
""
      OperatorName Operator
op [] -> Text -> Text
t'Text
"operator" Text -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnqualifiedName -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnqualifiedName
wc Operator
op
      OperatorName Operator
op [ABI_Tag]
tags -> Text -> Text
t'Text
"operator" Text -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnqualifiedName -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnqualifiedName
wc Operator
op Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [ABI_Tag] -> WithContext UnqualifiedName -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [ABI_Tag]
tags WithContext UnqualifiedName
wc Text
""
      CtorDtorName CtorDtor
cd -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext CtorDtor -> Saying saytag)
-> WithContext CtorDtor -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnqualifiedName -> CtorDtor -> WithContext CtorDtor
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnqualifiedName
wc CtorDtor
cd
      StdSubst Substitution
subs -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Substitution -> Saying saytag)
-> WithContext Substitution -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnqualifiedName
-> Substitution -> WithContext Substitution
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnqualifiedName
wc Substitution
subs
      ModuleNamed [ModuleName]
mn UnqualifiedName
uqn -> [ModuleName]
-> WithContext UnqualifiedName -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [ModuleName]
mn WithContext UnqualifiedName
wc Text
"" Saying saytag -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnqualifiedName
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnqualifiedName
wc UnqualifiedName
uqn
      -- GCC c++filt style:
      UnnamedTypeName Maybe Natural
Nothing -> Text -> Text
t'Text
"{unnamed type#1" Text -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'}'
      UnnamedTypeName (Just Natural
nt) -> Text -> Text
t'Text
"{unnamed type#" Text -> Natural -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Natural
nt Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
+ Natural
2 Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'}'
      -- llvm-cxxfilt style:
      -- UnnamedTypeName Nothing -> t'"'unnamed" &+ '\''
      -- UnnamedTypeName (Just nt) -> t'"'unnamed" &+ nt &+ '\''


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''SourceName
   ) => Sayable saytag (WithContext SourceName) where
  sayable :: WithContext SourceName -> Saying saytag
sayable WithContext SourceName
wc = let SrcName Coord
i = WithContext SourceName -> SourceName
forall a. WithContext a -> a
contextData WithContext SourceName
wc in forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext SourceName -> Coord -> Text
forall a. WithContext a -> Coord -> Text
contextStr WithContext SourceName
wc Coord
i


instance {-# OVERLAPPABLE #-}
  ($(sayableConstraints ''PrefixUQN)
  , Sayable saytag (WithContext PrefixCDtor)
  ) =>  Sayable saytag (WithContext PrefixUQN) where
  sayable :: WithContext PrefixUQN -> Saying saytag
sayable WithContext PrefixUQN
wc =
    let PUC Prefix
p UnqualifiedName
n = WithContext PrefixUQN -> PrefixUQN
forall a. WithContext a -> a
contextData WithContext PrefixUQN
wc in
    case UnqualifiedName
n of
      CtorDtorName CtorDtor
cd -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext PrefixCDtor -> Saying saytag)
-> WithContext PrefixCDtor -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext PrefixUQN -> PrefixCDtor -> WithContext PrefixCDtor
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixUQN
wc (Prefix -> CtorDtor -> PrefixCDtor
PCDC Prefix
p CtorDtor
cd)
      UnqualifiedName
_ -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext UnqualifiedName -> Saying saytag)
-> WithContext UnqualifiedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext PrefixUQN
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixUQN
wc UnqualifiedName
n

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''ModuleName
  ) => Sayable saytag (WithContext ModuleName) where
  sayable :: WithContext ModuleName -> Saying saytag
sayable WithContext ModuleName
wc =
    let ModuleName Bool
isP SourceName
sn = WithContext ModuleName -> ModuleName
forall a. WithContext a -> a
contextData WithContext ModuleName
wc
    in if Bool
isP then WithContext ModuleName -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ModuleName
wc SourceName
sn WithContext SourceName -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
':' else WithContext ModuleName -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ModuleName
wc SourceName
sn WithContext SourceName -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'.'

{- | Use Sayable (Prefix, CtorDtor, Context) instead, since CtorDtor needs to
   reproduce Prefix name. -}
instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''CtorDtor
   ) =>  Sayable saytag (WithContext CtorDtor) where
  sayable :: WithContext CtorDtor -> Saying saytag
sayable WithContext CtorDtor
wc =
    case WithContext CtorDtor -> CtorDtor
forall a. WithContext a -> a
contextData WithContext CtorDtor
wc of
      CtorDtor
CompleteCtor -> Char
'(' Char -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      CtorDtor
BaseCtor -> Char
'(' Char -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      CtorDtor
CompleteAllocatingCtor -> Char
'(' Char -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      CompleteInheritingCtor Type_
t -> WithContext CtorDtor -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext CtorDtor
wc Type_
t WithContext Type_ -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' -- ?
      BaseInheritingCtor Type_
t -> WithContext CtorDtor -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext CtorDtor
wc Type_
t WithContext Type_ -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' -- ?
      CtorDtor
DeletingDtor -> Char
'~' Char -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      CtorDtor
CompleteDtor -> Char
'~' Char -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      CtorDtor
BaseDtor -> Char
'~' Char -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'

instance {-# OVERLAPPABLE #-}
  ($(sayableConstraints ''PrefixCDtor)
  ) =>  Sayable saytag (WithContext PrefixCDtor) where
  sayable :: WithContext PrefixCDtor -> Saying saytag
sayable WithContext PrefixCDtor
wc =
    let PCDC Prefix
p CtorDtor
n = WithContext PrefixCDtor -> PrefixCDtor
forall a. WithContext a -> a
contextData WithContext PrefixCDtor
wc
        mb'ln :: Maybe UnqualifiedName
mb'ln = case Prefix
p of
                  Prefix PrefixR
pfxr -> PrefixR -> Maybe UnqualifiedName
pfxrLastUQName PrefixR
pfxr
                  Prefix
_ -> Demangler -> String -> [String] -> Maybe UnqualifiedName
forall a b. a -> String -> [String] -> Maybe b
cannot Demangler
Demangler String
"sayable"
                       [ String
"CTORDTOR UNK PFX: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Prefix -> String
forall a. Show a => a -> String
show Prefix
p ]
        pfxrLastUQName :: PrefixR -> Maybe UnqualifiedName
pfxrLastUQName = \case
          PrefixUQName (UnnamedTypeName Maybe Natural
_) PrefixR
PrefixEnd -> Maybe UnqualifiedName
forall a. Maybe a
Nothing
          PrefixUQName (UnnamedTypeName Maybe Natural
_) (PrefixTemplateArgs TemplateArgs
_ PrefixR
PrefixEnd) -> Maybe UnqualifiedName
forall a. Maybe a
Nothing
          PrefixUQName UnqualifiedName
unm PrefixR
PrefixEnd -> UnqualifiedName -> Maybe UnqualifiedName
forall a. a -> Maybe a
Just UnqualifiedName
unm
          PrefixUQName UnqualifiedName
unm (PrefixTemplateArgs TemplateArgs
_ PrefixR
PrefixEnd) -> UnqualifiedName -> Maybe UnqualifiedName
forall a. a -> Maybe a
Just UnqualifiedName
unm
          PrefixUQName UnqualifiedName
unm PrefixR
sp -> PrefixR -> Maybe UnqualifiedName
pfxrLastUQName PrefixR
sp Maybe UnqualifiedName
-> Maybe UnqualifiedName -> Maybe UnqualifiedName
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> UnqualifiedName -> Maybe UnqualifiedName
forall a. a -> Maybe a
Just UnqualifiedName
unm  -- [note UTC]
          PrefixTemplateArgs TemplateArgs
_ PrefixR
sp -> PrefixR -> Maybe UnqualifiedName
pfxrLastUQName PrefixR
sp
          PrefixR
PrefixEnd -> Maybe UnqualifiedName
forall a. Maybe a
Nothing
    in case Maybe UnqualifiedName
mb'ln of
         Just UnqualifiedName
ln ->
           case CtorDtor
n of
             CtorDtor
CompleteCtor -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext UnqualifiedName -> Saying saytag)
-> WithContext UnqualifiedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext PrefixCDtor
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc UnqualifiedName
ln
             CtorDtor
BaseCtor -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext UnqualifiedName -> Saying saytag)
-> WithContext UnqualifiedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext PrefixCDtor
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc UnqualifiedName
ln
             CtorDtor
CompleteAllocatingCtor -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext UnqualifiedName -> Saying saytag)
-> WithContext UnqualifiedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext PrefixCDtor
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc UnqualifiedName
ln
             CompleteInheritingCtor Type_
t -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Type_ -> Saying saytag)
-> WithContext Type_ -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext PrefixCDtor -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc Type_
t -- ??
             BaseInheritingCtor Type_
t -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Type_ -> Saying saytag)
-> WithContext Type_ -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext PrefixCDtor -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc Type_
t -- ??
             CtorDtor
DeletingDtor -> Char
'~' Char -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext PrefixCDtor
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc UnqualifiedName
ln
             CtorDtor
CompleteDtor -> Char
'~' Char -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext PrefixCDtor
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc UnqualifiedName
ln
             CtorDtor
BaseDtor -> Char
'~' Char -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext PrefixCDtor
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc UnqualifiedName
ln
         Maybe UnqualifiedName
Nothing -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext CtorDtor -> Saying saytag)
-> WithContext CtorDtor -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext PrefixCDtor -> CtorDtor -> WithContext CtorDtor
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixCDtor
wc CtorDtor
n

-- [Note UTC:] When printing a constructor or destructor that includes an
-- UnnamedTypeName, there are differences between GCC's c++filt and LLVM's
-- llvm-cxxfilt.  We adopt the former because the demangle tests use c++filt as
-- an oracle, but it is possible to switch to the LLVM style (at compile time) by
-- removing the alternative return of Just unm from the indicated
--
-- Example:
--    _ZN3FooUt3_C2Ev is the base constructor for the 5th unnamed type
--    in the Foo namespace.
--
--      c++filt _ZN3FooUt3_C2Ev -------> Foo::{unnamed type#5}::Foo()
--      llvm-cxxfilt _ZN3FooUt3_C2Ev --> Foo::'unnamed3'::()'


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''Operator
  ) =>  Sayable saytag (WithContext Operator) where
  sayable :: WithContext Operator -> Saying saytag
sayable WithContext Operator
wc =
    let op :: Operator
op = WithContext Operator -> Operator
forall a. WithContext a -> a
contextData WithContext Operator
wc in
    case Operator
-> [(Operator, (Arity, (Text, Text)))]
-> Maybe (Arity, (Text, Text))
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Operator
op [(Operator, (Arity, (Text, Text)))]
opTable of
      Just (Arity
_, (Text
_, Text
o)) -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag Text
o
      Maybe (Arity, (Text, Text))
Nothing ->
        -- TODO: if these are printed as part of an expression rather than an
        -- UnqualifiedName, the prefix space will be wrong (the latter prints
        -- "operator" to name the function whereas the former just prints the
        -- operation).  If this is an issue, probably needs to be a flag in
        -- WithContext to indicate if this is an expression or not.
        case Operator
op of
          OpCast Type_
ty -> Char
' ' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Operator -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Operator
wc Type_
ty
          OpString SourceName
snm -> Char
' ' Char -> WithContext SourceName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Operator -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Operator
wc SourceName
snm
          OpVendor Natural
n SourceName
snm -> Text -> Text
t'Text
"vendor" Text -> Natural -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Natural
n Saying saytag -> WithContext SourceName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Operator -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Operator
wc SourceName
snm  -- ?
          Operator
_ -> Demangler -> String -> [String] -> Saying saytag
forall a (saytag :: Symbol).
a -> String -> [String] -> Saying saytag
cannotSay Demangler
Demangler String
"sayable"
               [ String
"Operator not in opTable or with a specific override:"
               , Operator -> String
forall a. Show a => a -> String
show Operator
op
               ]

instance {-# OVERLAPPABLE #-}
  ($(sayableConstraints ''NestedName)
  , Sayable saytag (WithContext PrefixCDtor)
  ) => Sayable saytag (WithContext NestedName) where
  sayable :: WithContext NestedName -> Saying saytag
sayable WithContext NestedName
wc =
    let qualrefs :: [CVQualifier] -> Maybe RefQualifier -> Saying saytag
qualrefs [CVQualifier]
q Maybe RefQualifier
r = [CVQualifier] -> WithContext NestedName -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [CVQualifier]
q WithContext NestedName
wc Text
" " Saying saytag -> Maybe (WithContext RefQualifier) -> Saying saytag
forall (tag :: Symbol) m e.
(Sayable tag m, Sayable tag e) =>
m -> Maybe e -> Saying tag
&? Maybe RefQualifier
-> WithContext NestedName -> Maybe (WithContext RefQualifier)
forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx Maybe RefQualifier
r WithContext NestedName
wc
    in case WithContext NestedName -> NestedName
forall a. WithContext a -> a
contextData WithContext NestedName
wc of
      NestedName Prefix
p (CtorDtorName CtorDtor
nm) [CVQualifier]
q Maybe RefQualifier
r ->
        [CVQualifier] -> Maybe RefQualifier -> Saying saytag
qualrefs [CVQualifier]
q Maybe RefQualifier
r Saying saytag -> WithContext Prefix -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext NestedName -> Prefix -> WithContext Prefix
forall a b. WithContext a -> b -> WithContext b
withContext WithContext NestedName
wc Prefix
p Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::" Saying saytag -> WithContext PrefixCDtor -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext NestedName -> PrefixCDtor -> WithContext PrefixCDtor
forall a b. WithContext a -> b -> WithContext b
withContext WithContext NestedName
wc (Prefix -> CtorDtor -> PrefixCDtor
PCDC Prefix
p CtorDtor
nm)
      NestedName Prefix
EmptyPrefix UnqualifiedName
nm [CVQualifier]
q Maybe RefQualifier
r -> [CVQualifier] -> Maybe RefQualifier -> Saying saytag
qualrefs [CVQualifier]
q Maybe RefQualifier
r Saying saytag -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext NestedName
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext NestedName
wc UnqualifiedName
nm
      NestedName Prefix
p UnqualifiedName
nm [CVQualifier]
q Maybe RefQualifier
r -> [CVQualifier] -> Maybe RefQualifier -> Saying saytag
qualrefs [CVQualifier]
q Maybe RefQualifier
r Saying saytag -> WithContext Prefix -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext NestedName -> Prefix -> WithContext Prefix
forall a b. WithContext a -> b -> WithContext b
withContext WithContext NestedName
wc Prefix
p Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::" Saying saytag -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext NestedName
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext NestedName
wc UnqualifiedName
nm
      NestedTemplateName TemplatePrefix
tp TemplateArgs
ta [CVQualifier]
q Maybe RefQualifier
r -> [CVQualifier] -> Maybe RefQualifier -> Saying saytag
qualrefs [CVQualifier]
q Maybe RefQualifier
r Saying saytag -> WithContext TemplatePrefix -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext NestedName
-> TemplatePrefix -> WithContext TemplatePrefix
forall a b. WithContext a -> b -> WithContext b
withContext WithContext NestedName
wc TemplatePrefix
tp Saying saytag -> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext NestedName -> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext NestedName
wc TemplateArgs
ta


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''Prefix
  ) => Sayable saytag (WithContext Prefix) where
  sayable :: WithContext Prefix -> Saying saytag
sayable WithContext Prefix
wc =
    case WithContext Prefix -> Prefix
forall a. WithContext a -> a
contextData WithContext Prefix
wc of
      PrefixTemplateParam TemplateArg
tp PrefixR
prefixr -> WithContext Prefix -> TemplateArg -> WithContext TemplateArg
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Prefix
wc TemplateArg
tp WithContext TemplateArg -> WithContext PrefixR -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Prefix -> PrefixR -> WithContext PrefixR
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Prefix
wc PrefixR
prefixr
      PrefixDeclType DeclType
dt PrefixR
prefixr -> WithContext Prefix -> DeclType -> WithContext DeclType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Prefix
wc DeclType
dt WithContext DeclType -> WithContext PrefixR -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Prefix -> PrefixR -> WithContext PrefixR
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Prefix
wc PrefixR
prefixr
      PrefixClosure ()
cp -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext () -> Saying saytag)
-> WithContext () -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Prefix -> () -> WithContext ()
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Prefix
wc ()
cp -- ??
      Prefix PrefixR
prefixr -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext PrefixR -> Saying saytag)
-> WithContext PrefixR -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Prefix -> PrefixR -> WithContext PrefixR
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Prefix
wc PrefixR
prefixr


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''PrefixR
  ) => Sayable saytag (WithContext PrefixR) where
  sayable :: WithContext PrefixR -> Saying saytag
sayable WithContext PrefixR
wc =
    case WithContext PrefixR -> PrefixR
forall a. WithContext a -> a
contextData WithContext PrefixR
wc of
      PrefixUQName UnqualifiedName
uqn pfr :: PrefixR
pfr@(PrefixUQName {}) -> WithContext PrefixR
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixR
wc UnqualifiedName
uqn WithContext UnqualifiedName -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::" Saying saytag -> WithContext PrefixR -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext PrefixR -> PrefixR -> WithContext PrefixR
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixR
wc PrefixR
pfr
      PrefixUQName UnqualifiedName
uqn PrefixR
pfr -> WithContext PrefixR
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixR
wc UnqualifiedName
uqn WithContext UnqualifiedName -> WithContext PrefixR -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext PrefixR -> PrefixR -> WithContext PrefixR
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixR
wc PrefixR
pfr
      PrefixTemplateArgs TemplateArgs
ta PrefixR
pfr -> WithContext PrefixR -> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixR
wc TemplateArgs
ta WithContext TemplateArgs -> WithContext PrefixR -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext PrefixR -> PrefixR -> WithContext PrefixR
forall a b. WithContext a -> b -> WithContext b
withContext WithContext PrefixR
wc PrefixR
pfr
      PrefixR
PrefixEnd -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
""


instance {-# OVERLAPPABLE #-} Sayable saytag (WithContext CVQualifier) where
  sayable :: WithContext CVQualifier -> Saying saytag
sayable WithContext CVQualifier
wc =
    case WithContext CVQualifier -> CVQualifier
forall a. WithContext a -> a
contextData WithContext CVQualifier
wc of
      CVQualifier
Restrict -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
"restrict"
      CVQualifier
Volatile -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
"volatile"
      CVQualifier
Const_ -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
"const"

instance {-# OVERLAPPABLE #-} Sayable saytag (WithContext RefQualifier) where
  sayable :: WithContext RefQualifier -> Saying saytag
sayable WithContext RefQualifier
wc =
    case WithContext RefQualifier -> RefQualifier
forall a. WithContext a -> a
contextData WithContext RefQualifier
wc of
      RefQualifier
Ref -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag Char
'&'
      RefQualifier
RefRef -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
"&&"

instance {-# OVERLAPPABLE #-}
  ($(sayableConstraints ''TemplatePrefix)
  , Sayable saytag (WithContext PrefixUQN)
  ) => Sayable saytag (WithContext TemplatePrefix) where
  sayable :: WithContext TemplatePrefix -> Saying saytag
sayable WithContext TemplatePrefix
wc =
    case WithContext TemplatePrefix -> TemplatePrefix
forall a. WithContext a -> a
contextData WithContext TemplatePrefix
wc of
      GlobalTemplate NonEmpty UnqualifiedName
uqns -> NonEmpty UnqualifiedName
-> WithContext TemplatePrefix -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' NonEmpty UnqualifiedName
uqns WithContext TemplatePrefix
wc Text
"::"
      NestedTemplate Prefix
pr NonEmpty UnqualifiedName
uqns -> WithContext TemplatePrefix -> Prefix -> WithContext Prefix
forall a b. WithContext a -> b -> WithContext b
withContext WithContext TemplatePrefix
wc Prefix
pr WithContext Prefix -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::"
                                Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ NonEmpty PrefixUQN
-> WithContext TemplatePrefix -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' (Prefix -> UnqualifiedName -> PrefixUQN
PUC Prefix
pr (UnqualifiedName -> PrefixUQN)
-> NonEmpty UnqualifiedName -> NonEmpty PrefixUQN
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty UnqualifiedName
uqns) WithContext TemplatePrefix
wc Text
"::"
      TemplateTemplateParam TemplateArg
tp -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext TemplateArg -> Saying saytag)
-> WithContext TemplateArg -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext TemplatePrefix
-> TemplateArg -> WithContext TemplateArg
forall a b. WithContext a -> b -> WithContext b
withContext WithContext TemplatePrefix
wc TemplateArg
tp


instance {-# OVERLAPPABLE #-}
  (Sayable saytag (WithContext TemplateArg)
  ) => Sayable saytag (WithContext TemplateArgs) where
  sayable :: WithContext TemplateArgs -> Saying saytag
sayable WithContext TemplateArgs
wc = let args :: TemplateArgs
args = WithContext TemplateArgs -> TemplateArgs
forall a. WithContext a -> a
contextData WithContext TemplateArgs
wc
                   args' :: [TemplateArg]
args' = (TemplateArg -> Bool) -> [TemplateArg] -> [TemplateArg]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (TemplateArg -> Bool) -> TemplateArg -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TemplateArg -> Bool
emptyArgPack) ([TemplateArg] -> [TemplateArg]) -> [TemplateArg] -> [TemplateArg]
forall a b. (a -> b) -> a -> b
$ TemplateArgs -> [TemplateArg]
forall a. NonEmpty a -> [a]
NEL.toList TemplateArgs
args
                   emptyArgPack :: TemplateArg -> Bool
emptyArgPack (TArgPack []) = Bool
True
                   emptyArgPack TemplateArg
_ = Bool
False
               in Char
'<' Char -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [TemplateArg] -> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [TemplateArg]
args' WithContext TemplateArgs
wc Saying saytag -> String -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ TemplateArgs -> String
templateArgsEnd TemplateArgs
args

-- C++ requires a space between template argument closures to resolve the parsing
-- ambiguity between that and a right shift operation.(e.g. "list<foo<int> >"
-- instead of "list<foo<int>>"
templateArgsEnd :: TemplateArgs -> String
templateArgsEnd :: TemplateArgs -> String
templateArgsEnd TemplateArgs
args = case TemplateArgs -> TemplateArg
forall a. NonEmpty a -> a
NEL.last TemplateArgs
args of
                        TArgPack [TemplateArg]
targs ->
                          case [TemplateArg] -> Maybe TemplateArgs
forall a. [a] -> Maybe (NonEmpty a)
NEL.nonEmpty [TemplateArg]
targs of
                            Just TemplateArgs
args' -> TemplateArgs -> String
templateArgsEnd TemplateArgs
args'
                            -- Expected to need ellipsis here, but c++filt does
                            -- not emit them.
                            -- Nothing -> "..."
                            Maybe TemplateArgs
Nothing -> String
">"
                        TArgType (ClassUnionStructEnum
                                  (NameNested
                                   (NestedTemplateName {}))) -> String
" >"
                        TArgType (ClassUnionStructEnum
                                  (UnscopedTemplateName {})) -> String
" >"
                        TemplateArg
_ -> String
">"

instance {-# OVERLAPPABLE #-}
  ($(sayableConstraints ''TemplateArg)
  ) => Sayable saytag (WithContext TemplateArg) where
  sayable :: WithContext TemplateArg -> Saying saytag
sayable WithContext TemplateArg
wc =
    case WithContext TemplateArg -> TemplateArg
forall a. WithContext a -> a
contextData WithContext TemplateArg
wc of
      TArgType Type_
ty -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Type_ -> Saying saytag)
-> WithContext Type_ -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext TemplateArg -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContextForTemplateArg WithContext TemplateArg
wc Type_
ty
      TArgSimpleExpr ExprPrimary
ep -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext ExprPrimary -> Saying saytag)
-> WithContext ExprPrimary -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext TemplateArg -> ExprPrimary -> WithContext ExprPrimary
forall a b. WithContext a -> b -> WithContext b
withContextForTemplateArg WithContext TemplateArg
wc ExprPrimary
ep
      TArgExpr Expression
expr -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Expression -> Saying saytag)
-> WithContext Expression -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext TemplateArg -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContextForTemplateArg WithContext TemplateArg
wc Expression
expr
      TArgPack [TemplateArg]
tas ->
        -- Expected some ellipses (see
        -- https://en.cppreference.com/w/cpp/language/parameter-pack), but
        -- c++filt does not show them in that manner.
        --
        -- if null tas  then '.' &+ ".."
        -- else (NEL.fromList tas, c) &+ "..."
        --
        -- Do not simply defer to the TemplateArgs sayable because that will
        -- engender another pair of surrounding angle brackets.
        [TemplateArg] -> WithContext () -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [TemplateArg]
tas (WithContext () -> Saying saytag)
-> WithContext () -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext TemplateArg -> () -> WithContext ()
forall a b. WithContext a -> b -> WithContext b
withContextForTemplateArg WithContext TemplateArg
wc ()

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''Expression
  ) => Sayable saytag (WithContext Expression) where
  sayable :: WithContext Expression -> Saying saytag
sayable WithContext Expression
wc =
    case WithContext Expression -> Expression
forall a. WithContext a -> a
contextData WithContext Expression
wc of
      ExprUnary Operator
op Expression
expr -> WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op WithContext Operator -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr
      ExprBinary Operator
op Expression
expr1 Expression
expr2 -> WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr1 WithContext Expression -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr2
      ExprTrinary Operator
op Expression
expr1 Expression
expr2 Expression
expr3 ->
        Char
'(' Char -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr1 Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' Saying saytag -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr2 Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
':' Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr3
      ExprPfxPlus Expression
expr -> Text -> Text
t'Text
"++" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr
      ExprPfxMinus Expression
expr -> Text -> Text
t'Text
"--" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr
      ExprCall (Expression
exprc :| [Expression]
args) -> WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
exprc WithContext Expression -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [Expression] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [Expression]
args WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprConvert1 Type_
ty Expression
expr -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr
      ExprConvertSome Type_
ty NonEmpty Expression
exprs -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
")(" Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ NonEmpty Expression -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst NonEmpty Expression
exprs WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprConvertInit Type_
ty [BracedExpression]
brexprs -> WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty WithContext Type_ -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'{' Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [BracedExpression] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [BracedExpression]
brexprs WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'}'
      ExprBracedInit [BracedExpression]
brexprs -> Char
'{' Char -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [BracedExpression] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [BracedExpression]
brexprs WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'}'
      ExprNew Bool
gs [Expression]
exprs Type_
ty -> Text -> Text
t'Text
"new (" Text -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [Expression] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [Expression]
exprs WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
                             Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- (if Bool
gs then Text
"::" else Text -> Text
t'Text
"") Saying saytag -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty
      ExprNewInit Bool
gs [Expression]
exprs Type_
ty InitializerExpr
i -> Text -> Text
t'Text
"new (" Text -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [Expression] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [Expression]
exprs WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
                                   Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- (if Bool
gs then Text
"::" else Text -> Text
t'Text
"") Saying saytag -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty
                                   Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'(' Saying saytag -> WithContext InitializerExpr -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression
-> InitializerExpr -> WithContext InitializerExpr
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc InitializerExpr
i Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprNewArray Bool
gs [Expression]
exprs Type_
ty -> Text -> Text
t'Text
"new[] (" Text -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [Expression] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [Expression]
exprs WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
                                  Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- (if Bool
gs then Text
"::" else Text -> Text
t'Text
"") Saying saytag -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty
      ExprNewInitArray Bool
gs [Expression]
exprs Type_
ty InitializerExpr
i -> Text -> Text
t'Text
"new[] (" Text -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [Expression] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [Expression]
exprs WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
                                        Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- (if Bool
gs then Text
"::" else Text -> Text
t'Text
"") Saying saytag -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty
                                        Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'(' Saying saytag -> WithContext InitializerExpr -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression
-> InitializerExpr -> WithContext InitializerExpr
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc InitializerExpr
i Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprDel Bool
gs Expression
expr -> Text -> Text
t'Text
"delete" Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- (if Bool
gs then Text
"::" else Text -> Text
t'Text
"") -- ??
                         Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr
      ExprDelArray Bool
gs Expression
expr -> Text -> Text
t'Text
"delete[]" Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- (if Bool
gs then Text
"::" else Text -> Text
t'Text
"") -- ??
                              Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr
      ExprDynamicCast Type_
ty Expression
expr -> Text -> Text
t'Text
"dynamic_cast<" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
">("
                                 Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprStaticCast Type_
ty Expression
expr -> Text -> Text
t'Text
"static_cast<" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
">("
                                Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprConstCast Type_
ty Expression
expr -> Text -> Text
t'Text
"const_cast<" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
">("
                               Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprReinterpretCast Type_
ty Expression
expr -> Text -> Text
t'Text
"reinterpret_cast<" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
">("
                                     Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprTypeIdType Type_
ty -> Text -> Text
t'Text
"typeid(" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprTypeId Expression
expr -> Text -> Text
t'Text
"typeid(" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprSizeOfType Type_
ty -> Text -> Text
t'Text
"sizeof(" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprSizeOf Expression
expr -> Text -> Text
t'Text
"sizeof(" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprAlignOfType Type_
ty -> Text -> Text
t'Text
"alignof(" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Type_
ty Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprAlignOf Expression
expr -> Text -> Text
t'Text
"alignof(" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprNoException Expression
expr -> Text -> Text
t'Text
"noexcept(" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprTemplateParam TemplateArg
tp -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext TemplateArg -> Saying saytag)
-> WithContext TemplateArg -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Expression -> TemplateArg -> WithContext TemplateArg
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc TemplateArg
tp
      ExprFunctionParam FunctionParam
fp -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext FunctionParam -> Saying saytag)
-> WithContext FunctionParam -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Expression
-> FunctionParam -> WithContext FunctionParam
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc FunctionParam
fp
      ExprField Expression
expr UnresolvedName
urn -> WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr WithContext Expression -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'.' Saying saytag -> WithContext UnresolvedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression
-> UnresolvedName -> WithContext UnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc UnresolvedName
urn
      ExprFieldPtr Expression
expr UnresolvedName
urn -> WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr WithContext Expression -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"->" Saying saytag -> WithContext UnresolvedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression
-> UnresolvedName -> WithContext UnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc UnresolvedName
urn
      ExprFieldExpr Expression
baseExp Expression
fieldExp -> WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
baseExp WithContext Expression -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
".*" Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
fieldExp
      ExprSizeOfTmplParamPack TemplateArg
tp -> Text -> Text
t'Text
"sizeof...(" Text -> WithContext TemplateArg -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> TemplateArg -> WithContext TemplateArg
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc TemplateArg
tp Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprSizeOfFuncParamPack FunctionParam
fp -> Text -> Text
t'Text
"sizeof...(" Text -> WithContext FunctionParam -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression
-> FunctionParam -> WithContext FunctionParam
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc FunctionParam
fp Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprSizeOfCapturedTmplParamPack [TemplateArg]
tas -> Text -> Text
t'Text
"sizeof...(" Text -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [TemplateArg] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [TemplateArg]
tas WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprPack Expression
expr -> WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr WithContext Expression -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"..."
      ExprUnaryLeftFold Operator
op Expression
expr  -> Char
'(' Char -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"..." Saying saytag -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprUnaryRightFold Operator
op Expression
expr -> Char
'(' Char -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr Saying saytag -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"..." Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprBinaryLeftFold Operator
op Expression
exprL Expression
exprR  ->
        Char
'(' Char -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
exprL Saying saytag -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"..." Saying saytag -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
exprR Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprBinaryRightFold Operator
op Expression
exprL Expression
exprR ->
        Char
'(' Char -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
exprL Saying saytag -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"..." Saying saytag -> WithContext Operator -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Operator
op Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
exprR Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      ExprThrow Expression
expr -> Text -> Text
t'Text
"throw" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Expression -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc Expression
expr
      Expression
ExprReThrow -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
"throw"
      ExprVendorExtended SourceName
sn [TemplateArg]
tas -> WithContext Expression -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc SourceName
sn WithContext SourceName -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'<' Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [TemplateArg] -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [TemplateArg]
tas WithContext Expression
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'>'
      ExprUnresolvedName UnresolvedName
urn -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext UnresolvedName -> Saying saytag)
-> WithContext UnresolvedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Expression
-> UnresolvedName -> WithContext UnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc UnresolvedName
urn
      ExprPrim ExprPrimary
pe -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext ExprPrimary -> Saying saytag)
-> WithContext ExprPrimary -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Expression -> ExprPrimary -> WithContext ExprPrimary
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Expression
wc ExprPrimary
pe

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''ExprPrimary
  ) => Sayable saytag (WithContext ExprPrimary) where
  sayable :: WithContext ExprPrimary -> Saying saytag
sayable WithContext ExprPrimary
wc =
    case WithContext ExprPrimary -> ExprPrimary
forall a. WithContext a -> a
contextData WithContext ExprPrimary
wc of
      IntLit Type_
ty Coord
n ->
        -- Normally these are printed with a typecast (e.g. `(type)`) ".
        -- However, C and C++ have some special situations where they can use
        -- special suffixes instead (e.g. `10ul` for unsigned long).  And some
        -- are just wholesale changes.
        case Type_
ty of
          BaseType BaseType
Bool_ -> Text -> Text
t'Text
"" Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ if Coord
n Coord -> Coord -> Bool
forall a. Ord a => a -> a -> Bool
> Coord
0 then Text -> Text
t'Text
"true" else Text -> Text
t'Text
"false"
          BaseType BaseType
bty -> case BaseType
-> [(BaseType, (Text, Text, Maybe Text))]
-> Maybe (Text, Text, Maybe Text)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup BaseType
bty [(BaseType, (Text, Text, Maybe Text))]
builtinTypeTable of
                            Just (Text
_, Text
_, Just Text
sfx) -> Coord
n Coord -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text
sfx
                            Just (Text
_, Text
cst, Maybe Text
Nothing) -> Char
'(' Char -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text
cst Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' Saying saytag -> Coord -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Coord
n
                            Maybe (Text, Text, Maybe Text)
_ -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext ExprPrimary -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ExprPrimary
wc Type_
ty Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' Saying saytag -> Coord -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Coord
n
          Type_
_ -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext ExprPrimary -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ExprPrimary
wc Type_
ty Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' Saying saytag -> Coord -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Coord
n
      FloatLit Type_
ty Float
n -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext ExprPrimary -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ExprPrimary
wc Type_
ty Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' Saying saytag -> Float -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Float
n
      ComplexFloatLit Type_
ty Float
r Float
i -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext ExprPrimary -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ExprPrimary
wc Type_
ty Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> Float -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Float
r Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
',' Saying saytag -> Float -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Float
i Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      DirectLit Type_
ty -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext ExprPrimary -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ExprPrimary
wc Type_
ty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
")NULL"  -- except String?
      NullPtrTemplateArg Type_
ty -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext ExprPrimary -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ExprPrimary
wc Type_
ty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
")0"
      ExternalNameLit Encoding
enc -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Encoding -> Saying saytag)
-> WithContext Encoding -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext ExprPrimary -> Encoding -> WithContext Encoding
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ExprPrimary
wc Encoding
enc


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''BracedExpression
   ) => Sayable saytag (WithContext BracedExpression) where
  sayable :: WithContext BracedExpression -> Saying saytag
sayable WithContext BracedExpression
wc =
    case WithContext BracedExpression -> BracedExpression
forall a. WithContext a -> a
contextData WithContext BracedExpression
wc of
      BracedExpr Expression
e -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Expression -> Saying saytag)
-> WithContext Expression -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext BracedExpression
-> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BracedExpression
wc Expression
e
      BracedFieldExpr SourceName
sn BracedExpression
be' -> Char
'.' Char -> WithContext SourceName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BracedExpression
-> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BracedExpression
wc SourceName
sn Saying saytag -> WithContext BracedExpression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BracedExpression
-> BracedExpression -> WithContext BracedExpression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BracedExpression
wc BracedExpression
be'
      BracedIndexExpr Expression
ixe BracedExpression
be' ->
        Char
'[' Char -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BracedExpression
-> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BracedExpression
wc Expression
ixe Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
']' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'=' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'(' Saying saytag -> WithContext BracedExpression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BracedExpression
-> BracedExpression -> WithContext BracedExpression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BracedExpression
wc BracedExpression
be' Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      BracedRangedExpr Expression
sr Expression
er BracedExpression
be' -> Char
'[' Char -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BracedExpression
-> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BracedExpression
wc Expression
sr Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"..." Saying saytag -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext BracedExpression
-> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BracedExpression
wc Expression
er Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
']'
                                    Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'=' Saying saytag -> WithContext BracedExpression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext BracedExpression
-> BracedExpression -> WithContext BracedExpression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BracedExpression
wc BracedExpression
be'


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''InitializerExpr
   ) => Sayable saytag (WithContext InitializerExpr) where
  sayable :: WithContext InitializerExpr -> Saying saytag
sayable WithContext InitializerExpr
wc = let Initializer [Expression]
ies = WithContext InitializerExpr -> InitializerExpr
forall a. WithContext a -> a
contextData WithContext InitializerExpr
wc in [Expression] -> WithContext InitializerExpr -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst [Expression]
ies WithContext InitializerExpr
wc


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''FunctionParam
   ) => Sayable saytag (WithContext FunctionParam) where
  sayable :: WithContext FunctionParam -> Saying saytag
sayable WithContext FunctionParam
wc =
    case WithContext FunctionParam -> FunctionParam
forall a. WithContext a -> a
contextData WithContext FunctionParam
wc of
      FunctionParam
FP_This -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
"this"
      FP_ [CVQualifier]
cvq Natural
n -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Saying saytag -> Saying saytag) -> Saying saytag -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Char
'{' Char -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [CVQualifier] -> WithContext FunctionParam -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [CVQualifier]
cvq WithContext FunctionParam
wc Text
" " Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"parm#" Saying saytag -> Natural -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Natural
n Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'}'


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''UnresolvedName
   ) => Sayable saytag (WithContext UnresolvedName) where
  sayable :: WithContext UnresolvedName -> Saying saytag
sayable WithContext UnresolvedName
wc =
    case WithContext UnresolvedName -> UnresolvedName
forall a. WithContext a -> a
contextData WithContext UnresolvedName
wc of
      URN_Base Bool
True BaseUnresolvedName
burn -> Text -> Text
t'Text
"::" Text -> WithContext BaseUnresolvedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnresolvedName
-> BaseUnresolvedName -> WithContext BaseUnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedName
wc BaseUnresolvedName
burn
      URN_Base Bool
False BaseUnresolvedName
burn -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext BaseUnresolvedName -> Saying saytag)
-> WithContext BaseUnresolvedName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnresolvedName
-> BaseUnresolvedName -> WithContext BaseUnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedName
wc BaseUnresolvedName
burn
      URNScopedRef UnresolvedType
urt BaseUnresolvedName
burn -> WithContext UnresolvedName
-> UnresolvedType -> WithContext UnresolvedType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedName
wc UnresolvedType
urt WithContext UnresolvedType -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::" Saying saytag -> WithContext BaseUnresolvedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnresolvedName
-> BaseUnresolvedName -> WithContext BaseUnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedName
wc BaseUnresolvedName
burn
      URNSubScopedRef UnresolvedType
urt UnresolvedQualifierLevels
urqls BaseUnresolvedName
burn -> WithContext UnresolvedName
-> UnresolvedType -> WithContext UnresolvedType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedName
wc UnresolvedType
urt WithContext UnresolvedType -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::"
                                        Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ UnresolvedQualifierLevels
-> WithContext UnresolvedName -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' UnresolvedQualifierLevels
urqls WithContext UnresolvedName
wc (Text -> Text
t'Text
"::")
                                        Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::" Saying saytag -> WithContext BaseUnresolvedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnresolvedName
-> BaseUnresolvedName -> WithContext BaseUnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedName
wc BaseUnresolvedName
burn
      URNQualRef Bool
True UnresolvedQualifierLevels
urqls BaseUnresolvedName
burn -> Text -> Text
t'Text
"::"
                                    Text -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ UnresolvedQualifierLevels
-> WithContext UnresolvedName -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' UnresolvedQualifierLevels
urqls WithContext UnresolvedName
wc (Text -> Text
t'Text
"::")
                                    Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::" Saying saytag -> WithContext BaseUnresolvedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnresolvedName
-> BaseUnresolvedName -> WithContext BaseUnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedName
wc BaseUnresolvedName
burn
      URNQualRef Bool
False UnresolvedQualifierLevels
urqls BaseUnresolvedName
burn -> UnresolvedQualifierLevels
-> WithContext UnresolvedName -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' UnresolvedQualifierLevels
urqls WithContext UnresolvedName
wc (Text -> Text
t'Text
"::")
                                     Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::" Saying saytag -> WithContext BaseUnresolvedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnresolvedName
-> BaseUnresolvedName -> WithContext BaseUnresolvedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedName
wc BaseUnresolvedName
burn


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''BaseUnresolvedName
   ) => Sayable saytag (WithContext BaseUnresolvedName) where
  sayable :: WithContext BaseUnresolvedName -> Saying saytag
sayable WithContext BaseUnresolvedName
wc =
    case WithContext BaseUnresolvedName -> BaseUnresolvedName
forall a. WithContext a -> a
contextData WithContext BaseUnresolvedName
wc of
      BUName SourceName
sn Maybe TemplateArgs
Nothing -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext SourceName -> Saying saytag)
-> WithContext SourceName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext BaseUnresolvedName
-> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc SourceName
sn
      BUName SourceName
sn (Just TemplateArgs
targs) -> WithContext BaseUnresolvedName
-> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc SourceName
sn WithContext SourceName -> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BaseUnresolvedName
-> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc TemplateArgs
targs
      BUOnOperator Operator
op -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Operator -> Saying saytag)
-> WithContext Operator -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext BaseUnresolvedName -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc Operator
op
      BUOnOperatorT Operator
op TemplateArgs
targs -> WithContext BaseUnresolvedName -> Operator -> WithContext Operator
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc Operator
op WithContext Operator -> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BaseUnresolvedName
-> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc TemplateArgs
targs -- ?
      BUDestructorUnresolvedType UnresolvedType
urt -> Char
'~' Char -> WithContext UnresolvedType -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BaseUnresolvedName
-> UnresolvedType -> WithContext UnresolvedType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc UnresolvedType
urt
      BUDestructorSimpleId SourceName
sn Maybe TemplateArgs
Nothing -> Char
'~' Char -> WithContext SourceName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BaseUnresolvedName
-> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc SourceName
sn
      BUDestructorSimpleId SourceName
sn (Just TemplateArgs
targs) -> Char
'~' Char -> WithContext SourceName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BaseUnresolvedName
-> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc SourceName
sn Saying saytag -> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext BaseUnresolvedName
-> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseUnresolvedName
wc TemplateArgs
targs


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''UnresolvedType
   ) => Sayable saytag (WithContext UnresolvedType) where
  sayable :: WithContext UnresolvedType -> Saying saytag
sayable WithContext UnresolvedType
wc =
    case WithContext UnresolvedType -> UnresolvedType
forall a. WithContext a -> a
contextData WithContext UnresolvedType
wc of
      URTTemplate TemplateArg
tp Maybe TemplateArgs
Nothing -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext TemplateArg -> Saying saytag)
-> WithContext TemplateArg -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnresolvedType
-> TemplateArg -> WithContext TemplateArg
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedType
wc TemplateArg
tp
      URTTemplate TemplateArg
tp (Just TemplateArgs
targs) -> WithContext UnresolvedType
-> TemplateArg -> WithContext TemplateArg
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedType
wc TemplateArg
tp WithContext TemplateArg
-> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnresolvedType
-> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedType
wc TemplateArgs
targs
      URTDeclType DeclType
dt -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext DeclType -> Saying saytag)
-> WithContext DeclType -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnresolvedType -> DeclType -> WithContext DeclType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedType
wc DeclType
dt
      URTSubstPrefix Prefix
pfx -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Prefix -> Saying saytag)
-> WithContext Prefix -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnresolvedType -> Prefix -> WithContext Prefix
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedType
wc Prefix
pfx


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''UnresolvedQualifierLevel
   ) => Sayable saytag (WithContext UnresolvedQualifierLevel) where
  sayable :: WithContext UnresolvedQualifierLevel -> Saying saytag
sayable WithContext UnresolvedQualifierLevel
wc =
    case WithContext UnresolvedQualifierLevel -> UnresolvedQualifierLevel
forall a. WithContext a -> a
contextData WithContext UnresolvedQualifierLevel
wc of
      URQL SourceName
sn Maybe TemplateArgs
Nothing -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext SourceName -> Saying saytag)
-> WithContext SourceName -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext UnresolvedQualifierLevel
-> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedQualifierLevel
wc SourceName
sn
      URQL SourceName
sn (Just TemplateArgs
targs) -> WithContext UnresolvedQualifierLevel
-> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedQualifierLevel
wc SourceName
sn WithContext SourceName -> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext UnresolvedQualifierLevel
-> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext UnresolvedQualifierLevel
wc TemplateArgs
targs


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''DeclType
   ) => Sayable saytag (WithContext DeclType) where
  sayable :: WithContext DeclType -> Saying saytag
sayable WithContext DeclType
wc =
    case WithContext DeclType -> DeclType
forall a. WithContext a -> a
contextData WithContext DeclType
wc of
      DeclType Expression
expr -> Text -> Text
t'Text
"decltype (" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext DeclType -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext DeclType
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
      DeclTypeExpr Expression
expr -> Text -> Text
t'Text
"decltype (" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext DeclType -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext DeclType
wc Expression
expr Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'


instance {-# OVERLAPPABLE #-} Sayable saytag (WithContext ClosurePrefix) where
  sayable :: WithContext () -> Saying saytag
sayable WithContext ()
_ = Demangler -> String -> [String] -> Saying saytag
forall a (saytag :: Symbol).
a -> String -> [String] -> Saying saytag
cannotSay Demangler
Demangler String
"sayable"
              [ String
"No Sayable for ClosurePrefix" ]

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''Substitution
  ) => Sayable saytag (WithContext Substitution) where
  sayable :: WithContext Substitution -> Saying saytag
sayable WithContext Substitution
wc =
    case WithContext Substitution -> Substitution
forall a. WithContext a -> a
contextData WithContext Substitution
wc of
      Substitution
SubStd -> Text -> Text
t'Text
"std" Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
""
      Substitution
SubAlloc -> Text -> Text
t'Text
"std" Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::allocator"
      Substitution
SubBasicString -> Text -> Text
t'Text
"std" Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::basic_string"
      SubStdType StdType
stdTy -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext StdType -> Saying saytag)
-> WithContext StdType -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Substitution -> StdType -> WithContext StdType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Substitution
wc StdType
stdTy

instance {-# OVERLAPPABLE #-} Sayable saytag (WithContext StdType) where
  sayable :: WithContext StdType -> Saying saytag
sayable WithContext StdType
wc =
    let ct :: Text
ct = Text -> Text
t'Text
"std::char_traits<char>" in
    case WithContext StdType -> StdType
forall a. WithContext a -> a
contextData WithContext StdType
wc of
      StdType
BasicStringChar -> Text -> Text
t'Text
"std::basic_string<char," Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text
ct Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
", std::allocator<char> >"
      StdType
BasicIStream -> Text -> Text
t'Text
"std::basic_istream<char," Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text
ct Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'>'
      StdType
BasicOStream -> Text -> Text
t'Text
"std::basic_ostream<char," Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text
ct Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'>'
      StdType
BasicIOStream -> Text -> Text
t'Text
"std::basic_iostream<char," Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text
ct Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'>'


-- n.b. LLVM and GNU syntax seems to be [abi:foo][abi:bar], despite the website
-- documentation of [[gnu::abi_tag ("foo", "bar")]]
instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''ABI_Tag
  ) => Sayable saytag (WithContext ABI_Tag) where
  sayable :: WithContext ABI_Tag -> Saying saytag
sayable WithContext ABI_Tag
wc = let ABITag SourceName
p = WithContext ABI_Tag -> ABI_Tag
forall a. WithContext a -> a
contextData WithContext ABI_Tag
wc in Text -> Text
t'Text
"[abi:" Text -> WithContext SourceName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext ABI_Tag -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ABI_Tag
wc SourceName
p Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
']'

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''Type_
 ) => Sayable saytag (WithContext Type_) where
  sayable :: WithContext Type_ -> Saying saytag
sayable WithContext Type_
wc =
    case WithContext Type_ -> Type_
forall a. WithContext a -> a
contextData WithContext Type_
wc of
      BaseType BaseType
t -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext BaseType -> Saying saytag)
-> WithContext BaseType -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> BaseType -> WithContext BaseType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc BaseType
t
      QualifiedType [] [] Type_
t -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Type_ -> Saying saytag)
-> WithContext Type_ -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t
      QualifiedType [()]
eqs [] Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ [()] -> WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [()]
eqs WithContext Type_
wc Text
" "
      QualifiedType [] [CVQualifier]
cvqs Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- [CVQualifier] -> WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [CVQualifier]
cvqs WithContext Type_
wc Text
" "
      QualifiedType [()]
eqs [CVQualifier]
cvqs Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- [()] -> WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [()]
eqs WithContext Type_
wc Text
" " Saying saytag -> Saying saytag -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- [CVQualifier] -> WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [CVQualifier]
cvqs WithContext Type_
wc Text
" "
      ClassUnionStructEnum Name
n -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Name -> Saying saytag)
-> WithContext Name -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Name
n
      ClassStruct Name
n -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Name -> Saying saytag)
-> WithContext Name -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Name
n
      Union Name
n -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Name -> Saying saytag)
-> WithContext Name -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Name
n
      Enum Name
n -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Name -> Saying saytag)
-> WithContext Name -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> Name -> WithContext Name
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Name
n
      ty :: Type_
ty@(Function {}) -> Type_ -> Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) nm.
Sayable saytag nm =>
Type_ -> nm -> WithContext Type_ -> Saying saytag
sayFunctionType Type_
ty (Text -> Text
t'Text
"") WithContext Type_
wc
      Pointer f :: Type_
f@(Function {}) -> Type_ -> Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) nm.
Sayable saytag nm =>
Type_ -> nm -> WithContext Type_ -> Saying saytag
sayFunctionType Type_
f (Text -> Text
t'Text
"(*)") WithContext Type_
wc
      Pointer (ArrayType ArrayBound
bnd Type_
t) -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"(*)" Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'[' Saying saytag -> WithContext ArrayBound -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Type_ -> ArrayBound -> WithContext ArrayBound
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc ArrayBound
bnd Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
']'
      Pointer Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'*'
      LValRef (ArrayType ArrayBound
bnd Type_
t) -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"(&)" Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Char
'[' Saying saytag -> WithContext ArrayBound -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Type_ -> ArrayBound -> WithContext ArrayBound
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc ArrayBound
bnd Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
']'
      LValRef Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'&'
      RValRef (LValRef t :: Type_
t@(QualifiedType [()]
_ [CVQualifier
Const_] Type_
_)) ->
        -- An rvalue may be used to initialize a const lvalue reference; see
        -- https://en.cppreference.com/w/cpp/language/value_category
        forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Type_ -> Saying saytag)
-> WithContext Type_ -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc (Type_ -> Type_
LValRef Type_
t)
      RValRef Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"&&"
      ComplexPair Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"complex"
      Imaginary Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"imaginary"
      ArrayType ArrayBound
bnd Type_
t -> WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
t WithContext Type_ -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'[' Saying saytag -> WithContext ArrayBound -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Type_ -> ArrayBound -> WithContext ArrayBound
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc ArrayBound
bnd Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
']'
      Template TemplateArg
tp TemplateArgs
ta -> WithContext Type_ -> TemplateArg -> WithContext TemplateArg
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc TemplateArg
tp WithContext TemplateArg
-> WithContext TemplateArgs -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext Type_ -> TemplateArgs -> WithContext TemplateArgs
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc TemplateArgs
ta -- ??
      Cpp11PackExpansion NonEmpty Type_
ts ->
        -- XXX expected some "..." (see
        -- https://en.cppreference.com/w/cpp/language/parameter-pack) but c++filt
        -- does not visibly decorate these.
        NonEmpty Type_ -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) (t :: * -> *) a b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Saying saytag
ctxLst NonEmpty Type_
ts WithContext Type_
wc
      StdType StdType
stdTy -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext StdType -> Saying saytag)
-> WithContext StdType -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> StdType -> WithContext StdType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc StdType
stdTy
      DeclType_ DeclType
dt -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext DeclType -> Saying saytag)
-> WithContext DeclType -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext Type_ -> DeclType -> WithContext DeclType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc DeclType
dt
      PointerToMember Type_
cty mty :: Type_
mty@(Function {}) ->
        Type_ -> Saying saytag -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) nm.
Sayable saytag nm =>
Type_ -> nm -> WithContext Type_ -> Saying saytag
sayFunctionType Type_
mty (Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
cty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::*)") WithContext Type_
wc
      PointerToMember Type_
cty Type_
mty -> Char
'(' Char -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
cty Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"::*)" Saying saytag -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
mty -- ??


sayFunctionType :: Sayable saytag nm => Type_ -> nm -> WithContext Type_ -> Saying saytag
sayFunctionType :: forall (saytag :: Symbol) nm.
Sayable saytag nm =>
Type_ -> nm -> WithContext Type_ -> Saying saytag
sayFunctionType (Function [CVQualifier]
cvqs Maybe ExceptionSpec
mb'exc Transaction
trns Bool
isExternC Type_
rTy NonEmpty Type_
argTys Maybe RefQualifier
mb'ref) nm
nm WithContext Type_
wc =
  [CVQualifier] -> WithContext Type_ -> Text -> Saying saytag
forall (saytag :: Symbol) a (t :: * -> *) b.
(Sayable saytag (WithContext a), Functor t, Foldable t) =>
t a -> WithContext b -> Text -> Saying saytag
ctxLst' [CVQualifier]
cvqs WithContext Type_
wc Text
" "
  Saying saytag -> Maybe (WithContext ExceptionSpec) -> Saying saytag
forall (tag :: Symbol) m e.
(Sayable tag m, Sayable tag e) =>
m -> Maybe e -> Saying tag
&? Maybe ExceptionSpec
-> WithContext Type_ -> Maybe (WithContext ExceptionSpec)
forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx Maybe ExceptionSpec
mb'exc WithContext Type_
wc
  Saying saytag -> WithContext Transaction -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Type_ -> Transaction -> WithContext Transaction
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Transaction
trns
  Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ (if Bool
isExternC then Text -> Text
t'Text
" extern \"C\"" else Text -> Text
t'Text
"")
  Saying saytag -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext Type_ -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext Type_
wc Type_
rTy
  Saying saytag -> nm -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- nm
nm Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
'('
  Saying saytag -> [WithContext Type_] -> Saying saytag
forall (tag :: Symbol) m e (t :: * -> *).
(Sayable tag m, Sayable tag e, Foldable t) =>
m -> t e -> Saying tag
&+* (case NonEmpty Type_
argTys of
          BaseType BaseType
Void :| [] -> []
          NonEmpty Type_
_ -> [Type_] -> WithContext Type_ -> [WithContext Type_]
forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx (NonEmpty Type_ -> [Type_]
forall a. NonEmpty a -> [a]
NEL.toList NonEmpty Type_
argTys) WithContext Type_
wc
      )
  Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
  Saying saytag -> Maybe (WithContext RefQualifier) -> Saying saytag
forall (tag :: Symbol) m e.
(Sayable tag m, Sayable tag e) =>
m -> Maybe e -> Saying tag
&? Maybe RefQualifier
-> WithContext Type_ -> Maybe (WithContext RefQualifier)
forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx Maybe RefQualifier
mb'ref WithContext Type_
wc
sayFunctionType Type_
_ nm
_ WithContext Type_
_ = Demangler -> String -> [String] -> Saying saytag
forall a (saytag :: Symbol).
a -> String -> [String] -> Saying saytag
cannotSay Demangler
Demangler String
"sayFunctionType"
                        [ String
"Called with a type that is not a Function!" ]


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''ArrayBound
  ) => Sayable saytag (WithContext ArrayBound) where
  sayable :: WithContext ArrayBound -> Saying saytag
sayable WithContext ArrayBound
wc =
    case WithContext ArrayBound -> ArrayBound
forall a. WithContext a -> a
contextData WithContext ArrayBound
wc of
      ArrayBound
NoBounds -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
""
      NumBound Coord
i -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag Coord
i
      ExprBound Expression
e -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (WithContext Expression -> Saying saytag)
-> WithContext Expression -> Saying saytag
forall a b. (a -> b) -> a -> b
$ WithContext ArrayBound -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ArrayBound
wc Expression
e


instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''ExceptionSpec
  ) => Sayable saytag (WithContext ExceptionSpec) where
  sayable :: WithContext ExceptionSpec -> Saying saytag
sayable WithContext ExceptionSpec
wc =
    case WithContext ExceptionSpec -> ExceptionSpec
forall a. WithContext a -> a
contextData WithContext ExceptionSpec
wc of
      ExceptionSpec
NonThrowing -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
"noexcept"
      ComputedThrow Expression
expr -> Text -> Text
t'Text
"throw" Text -> WithContext Expression -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext ExceptionSpec -> Expression -> WithContext Expression
forall a b. WithContext a -> b -> WithContext b
withContext WithContext ExceptionSpec
wc Expression
expr -- ?
      Throwing NonEmpty Type_
tys -> Text -> Text
t'Text
"throw (" Text -> NonEmpty (WithContext Type_) -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ NonEmpty Type_
-> WithContext ExceptionSpec -> NonEmpty (WithContext Type_)
forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx NonEmpty Type_
tys WithContext ExceptionSpec
wc Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')' -- ?

instance {-# OVERLAPPABLE #-} Sayable saytag (WithContext Transaction) where
  sayable :: WithContext Transaction -> Saying saytag
sayable WithContext Transaction
wc =
    case WithContext Transaction -> Transaction
forall a. WithContext a -> a
contextData WithContext Transaction
wc of
      Transaction
TransactionSafe -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
"safe" -- ?
      Transaction
TransactionUnsafe -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag (Text -> Saying saytag) -> Text -> Saying saytag
forall a b. (a -> b) -> a -> b
$ Text -> Text
t'Text
""

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''BaseType
  ) => Sayable saytag (WithContext BaseType) where
  sayable :: WithContext BaseType -> Saying saytag
sayable WithContext BaseType
wc =
    case BaseType
-> [(BaseType, (Text, Text, Maybe Text))]
-> Maybe (Text, Text, Maybe Text)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup (WithContext BaseType -> BaseType
forall a. WithContext a -> a
contextData WithContext BaseType
wc) [(BaseType, (Text, Text, Maybe Text))]
builtinTypeTable of
      Just (Text
_,Text
s,Maybe Text
_) -> forall (tag :: Symbol) v. Sayable tag v => v -> Saying tag
sayable @saytag Text
s
      Maybe (Text, Text, Maybe Text)
Nothing ->
        case WithContext BaseType -> BaseType
forall a. WithContext a -> a
contextData WithContext BaseType
wc of
          FloatN Natural
n -> Text -> Text
t'Text
"std::float" Text -> Natural -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Natural
n Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"_t"
          FloatNx Natural
n -> Text -> Text
t'Text
"std::float" Text -> Natural -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Natural
n Saying saytag -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Text -> Text
t'Text
"x_t"
          SBitInt Natural
n -> Text -> Text
t'Text
"signed _BitInt(" Text -> Natural -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Natural
n Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
          UBitInt Natural
n -> Text -> Text
t'Text
"unsigned _BitInt(" Text -> Natural -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Natural
n Saying saytag -> Char -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ Char
')'
          VendorExtendedType SourceName
nm Maybe TemplateArgs
mb'ta -> WithContext BaseType -> SourceName -> WithContext SourceName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext BaseType
wc SourceName
nm WithContext SourceName
-> Maybe (WithContext TemplateArgs) -> Saying saytag
forall (tag :: Symbol) m e.
(Sayable tag m, Sayable tag e) =>
m -> Maybe e -> Saying tag
&? Maybe TemplateArgs
-> WithContext BaseType -> Maybe (WithContext TemplateArgs)
forall (t :: * -> *) a b.
Functor t =>
t a -> WithContext b -> t (WithContext a)
wCtx Maybe TemplateArgs
mb'ta WithContext BaseType
wc
          BaseType
t -> Demangler -> String -> [String] -> Saying saytag
forall a (saytag :: Symbol).
a -> String -> [String] -> Saying saytag
cannotSay Demangler
Demangler String
"sayable.Basetype"
               [ String
"Unknown BaseType not listed in the builtinTypeTable"
               , BaseType -> String
forall a. Show a => a -> String
show BaseType
t
               ]

instance {-# OVERLAPPABLE #-} Sayable saytag (WithContext CallOffset) where
  sayable :: WithContext CallOffset -> Saying saytag
sayable WithContext CallOffset
_wc =
    Demangler -> String -> [String] -> Saying saytag
forall a (saytag :: Symbol).
a -> String -> [String] -> Saying saytag
cannotSay Demangler
Demangler String
"Sayable CallOffset"
    [ String
"The CallOffset is for a thunk or covariant return thunk"
    , String
"and is not expected to be printed."
    ]

instance {-# OVERLAPPABLE #-}
  $(sayableConstraints ''SubsCandidate
  ) => Sayable saytag (WithContext SubsCandidate) where
  sayable :: WithContext SubsCandidate -> Saying saytag
sayable WithContext SubsCandidate
wc = -- For debug only
    case WithContext SubsCandidate -> SubsCandidate
forall a. WithContext a -> a
contextData WithContext SubsCandidate
wc of
      SC_Type Type_
t -> Text -> Text
t'Text
"SC_Ty" Text -> WithContext Type_ -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SubsCandidate -> Type_ -> WithContext Type_
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SubsCandidate
wc Type_
t
      SC_UQName Bool
True UnqualifiedName
n -> Text -> Text
t'Text
"SC_UN" Text -> Text -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- Text -> Text
t'Text
"std::" Saying saytag -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&+ WithContext SubsCandidate
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SubsCandidate
wc UnqualifiedName
n
      SC_UQName Bool
_ UnqualifiedName
n -> Text -> Text
t'Text
"SC_UN" Text -> WithContext UnqualifiedName -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SubsCandidate
-> UnqualifiedName -> WithContext UnqualifiedName
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SubsCandidate
wc UnqualifiedName
n
      SC_Prefix Prefix
p -> Text -> Text
t'Text
"SC_PR" Text -> WithContext Prefix -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SubsCandidate -> Prefix -> WithContext Prefix
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SubsCandidate
wc Prefix
p
      SC_TemplatePrefix TemplatePrefix
tp -> Text -> Text
t'Text
"SC_TP" Text -> WithContext TemplatePrefix -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SubsCandidate
-> TemplatePrefix -> WithContext TemplatePrefix
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SubsCandidate
wc TemplatePrefix
tp
      SC_UnresolvedType UnresolvedType
urt -> Text -> Text
t'Text
"SC_URT" Text -> WithContext UnresolvedType -> Saying saytag
forall (saytag :: Symbol) m n.
(Sayable saytag m, Sayable saytag n) =>
m -> n -> Saying saytag
&- WithContext SubsCandidate
-> UnresolvedType -> WithContext UnresolvedType
forall a b. WithContext a -> b -> WithContext b
withContext WithContext SubsCandidate
wc UnresolvedType
urt