module H2JVM.ClassFile.Field (
ClassFileField (..),
FieldAttribute (..),
ConstantValue (..),
)
where
import Data.Text (Text)
import H2JVM.ClassFile.AccessFlags (FieldAccessFlag)
import H2JVM.Internal.Pretty (Pretty (pretty), hsep, (<+>))
import H2JVM.Internal.Raw.Types (JVMDouble, JVMFloat, JVMInt, JVMLong, JVMString)
import H2JVM.Type (FieldType)
data ClassFileField = ClassFileField
{ ClassFileField -> [FieldAccessFlag]
fieldAccessFlags :: [FieldAccessFlag]
, ClassFileField -> Text
fieldName :: Text
, ClassFileField -> FieldType
fieldType :: FieldType
, ClassFileField -> [FieldAttribute]
fieldAttributes :: [FieldAttribute]
}
deriving (Int -> ClassFileField -> ShowS
[ClassFileField] -> ShowS
ClassFileField -> String
(Int -> ClassFileField -> ShowS)
-> (ClassFileField -> String)
-> ([ClassFileField] -> ShowS)
-> Show ClassFileField
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ClassFileField -> ShowS
showsPrec :: Int -> ClassFileField -> ShowS
$cshow :: ClassFileField -> String
show :: ClassFileField -> String
$cshowList :: [ClassFileField] -> ShowS
showList :: [ClassFileField] -> ShowS
Show)
data FieldAttribute
=
ConstantValue ConstantValue
| Synthetic
deriving (Int -> FieldAttribute -> ShowS
[FieldAttribute] -> ShowS
FieldAttribute -> String
(Int -> FieldAttribute -> ShowS)
-> (FieldAttribute -> String)
-> ([FieldAttribute] -> ShowS)
-> Show FieldAttribute
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FieldAttribute -> ShowS
showsPrec :: Int -> FieldAttribute -> ShowS
$cshow :: FieldAttribute -> String
show :: FieldAttribute -> String
$cshowList :: [FieldAttribute] -> ShowS
showList :: [FieldAttribute] -> ShowS
Show)
data ConstantValue
= ConstantLong JVMLong
| ConstantFloat JVMFloat
| ConstantDouble JVMDouble
| ConstantInteger JVMInt
| ConstantString JVMString
deriving (Int -> ConstantValue -> ShowS
[ConstantValue] -> ShowS
ConstantValue -> String
(Int -> ConstantValue -> ShowS)
-> (ConstantValue -> String)
-> ([ConstantValue] -> ShowS)
-> Show ConstantValue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ConstantValue -> ShowS
showsPrec :: Int -> ConstantValue -> ShowS
$cshow :: ConstantValue -> String
show :: ConstantValue -> String
$cshowList :: [ConstantValue] -> ShowS
showList :: [ConstantValue] -> ShowS
Show)
instance Pretty ClassFileField where
pretty :: forall ann. ClassFileField -> Doc ann
pretty (ClassFileField [FieldAccessFlag]
accessFlags Text
name FieldType
fieldType [FieldAttribute]
attributes) =
[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (FieldAccessFlag -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FieldAccessFlag -> Doc ann
pretty (FieldAccessFlag -> Doc ann) -> [FieldAccessFlag] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [FieldAccessFlag]
accessFlags) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> FieldType -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FieldType -> Doc ann
pretty FieldType
fieldType 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
<> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty Text
name 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
<> [FieldAttribute] -> Doc ann
forall ann. [FieldAttribute] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [FieldAttribute]
attributes
instance Pretty FieldAttribute where
pretty :: forall ann. FieldAttribute -> Doc ann
pretty (ConstantValue ConstantValue
v) = Doc ann
"ConstantValue " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> ConstantValue -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ConstantValue -> Doc ann
pretty ConstantValue
v
pretty FieldAttribute
Synthetic = Doc ann
"Synthetic"
instance Pretty ConstantValue where
pretty :: forall ann. ConstantValue -> Doc ann
pretty (ConstantLong JVMLong
v) = Doc ann
"ConstantLong " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> JVMLong -> Doc ann
forall ann. JVMLong -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty JVMLong
v
pretty (ConstantFloat JVMFloat
v) = Doc ann
"ConstantFloat " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> JVMFloat -> Doc ann
forall ann. JVMFloat -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty JVMFloat
v
pretty (ConstantDouble JVMDouble
v) = Doc ann
"ConstantDouble " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> JVMDouble -> Doc ann
forall ann. JVMDouble -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty JVMDouble
v
pretty (ConstantInteger JVMInt
v) = Doc ann
"ConstantInteger " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> JVMInt -> Doc ann
forall ann. JVMInt -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty JVMInt
v
pretty (ConstantString Text
v) = Doc ann
"ConstantString " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty Text
v