{-# LANGUAGE DuplicateRecordFields #-}

-- | High level representation of a class file
module JVM.Data.Abstract.ClassFile where

import Data.Data
import Data.Text (Text)
import Data.TypeMergingList (DataMergeable (merge), TypeMergingList, errorDifferentConstructors, toList)
import JVM.Data.Abstract.ClassFile.AccessFlags (ClassAccessFlag)
import JVM.Data.Abstract.ClassFile.Field (ClassFileField)
import JVM.Data.Abstract.ClassFile.Method (ClassFileMethod)
import JVM.Data.Abstract.ConstantPool (BootstrapMethod)
import JVM.Data.Abstract.Name
import JVM.Data.JVMVersion (JVMVersion)
import JVM.Data.Pretty
import Prettyprinter (encloseSep, line, parens)

data ClassFile = ClassFile
    { ClassFile -> QualifiedClassName
name :: QualifiedClassName
    , ClassFile -> JVMVersion
version :: JVMVersion
    , ClassFile -> [ClassAccessFlag]
accessFlags :: [ClassAccessFlag]
    , ClassFile -> Maybe QualifiedClassName
superClass :: Maybe QualifiedClassName
    , ClassFile -> [QualifiedClassName]
interfaces :: [QualifiedClassName]
    , ClassFile -> [ClassFileField]
fields :: [ClassFileField]
    , ClassFile -> [ClassFileMethod]
methods :: [ClassFileMethod]
    , ClassFile -> TypeMergingList ClassFileAttribute
attributes :: TypeMergingList ClassFileAttribute
    }
    deriving (Int -> ClassFile -> ShowS
[ClassFile] -> ShowS
ClassFile -> String
(Int -> ClassFile -> ShowS)
-> (ClassFile -> String)
-> ([ClassFile] -> ShowS)
-> Show ClassFile
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ClassFile -> ShowS
showsPrec :: Int -> ClassFile -> ShowS
$cshow :: ClassFile -> String
show :: ClassFile -> String
$cshowList :: [ClassFile] -> ShowS
showList :: [ClassFile] -> ShowS
Show)

data ClassFileAttribute
    = InnerClasses [InnerClassInfo]
    | EnclosingMethod
    | Synthetic
    | Signature
    | SourceFile Text
    | SourceDebugExtension
    | Deprecated
    | RuntimeVisibleAnnotations
    | RuntimeInvisibleAnnotations
    | BootstrapMethods [BootstrapMethod]
    deriving (Int -> ClassFileAttribute -> ShowS
[ClassFileAttribute] -> ShowS
ClassFileAttribute -> String
(Int -> ClassFileAttribute -> ShowS)
-> (ClassFileAttribute -> String)
-> ([ClassFileAttribute] -> ShowS)
-> Show ClassFileAttribute
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ClassFileAttribute -> ShowS
showsPrec :: Int -> ClassFileAttribute -> ShowS
$cshow :: ClassFileAttribute -> String
show :: ClassFileAttribute -> String
$cshowList :: [ClassFileAttribute] -> ShowS
showList :: [ClassFileAttribute] -> ShowS
Show, ClassFileAttribute -> ClassFileAttribute -> Bool
(ClassFileAttribute -> ClassFileAttribute -> Bool)
-> (ClassFileAttribute -> ClassFileAttribute -> Bool)
-> Eq ClassFileAttribute
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ClassFileAttribute -> ClassFileAttribute -> Bool
== :: ClassFileAttribute -> ClassFileAttribute -> Bool
$c/= :: ClassFileAttribute -> ClassFileAttribute -> Bool
/= :: ClassFileAttribute -> ClassFileAttribute -> Bool
Eq, Typeable ClassFileAttribute
Typeable ClassFileAttribute =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g)
 -> ClassFileAttribute
 -> c ClassFileAttribute)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c ClassFileAttribute)
-> (ClassFileAttribute -> Constr)
-> (ClassFileAttribute -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c ClassFileAttribute))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c ClassFileAttribute))
-> ((forall b. Data b => b -> b)
    -> ClassFileAttribute -> ClassFileAttribute)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> ClassFileAttribute -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> ClassFileAttribute -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> ClassFileAttribute -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> ClassFileAttribute -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> ClassFileAttribute -> m ClassFileAttribute)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> ClassFileAttribute -> m ClassFileAttribute)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> ClassFileAttribute -> m ClassFileAttribute)
-> Data ClassFileAttribute
ClassFileAttribute -> Constr
ClassFileAttribute -> DataType
(forall b. Data b => b -> b)
-> ClassFileAttribute -> ClassFileAttribute
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) -> ClassFileAttribute -> u
forall u. (forall d. Data d => d -> u) -> ClassFileAttribute -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ClassFileAttribute -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ClassFileAttribute -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ClassFileAttribute -> m ClassFileAttribute
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ClassFileAttribute -> m ClassFileAttribute
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ClassFileAttribute
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> ClassFileAttribute
-> c ClassFileAttribute
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ClassFileAttribute)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ClassFileAttribute)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> ClassFileAttribute
-> c ClassFileAttribute
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> ClassFileAttribute
-> c ClassFileAttribute
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ClassFileAttribute
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ClassFileAttribute
$ctoConstr :: ClassFileAttribute -> Constr
toConstr :: ClassFileAttribute -> Constr
$cdataTypeOf :: ClassFileAttribute -> DataType
dataTypeOf :: ClassFileAttribute -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ClassFileAttribute)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ClassFileAttribute)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ClassFileAttribute)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ClassFileAttribute)
$cgmapT :: (forall b. Data b => b -> b)
-> ClassFileAttribute -> ClassFileAttribute
gmapT :: (forall b. Data b => b -> b)
-> ClassFileAttribute -> ClassFileAttribute
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ClassFileAttribute -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ClassFileAttribute -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ClassFileAttribute -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ClassFileAttribute -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ClassFileAttribute -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ClassFileAttribute -> [u]
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> ClassFileAttribute -> u
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> ClassFileAttribute -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ClassFileAttribute -> m ClassFileAttribute
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ClassFileAttribute -> m ClassFileAttribute
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ClassFileAttribute -> m ClassFileAttribute
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ClassFileAttribute -> m ClassFileAttribute
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ClassFileAttribute -> m ClassFileAttribute
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ClassFileAttribute -> m ClassFileAttribute
Data)

instance DataMergeable ClassFileAttribute where
    merge :: ClassFileAttribute -> ClassFileAttribute -> ClassFileAttribute
merge (InnerClasses [InnerClassInfo]
a) (InnerClasses [InnerClassInfo]
b) = [InnerClassInfo] -> ClassFileAttribute
InnerClasses ([InnerClassInfo]
a [InnerClassInfo] -> [InnerClassInfo] -> [InnerClassInfo]
forall a. Semigroup a => a -> a -> a
<> [InnerClassInfo]
b)
    merge ClassFileAttribute
EnclosingMethod ClassFileAttribute
EnclosingMethod = ClassFileAttribute
EnclosingMethod
    merge ClassFileAttribute
Synthetic ClassFileAttribute
Synthetic = ClassFileAttribute
Synthetic
    merge ClassFileAttribute
Signature ClassFileAttribute
Signature = ClassFileAttribute
Signature
    merge (SourceFile Text
a) (SourceFile Text
b) = Text -> ClassFileAttribute
SourceFile (Text
a Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
b)
    merge ClassFileAttribute
SourceDebugExtension ClassFileAttribute
SourceDebugExtension = ClassFileAttribute
SourceDebugExtension
    merge ClassFileAttribute
Deprecated ClassFileAttribute
Deprecated = ClassFileAttribute
Deprecated
    merge ClassFileAttribute
RuntimeVisibleAnnotations ClassFileAttribute
RuntimeVisibleAnnotations = ClassFileAttribute
RuntimeVisibleAnnotations
    merge ClassFileAttribute
RuntimeInvisibleAnnotations ClassFileAttribute
RuntimeInvisibleAnnotations = ClassFileAttribute
RuntimeInvisibleAnnotations
    merge (BootstrapMethods [BootstrapMethod]
a) (BootstrapMethods [BootstrapMethod]
b) = [BootstrapMethod] -> ClassFileAttribute
BootstrapMethods ([BootstrapMethod]
a [BootstrapMethod] -> [BootstrapMethod] -> [BootstrapMethod]
forall a. Semigroup a => a -> a -> a
<> [BootstrapMethod]
b)
    merge ClassFileAttribute
a ClassFileAttribute
b = ClassFileAttribute -> ClassFileAttribute -> ClassFileAttribute
forall a b. Data a => a -> a -> b
errorDifferentConstructors ClassFileAttribute
a ClassFileAttribute
b

data InnerClassInfo = InnerClassInfo
    { InnerClassInfo -> QualifiedClassName
innerClassInfo :: QualifiedClassName
    , InnerClassInfo -> QualifiedClassName
outerClassInfo :: QualifiedClassName
    , InnerClassInfo -> Text
innerName :: Text
    , InnerClassInfo -> [ClassAccessFlag]
accessFlags :: [ClassAccessFlag]
    }
    deriving (Int -> InnerClassInfo -> ShowS
[InnerClassInfo] -> ShowS
InnerClassInfo -> String
(Int -> InnerClassInfo -> ShowS)
-> (InnerClassInfo -> String)
-> ([InnerClassInfo] -> ShowS)
-> Show InnerClassInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InnerClassInfo -> ShowS
showsPrec :: Int -> InnerClassInfo -> ShowS
$cshow :: InnerClassInfo -> String
show :: InnerClassInfo -> String
$cshowList :: [InnerClassInfo] -> ShowS
showList :: [InnerClassInfo] -> ShowS
Show, InnerClassInfo -> InnerClassInfo -> Bool
(InnerClassInfo -> InnerClassInfo -> Bool)
-> (InnerClassInfo -> InnerClassInfo -> Bool) -> Eq InnerClassInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InnerClassInfo -> InnerClassInfo -> Bool
== :: InnerClassInfo -> InnerClassInfo -> Bool
$c/= :: InnerClassInfo -> InnerClassInfo -> Bool
/= :: InnerClassInfo -> InnerClassInfo -> Bool
Eq, Typeable InnerClassInfo
Typeable InnerClassInfo =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> InnerClassInfo -> c InnerClassInfo)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c InnerClassInfo)
-> (InnerClassInfo -> Constr)
-> (InnerClassInfo -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c InnerClassInfo))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c InnerClassInfo))
-> ((forall b. Data b => b -> b)
    -> InnerClassInfo -> InnerClassInfo)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> InnerClassInfo -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> InnerClassInfo -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> InnerClassInfo -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> InnerClassInfo -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> InnerClassInfo -> m InnerClassInfo)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> InnerClassInfo -> m InnerClassInfo)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> InnerClassInfo -> m InnerClassInfo)
-> Data InnerClassInfo
InnerClassInfo -> Constr
InnerClassInfo -> DataType
(forall b. Data b => b -> b) -> InnerClassInfo -> InnerClassInfo
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) -> InnerClassInfo -> u
forall u. (forall d. Data d => d -> u) -> InnerClassInfo -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> InnerClassInfo -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> InnerClassInfo -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> InnerClassInfo -> m InnerClassInfo
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> InnerClassInfo -> m InnerClassInfo
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c InnerClassInfo
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> InnerClassInfo -> c InnerClassInfo
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c InnerClassInfo)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c InnerClassInfo)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> InnerClassInfo -> c InnerClassInfo
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> InnerClassInfo -> c InnerClassInfo
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c InnerClassInfo
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c InnerClassInfo
$ctoConstr :: InnerClassInfo -> Constr
toConstr :: InnerClassInfo -> Constr
$cdataTypeOf :: InnerClassInfo -> DataType
dataTypeOf :: InnerClassInfo -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c InnerClassInfo)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c InnerClassInfo)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c InnerClassInfo)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c InnerClassInfo)
$cgmapT :: (forall b. Data b => b -> b) -> InnerClassInfo -> InnerClassInfo
gmapT :: (forall b. Data b => b -> b) -> InnerClassInfo -> InnerClassInfo
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> InnerClassInfo -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> InnerClassInfo -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> InnerClassInfo -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> InnerClassInfo -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> InnerClassInfo -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> InnerClassInfo -> [u]
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> InnerClassInfo -> u
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> InnerClassInfo -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> InnerClassInfo -> m InnerClassInfo
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> InnerClassInfo -> m InnerClassInfo
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> InnerClassInfo -> m InnerClassInfo
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> InnerClassInfo -> m InnerClassInfo
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> InnerClassInfo -> m InnerClassInfo
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> InnerClassInfo -> m InnerClassInfo
Data)

instance Pretty ClassFile where
    pretty :: forall ann. ClassFile -> Doc ann
pretty ClassFile{QualifiedClassName
name :: ClassFile -> QualifiedClassName
name :: QualifiedClassName
name, JVMVersion
version :: ClassFile -> JVMVersion
version :: JVMVersion
version, [ClassAccessFlag]
accessFlags :: ClassFile -> [ClassAccessFlag]
accessFlags :: [ClassAccessFlag]
accessFlags, Maybe QualifiedClassName
superClass :: ClassFile -> Maybe QualifiedClassName
superClass :: Maybe QualifiedClassName
superClass, [QualifiedClassName]
interfaces :: ClassFile -> [QualifiedClassName]
interfaces :: [QualifiedClassName]
interfaces, [ClassFileField]
fields :: ClassFile -> [ClassFileField]
fields :: [ClassFileField]
fields, [ClassFileMethod]
methods :: ClassFile -> [ClassFileMethod]
methods :: [ClassFileMethod]
methods, TypeMergingList ClassFileAttribute
attributes :: ClassFile -> TypeMergingList ClassFileAttribute
attributes :: TypeMergingList ClassFileAttribute
attributes} =
        [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (ClassAccessFlag -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ClassAccessFlag -> Doc ann
pretty (ClassAccessFlag -> Doc ann) -> [ClassAccessFlag] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ClassAccessFlag]
accessFlags)
            Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"class"
            Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> QualifiedClassName -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. QualifiedClassName -> Doc ann
pretty QualifiedClassName
name
            Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (JVMVersion -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. JVMVersion -> Doc ann
pretty JVMVersion
version)
            Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
-> (QualifiedClassName -> Doc ann)
-> Maybe QualifiedClassName
-> Doc ann
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc ann
"" ((Doc ann
"extends" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+>) (Doc ann -> Doc ann)
-> (QualifiedClassName -> Doc ann) -> QualifiedClassName -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QualifiedClassName -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. QualifiedClassName -> Doc ann
pretty) Maybe QualifiedClassName
superClass
            Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> (if [QualifiedClassName] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [QualifiedClassName]
interfaces then Doc ann
"" else Doc ann
"implements" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [QualifiedClassName] -> Doc ann
forall ann. [QualifiedClassName] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [QualifiedClassName]
interfaces)
            Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
body
      where
        body :: Doc ann
body = Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
encloseSep Doc ann
open Doc ann
close Doc ann
forall {ann}. Doc ann
sep ((ClassFileField -> Doc ann) -> [ClassFileField] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map ClassFileField -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ClassFileField -> Doc ann
pretty [ClassFileField]
fields [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. [a] -> [a] -> [a]
++ (ClassFileMethod -> Doc ann) -> [ClassFileMethod] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map ClassFileMethod -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ClassFileMethod -> Doc ann
pretty [ClassFileMethod]
methods [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. [a] -> [a] -> [a]
++ (ClassFileAttribute -> Doc ann)
-> [ClassFileAttribute] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map ClassFileAttribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ClassFileAttribute -> Doc ann
pretty (TypeMergingList ClassFileAttribute -> [ClassFileAttribute]
forall a. TypeMergingList a -> [a]
toList TypeMergingList ClassFileAttribute
attributes))
        open :: Doc ann
open = Doc ann
"{"
        close :: Doc ann
close = Doc ann
"}"
        sep :: Doc ann
sep = Doc ann
forall {ann}. Doc ann
line

instance Pretty ClassFileAttribute where
    pretty :: forall ann. ClassFileAttribute -> Doc ann
pretty (InnerClasses [InnerClassInfo]
xs) = Doc ann
"InnerClasses" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [InnerClassInfo] -> Doc ann
forall ann. [InnerClassInfo] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [InnerClassInfo]
xs
    pretty ClassFileAttribute
EnclosingMethod = Doc ann
"EnclosingMethod"
    pretty ClassFileAttribute
Synthetic = Doc ann
"Synthetic"
    pretty ClassFileAttribute
Signature = Doc ann
"Signature"
    pretty (SourceFile Text
x) = Doc ann
"SourceFile" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty Text
x
    pretty ClassFileAttribute
SourceDebugExtension = Doc ann
"SourceDebugExtension"
    pretty ClassFileAttribute
Deprecated = Doc ann
"Deprecated"
    pretty ClassFileAttribute
RuntimeVisibleAnnotations = Doc ann
"RuntimeVisibleAnnotations"
    pretty ClassFileAttribute
RuntimeInvisibleAnnotations = Doc ann
"RuntimeInvisibleAnnotations"
    pretty (BootstrapMethods [BootstrapMethod]
xs) = Doc ann
"BootstrapMethods" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [BootstrapMethod] -> Doc ann
forall ann. [BootstrapMethod] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [BootstrapMethod]
xs

instance Pretty InnerClassInfo where
    pretty :: forall ann. InnerClassInfo -> Doc ann
pretty InnerClassInfo{QualifiedClassName
innerClassInfo :: InnerClassInfo -> QualifiedClassName
innerClassInfo :: QualifiedClassName
innerClassInfo, QualifiedClassName
outerClassInfo :: InnerClassInfo -> QualifiedClassName
outerClassInfo :: QualifiedClassName
outerClassInfo, Text
innerName :: InnerClassInfo -> Text
innerName :: Text
innerName, [ClassAccessFlag]
accessFlags :: InnerClassInfo -> [ClassAccessFlag]
accessFlags :: [ClassAccessFlag]
accessFlags} =
        [ClassAccessFlag] -> Doc ann
forall ann. [ClassAccessFlag] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [ClassAccessFlag]
accessFlags Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"inner class" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> QualifiedClassName -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. QualifiedClassName -> Doc ann
pretty QualifiedClassName
innerClassInfo Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"in" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> QualifiedClassName -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. QualifiedClassName -> Doc ann
pretty QualifiedClassName
outerClassInfo Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"named" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty Text
innerName