{-# LANGUAGE DuplicateRecordFields #-}

-- | High level representation of a class file.
module H2JVM.ClassFile (ClassFile (..), ClassFileAttribute (..), InnerClassInfo (..)) where

import Data.Data
import Data.Text (Text)
import Prettyprinter (encloseSep, line, parens)

import H2JVM.ClassFile.AccessFlags (ClassAccessFlag)
import H2JVM.ClassFile.Field (ClassFileField)
import H2JVM.ClassFile.Method (ClassFileMethod)
import H2JVM.ConstantPool (BootstrapMethod)
import H2JVM.Data.TypeMergingList (DataMergeable (merge), TypeMergingList, errorDifferentConstructors, toList)
import H2JVM.Internal.Pretty
import H2JVM.JVMVersion (JVMVersion)
import H2JVM.Name

-- | High-level representation of a Java class file.
data ClassFile = ClassFile
    { ClassFile -> QualifiedClassName
name :: QualifiedClassName
    -- ^ The fully qualified name of the class.
    , ClassFile -> JVMVersion
version :: JVMVersion
    -- ^ The target JVM/Java version
    , ClassFile -> [ClassAccessFlag]
accessFlags :: [ClassAccessFlag]
    -- ^ Access flags and modifiers of the class (e.g. @public@, @abstract@).
    , ClassFile -> Maybe QualifiedClassName
superClass :: Maybe QualifiedClassName
    -- ^ The fully qualified name of the superclass (or 'Nothing' for @java/lang/Object@).
    , ClassFile -> [QualifiedClassName]
interfaces :: [QualifiedClassName]
    -- ^ The fully qualified names of the interfaces implemented by this class.
    , ClassFile -> [ClassFileField]
fields :: [ClassFileField]
    -- ^ Fields defined in the class.
    , ClassFile -> [ClassFileMethod]
methods :: [ClassFileMethod]
    -- ^ Methods defined in the class.
    , ClassFile -> TypeMergingList ClassFileAttribute
attributes :: TypeMergingList ClassFileAttribute
    -- ^ Additional class file attributes.
    }
    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)

-- | Attributes that can be attached to a class file.
data ClassFileAttribute
    = -- | The @InnerClasses@ attribute, specifying the nested/inner class info.
      InnerClasses [InnerClassInfo]
    | -- | The @EnclosingMethod@ attribute.
      EnclosingMethod
    | -- | The @Synthetic@ attribute indicating this class was generated by the compiler.
      Synthetic
    | -- | The @Signature@ attribute for generic type information.
      Signature
    | -- | The name of the source file this class was compiled from.
      SourceFile Text
    | -- | The @SourceDebugExtension@ attribute.
      SourceDebugExtension
    | -- | The @Deprecated@ attribute indicating this class is deprecated.
      Deprecated
    | -- | The annotations visible at runtime.
      RuntimeVisibleAnnotations
    | -- | The annotations invisible at runtime.
      RuntimeInvisibleAnnotations
    | -- | Bootstrap methods for @invokedynamic@ instructions.
      BootstrapMethods [BootstrapMethod]
    deriving (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, 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, 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)

instance DataMergeable ClassFileAttribute where
    merge :: HasCallStack =>
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, HasCallStack) => a -> a -> b
errorDifferentConstructors ClassFileAttribute
a ClassFileAttribute
b

-- | Information about an inner class.
data InnerClassInfo = InnerClassInfo
    { InnerClassInfo -> QualifiedClassName
innerClassInfo :: QualifiedClassName
    -- ^ The inner class being defined.
    , InnerClassInfo -> QualifiedClassName
outerClassInfo :: QualifiedClassName
    -- ^ The enclosing outer class.
    , InnerClassInfo -> Text
innerName :: Text
    -- ^ Simple name of the inner class.
    , InnerClassInfo -> [ClassAccessFlag]
accessFlags :: [ClassAccessFlag]
    -- ^ Access flags of the inner class.
    }
    deriving (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, 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, 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)

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