module JVM.Data.Abstract.Descriptor where

import Data.Data
import JVM.Data.Abstract.Type (FieldType)
import JVM.Data.Pretty

data MethodDescriptor = MethodDescriptor
    { MethodDescriptor -> [FieldType]
params :: [FieldType]
    , MethodDescriptor -> ReturnDescriptor
returnDesc :: ReturnDescriptor
    }
    deriving (Int -> MethodDescriptor -> ShowS
[MethodDescriptor] -> ShowS
MethodDescriptor -> String
(Int -> MethodDescriptor -> ShowS)
-> (MethodDescriptor -> String)
-> ([MethodDescriptor] -> ShowS)
-> Show MethodDescriptor
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MethodDescriptor -> ShowS
showsPrec :: Int -> MethodDescriptor -> ShowS
$cshow :: MethodDescriptor -> String
show :: MethodDescriptor -> String
$cshowList :: [MethodDescriptor] -> ShowS
showList :: [MethodDescriptor] -> ShowS
Show, MethodDescriptor -> MethodDescriptor -> Bool
(MethodDescriptor -> MethodDescriptor -> Bool)
-> (MethodDescriptor -> MethodDescriptor -> Bool)
-> Eq MethodDescriptor
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MethodDescriptor -> MethodDescriptor -> Bool
== :: MethodDescriptor -> MethodDescriptor -> Bool
$c/= :: MethodDescriptor -> MethodDescriptor -> Bool
/= :: MethodDescriptor -> MethodDescriptor -> Bool
Eq, Eq MethodDescriptor
Eq MethodDescriptor =>
(MethodDescriptor -> MethodDescriptor -> Ordering)
-> (MethodDescriptor -> MethodDescriptor -> Bool)
-> (MethodDescriptor -> MethodDescriptor -> Bool)
-> (MethodDescriptor -> MethodDescriptor -> Bool)
-> (MethodDescriptor -> MethodDescriptor -> Bool)
-> (MethodDescriptor -> MethodDescriptor -> MethodDescriptor)
-> (MethodDescriptor -> MethodDescriptor -> MethodDescriptor)
-> Ord MethodDescriptor
MethodDescriptor -> MethodDescriptor -> Bool
MethodDescriptor -> MethodDescriptor -> Ordering
MethodDescriptor -> MethodDescriptor -> MethodDescriptor
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MethodDescriptor -> MethodDescriptor -> Ordering
compare :: MethodDescriptor -> MethodDescriptor -> Ordering
$c< :: MethodDescriptor -> MethodDescriptor -> Bool
< :: MethodDescriptor -> MethodDescriptor -> Bool
$c<= :: MethodDescriptor -> MethodDescriptor -> Bool
<= :: MethodDescriptor -> MethodDescriptor -> Bool
$c> :: MethodDescriptor -> MethodDescriptor -> Bool
> :: MethodDescriptor -> MethodDescriptor -> Bool
$c>= :: MethodDescriptor -> MethodDescriptor -> Bool
>= :: MethodDescriptor -> MethodDescriptor -> Bool
$cmax :: MethodDescriptor -> MethodDescriptor -> MethodDescriptor
max :: MethodDescriptor -> MethodDescriptor -> MethodDescriptor
$cmin :: MethodDescriptor -> MethodDescriptor -> MethodDescriptor
min :: MethodDescriptor -> MethodDescriptor -> MethodDescriptor
Ord, Typeable MethodDescriptor
Typeable MethodDescriptor =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> MethodDescriptor -> c MethodDescriptor)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c MethodDescriptor)
-> (MethodDescriptor -> Constr)
-> (MethodDescriptor -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c MethodDescriptor))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c MethodDescriptor))
-> ((forall b. Data b => b -> b)
    -> MethodDescriptor -> MethodDescriptor)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> MethodDescriptor -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> MethodDescriptor -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> MethodDescriptor -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> MethodDescriptor -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> MethodDescriptor -> m MethodDescriptor)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> MethodDescriptor -> m MethodDescriptor)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> MethodDescriptor -> m MethodDescriptor)
-> Data MethodDescriptor
MethodDescriptor -> Constr
MethodDescriptor -> DataType
(forall b. Data b => b -> b)
-> MethodDescriptor -> MethodDescriptor
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> MethodDescriptor -> u
forall u. (forall d. Data d => d -> u) -> MethodDescriptor -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MethodDescriptor -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MethodDescriptor -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MethodDescriptor -> m MethodDescriptor
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MethodDescriptor -> m MethodDescriptor
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MethodDescriptor
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MethodDescriptor -> c MethodDescriptor
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MethodDescriptor)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MethodDescriptor)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MethodDescriptor -> c MethodDescriptor
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MethodDescriptor -> c MethodDescriptor
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MethodDescriptor
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MethodDescriptor
$ctoConstr :: MethodDescriptor -> Constr
toConstr :: MethodDescriptor -> Constr
$cdataTypeOf :: MethodDescriptor -> DataType
dataTypeOf :: MethodDescriptor -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MethodDescriptor)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MethodDescriptor)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MethodDescriptor)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MethodDescriptor)
$cgmapT :: (forall b. Data b => b -> b)
-> MethodDescriptor -> MethodDescriptor
gmapT :: (forall b. Data b => b -> b)
-> MethodDescriptor -> MethodDescriptor
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MethodDescriptor -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MethodDescriptor -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MethodDescriptor -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MethodDescriptor -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> MethodDescriptor -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> MethodDescriptor -> [u]
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> MethodDescriptor -> u
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> MethodDescriptor -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MethodDescriptor -> m MethodDescriptor
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MethodDescriptor -> m MethodDescriptor
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MethodDescriptor -> m MethodDescriptor
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MethodDescriptor -> m MethodDescriptor
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MethodDescriptor -> m MethodDescriptor
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MethodDescriptor -> m MethodDescriptor
Data)

instance Pretty MethodDescriptor where
    pretty :: forall ann. MethodDescriptor -> Doc ann
pretty (MethodDescriptor [FieldType]
params ReturnDescriptor
ret) = Doc ann
"(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (FieldType -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FieldType -> Doc ann
pretty (FieldType -> Doc ann) -> [FieldType] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [FieldType]
params) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> ReturnDescriptor -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ReturnDescriptor -> Doc ann
pretty ReturnDescriptor
ret

methodParam :: MethodDescriptor -> Int -> Maybe FieldType
methodParam :: MethodDescriptor -> Int -> Maybe FieldType
methodParam (MethodDescriptor [FieldType]
params ReturnDescriptor
_) Int
i = [FieldType]
params [FieldType] -> Int -> Maybe FieldType
forall {t} {a}. (Eq t, Num t) => [a] -> t -> Maybe a
!!? Int
i
  where
    [] !!? :: [a] -> t -> Maybe a
!!? t
_ = Maybe a
forall a. Maybe a
Nothing
    (a
x : [a]
_) !!? t
0 = a -> Maybe a
forall a. a -> Maybe a
Just a
x
    (a
_ : [a]
xs) !!? t
n = [a]
xs [a] -> t -> Maybe a
!!? (t
n t -> t -> t
forall a. Num a => a -> a -> a
- t
1)

data ReturnDescriptor
    = VoidReturn
    | TypeReturn FieldType
    deriving (Int -> ReturnDescriptor -> ShowS
[ReturnDescriptor] -> ShowS
ReturnDescriptor -> String
(Int -> ReturnDescriptor -> ShowS)
-> (ReturnDescriptor -> String)
-> ([ReturnDescriptor] -> ShowS)
-> Show ReturnDescriptor
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ReturnDescriptor -> ShowS
showsPrec :: Int -> ReturnDescriptor -> ShowS
$cshow :: ReturnDescriptor -> String
show :: ReturnDescriptor -> String
$cshowList :: [ReturnDescriptor] -> ShowS
showList :: [ReturnDescriptor] -> ShowS
Show, ReturnDescriptor -> ReturnDescriptor -> Bool
(ReturnDescriptor -> ReturnDescriptor -> Bool)
-> (ReturnDescriptor -> ReturnDescriptor -> Bool)
-> Eq ReturnDescriptor
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ReturnDescriptor -> ReturnDescriptor -> Bool
== :: ReturnDescriptor -> ReturnDescriptor -> Bool
$c/= :: ReturnDescriptor -> ReturnDescriptor -> Bool
/= :: ReturnDescriptor -> ReturnDescriptor -> Bool
Eq, Eq ReturnDescriptor
Eq ReturnDescriptor =>
(ReturnDescriptor -> ReturnDescriptor -> Ordering)
-> (ReturnDescriptor -> ReturnDescriptor -> Bool)
-> (ReturnDescriptor -> ReturnDescriptor -> Bool)
-> (ReturnDescriptor -> ReturnDescriptor -> Bool)
-> (ReturnDescriptor -> ReturnDescriptor -> Bool)
-> (ReturnDescriptor -> ReturnDescriptor -> ReturnDescriptor)
-> (ReturnDescriptor -> ReturnDescriptor -> ReturnDescriptor)
-> Ord ReturnDescriptor
ReturnDescriptor -> ReturnDescriptor -> Bool
ReturnDescriptor -> ReturnDescriptor -> Ordering
ReturnDescriptor -> ReturnDescriptor -> ReturnDescriptor
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ReturnDescriptor -> ReturnDescriptor -> Ordering
compare :: ReturnDescriptor -> ReturnDescriptor -> Ordering
$c< :: ReturnDescriptor -> ReturnDescriptor -> Bool
< :: ReturnDescriptor -> ReturnDescriptor -> Bool
$c<= :: ReturnDescriptor -> ReturnDescriptor -> Bool
<= :: ReturnDescriptor -> ReturnDescriptor -> Bool
$c> :: ReturnDescriptor -> ReturnDescriptor -> Bool
> :: ReturnDescriptor -> ReturnDescriptor -> Bool
$c>= :: ReturnDescriptor -> ReturnDescriptor -> Bool
>= :: ReturnDescriptor -> ReturnDescriptor -> Bool
$cmax :: ReturnDescriptor -> ReturnDescriptor -> ReturnDescriptor
max :: ReturnDescriptor -> ReturnDescriptor -> ReturnDescriptor
$cmin :: ReturnDescriptor -> ReturnDescriptor -> ReturnDescriptor
min :: ReturnDescriptor -> ReturnDescriptor -> ReturnDescriptor
Ord, Typeable ReturnDescriptor
Typeable ReturnDescriptor =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> ReturnDescriptor -> c ReturnDescriptor)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c ReturnDescriptor)
-> (ReturnDescriptor -> Constr)
-> (ReturnDescriptor -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c ReturnDescriptor))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c ReturnDescriptor))
-> ((forall b. Data b => b -> b)
    -> ReturnDescriptor -> ReturnDescriptor)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> ReturnDescriptor -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> ReturnDescriptor -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> ReturnDescriptor -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> ReturnDescriptor -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> ReturnDescriptor -> m ReturnDescriptor)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> ReturnDescriptor -> m ReturnDescriptor)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> ReturnDescriptor -> m ReturnDescriptor)
-> Data ReturnDescriptor
ReturnDescriptor -> Constr
ReturnDescriptor -> DataType
(forall b. Data b => b -> b)
-> ReturnDescriptor -> ReturnDescriptor
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> ReturnDescriptor -> u
forall u. (forall d. Data d => d -> u) -> ReturnDescriptor -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ReturnDescriptor -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ReturnDescriptor -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ReturnDescriptor -> m ReturnDescriptor
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ReturnDescriptor -> m ReturnDescriptor
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ReturnDescriptor
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ReturnDescriptor -> c ReturnDescriptor
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ReturnDescriptor)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ReturnDescriptor)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ReturnDescriptor -> c ReturnDescriptor
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ReturnDescriptor -> c ReturnDescriptor
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ReturnDescriptor
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ReturnDescriptor
$ctoConstr :: ReturnDescriptor -> Constr
toConstr :: ReturnDescriptor -> Constr
$cdataTypeOf :: ReturnDescriptor -> DataType
dataTypeOf :: ReturnDescriptor -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ReturnDescriptor)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ReturnDescriptor)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ReturnDescriptor)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ReturnDescriptor)
$cgmapT :: (forall b. Data b => b -> b)
-> ReturnDescriptor -> ReturnDescriptor
gmapT :: (forall b. Data b => b -> b)
-> ReturnDescriptor -> ReturnDescriptor
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ReturnDescriptor -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ReturnDescriptor -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ReturnDescriptor -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ReturnDescriptor -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ReturnDescriptor -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ReturnDescriptor -> [u]
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> ReturnDescriptor -> u
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> ReturnDescriptor -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ReturnDescriptor -> m ReturnDescriptor
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ReturnDescriptor -> m ReturnDescriptor
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ReturnDescriptor -> m ReturnDescriptor
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ReturnDescriptor -> m ReturnDescriptor
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ReturnDescriptor -> m ReturnDescriptor
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ReturnDescriptor -> m ReturnDescriptor
Data)

instance Pretty ReturnDescriptor where
    pretty :: forall ann. ReturnDescriptor -> Doc ann
pretty ReturnDescriptor
VoidReturn = Doc ann
"V"
    pretty (TypeReturn FieldType
t) = FieldType -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FieldType -> Doc ann
pretty FieldType
t

returnDescriptorType :: ReturnDescriptor -> Maybe FieldType
returnDescriptorType :: ReturnDescriptor -> Maybe FieldType
returnDescriptorType ReturnDescriptor
VoidReturn = Maybe FieldType
forall a. Maybe a
Nothing
returnDescriptorType (TypeReturn FieldType
t) = FieldType -> Maybe FieldType
forall a. a -> Maybe a
Just FieldType
t