module Language.Java.Class.ConstantPool(
ConstantPool(..)
, AsConstantPool(..)
, ConstantPoolError(..)
, AsConstantPoolCountUnexpectedEof(..)
, constantPoolCountUnexpectedEof
, AsConstantPoolConstantPoolInfoError(..)
, constantPool
, constantPool'
) where
import Control.Applicative(Applicative, liftA2)
import Control.Category((.), id)
import Control.Lens(Choice, Optic', Cons, AsEmpty, Profunctor, prism', iso, isn't, ( # ))
import Control.Lens.Internal.Prism
import Control.Monad(Monad(return))
import Control.Replicate(replicateN)
import Data.Bool(bool, (&&))
import Data.Char(Char)
import Data.Eq(Eq)
import Data.Functor((<$>), Functor)
import Data.Functor.Identity(Identity)
import Data.Int(Int64)
import Data.Maybe(Maybe(Just, Nothing))
import Data.Ord(Ord)
import Data.Tagged(Tagged)
import Data.Tickle(Get, word16be, (!-), (!!-))
import Data.Word(Word8, Word16)
import Language.Java.Class.ConstantPoolInfo(AsConstantPoolInfoTagUnexpectedEof(_ConstantPoolInfoTagUnexpectedEof), AsConstantPoolInfoUtf8LengthUnexpectedEof(_ConstantPoolInfoUtf8LengthUnexpectedEof), AsConstantPoolInfoUtf8UnexpectedEof(_ConstantPoolInfoUtf8UnexpectedEof), AsConstantPoolInvalidJavaString(_ConstantPoolInvalidJavaString), AsConstantPoolInfoConstantIntegerUnexpectedEof(_ConstantPoolInfoConstantIntegerUnexpectedEof), AsConstantPoolInfoConstantFloatUnexpectedEof(_ConstantPoolInfoConstantFloatUnexpectedEof), AsConstantPoolInfoConstantLongUnexpectedEof(_ConstantPoolInfoConstantLongUnexpectedEof), AsConstantPoolInfoConstantDoubleUnexpectedEof(_ConstantPoolInfoConstantDoubleUnexpectedEof), AsConstantPoolInfoConstantClassUnexpectedEof(_ConstantPoolInfoConstantClassUnexpectedEof), AsConstantPoolInfoConstantStringUnexpectedEof(_ConstantPoolInfoConstantStringUnexpectedEof), AsConstantPoolInfoFieldRef1UnexpectedEof(_ConstantPoolInfoFieldRef1UnexpectedEof), AsConstantPoolInfoFieldRef2UnexpectedEof(_ConstantPoolInfoFieldRef2UnexpectedEof), AsConstantPoolInfoMethodRef1UnexpectedEof(_ConstantPoolInfoMethodRef1UnexpectedEof), AsConstantPoolInfoMethodRef2UnexpectedEof(_ConstantPoolInfoMethodRef2UnexpectedEof), AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof(_ConstantPoolInfoInterfaceMethodRef1UnexpectedEof), AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof(_ConstantPoolInfoInterfaceMethodRef2UnexpectedEof), AsConstantPoolInfoNameAndType1UnexpectedEof(_ConstantPoolInfoNameAndType1UnexpectedEof), AsConstantPoolInfoNameAndType2UnexpectedEof(_ConstantPoolInfoNameAndType2UnexpectedEof), AsConstantPoolInfoInvalidConstantPoolTag(_ConstantPoolInfoInvalidConstantPoolTag), ConstantPoolInfo, ConstantPoolInfoError, constantPoolInfo, _ConstantDouble, _ConstantLong, AsUtf8, AsConstantLong, AsConstantFloat, AsConstantInteger, AsConstantString, AsInterfaceMethodRef, AsMethodRef, AsFieldRef, AsConstantClass, AsNameAndType, AsConstantDouble)
import Prelude(Show, Num(()), Double, subtract)
data ConstantPool p c =
ConstantPool
Word16
(c (ConstantPoolInfo p))
deriving instance Eq (c (ConstantPoolInfo p)) => Eq (ConstantPool p c)
deriving instance Ord (c (ConstantPoolInfo p)) => Ord (ConstantPool p c)
deriving instance Show (c (ConstantPoolInfo p)) => Show (ConstantPool p c)
class AsConstantPool p f s where
_ConstantPool ::
Optic' p f (s p' c) (Word16, c (ConstantPoolInfo p'))
instance (Profunctor p, Functor f) => AsConstantPool p f ConstantPool where
_ConstantPool =
iso
(\(ConstantPool w i) -> (w, i))
(\(w, i) -> ConstantPool w i)
data ConstantPoolError c =
ConstantPoolCountUnexpectedEof
| ConstantPoolConstantPoolInfoError (ConstantPoolInfoError c)
deriving instance Eq (ConstantPoolInfoError c) => Eq (ConstantPoolError c)
deriving instance Ord (ConstantPoolInfoError c) => Ord (ConstantPoolError c)
deriving instance Show (ConstantPoolInfoError c) => Show (ConstantPoolError c)
class AsConstantPoolCountUnexpectedEof p f s where
_ConstantPoolCountUnexpectedEof ::
Optic' p f s ()
instance (Choice p, Applicative f) => AsConstantPoolCountUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolCountUnexpectedEof =
prism'
(\() -> ConstantPoolCountUnexpectedEof)
(\e -> case e of
ConstantPoolCountUnexpectedEof -> Just ()
_ -> Nothing)
constantPoolCountUnexpectedEof ::
AsConstantPoolCountUnexpectedEof Tagged Identity t =>
t
constantPoolCountUnexpectedEof =
_ConstantPoolCountUnexpectedEof # ()
class AsConstantPoolConstantPoolInfoError p f s where
_ConstantPoolConstantPoolInfoError ::
Optic' p f (s c) (ConstantPoolInfoError c)
instance (Choice p, Applicative f) => AsConstantPoolConstantPoolInfoError p f ConstantPoolError where
_ConstantPoolConstantPoolInfoError =
prism'
ConstantPoolConstantPoolInfoError
(\e -> case e of
ConstantPoolConstantPoolInfoError r -> Just r
_ -> Nothing)
instance (Choice p, Applicative f) => AsConstantPoolInfoTagUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoTagUnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoTagUnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoUtf8LengthUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoUtf8LengthUnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoUtf8LengthUnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoUtf8UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoUtf8UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoUtf8UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInvalidJavaString p f ConstantPoolError where
_ConstantPoolInvalidJavaString =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInvalidJavaString
instance (Choice p, Applicative f) => AsConstantPoolInfoConstantIntegerUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoConstantIntegerUnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantIntegerUnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoConstantFloatUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoConstantFloatUnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantFloatUnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoConstantLongUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoConstantLongUnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantLongUnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoConstantDoubleUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoConstantDoubleUnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantDoubleUnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoConstantClassUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoConstantClassUnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantClassUnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoConstantStringUnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoConstantStringUnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoConstantStringUnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoFieldRef1UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoFieldRef1UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoFieldRef1UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoFieldRef2UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoFieldRef2UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoFieldRef2UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoMethodRef1UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoMethodRef1UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoMethodRef1UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoMethodRef2UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoMethodRef2UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoMethodRef2UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoInterfaceMethodRef1UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoInterfaceMethodRef1UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoInterfaceMethodRef1UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoInterfaceMethodRef2UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoInterfaceMethodRef2UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoInterfaceMethodRef2UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoNameAndType1UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoNameAndType1UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoNameAndType1UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoNameAndType2UnexpectedEof p f (ConstantPoolError c) where
_ConstantPoolInfoNameAndType2UnexpectedEof =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoNameAndType2UnexpectedEof
instance (Choice p, Applicative f) => AsConstantPoolInfoInvalidConstantPoolTag p f (ConstantPoolError c) where
_ConstantPoolInfoInvalidConstantPoolTag =
_ConstantPoolConstantPoolInfoError . _ConstantPoolInfoInvalidConstantPoolTag
constantPool ::
(AsEmpty (c Word8), AsEmpty (q Char),
AsEmpty (c1 (ConstantPoolInfo p')),
Cons
(c Word8)
(c Word8)
Word8
Word8,
Cons (q Char) (q Char) Char Char,
Cons
(c1 (ConstantPoolInfo p'))
(c1 (ConstantPoolInfo p'))
(s1 q)
(s1 q),
AsUtf8 Tagged Identity s1,
AsNameAndType Tagged Identity (s1 q),
AsConstantDouble Tagged Identity (s1 q),
AsConstantDouble
(Market Double Double) Identity (s1 q),
AsConstantLong Tagged Identity (s1 q),
AsConstantLong
(Market Int64 Int64)
Identity
(s1 q),
AsConstantFloat Tagged Identity (s1 q),
AsConstantInteger Tagged Identity (s1 q),
AsConstantString Tagged Identity (s1 q),
AsInterfaceMethodRef Tagged Identity (s1 q),
AsMethodRef Tagged Identity (s1 q),
AsFieldRef Tagged Identity (s1 q),
AsConstantClass Tagged Identity (s1 q),
AsConstantPoolConstantPoolInfoError Tagged Identity s,
AsConstantPoolCountUnexpectedEof Tagged Identity (s c),
AsConstantPool Tagged Identity s2) =>
Get (s c) (s2 p' c1)
constantPool =
constantPool' constantPoolInfo
constantPool' ::
(AsEmpty (c1 (ConstantPoolInfo p')),
Cons (c1 (ConstantPoolInfo p')) (c1 (ConstantPoolInfo p')) a a,
AsConstantDouble (Market Double Double) Identity a,
AsConstantLong (Market Int64 Int64) Identity a,
AsConstantPoolConstantPoolInfoError Tagged Identity s,
AsConstantPoolCountUnexpectedEof Tagged Identity (s c),
AsConstantPool Tagged Identity s1) =>
Get (ConstantPoolInfoError c) a
-> Get (s c) (s1 p' c1)
constantPool' cpi =
let jump =
bool (subtract 1) id . liftA2 (&&) (isn't _ConstantLong) (isn't _ConstantDouble)
in do constant_pool_count <- constantPoolCountUnexpectedEof !- word16be
pool <- (_ConstantPoolConstantPoolInfoError #) !!- replicateN (\n -> (\i -> (jump i n, i)) <$> cpi) (constant_pool_count 1)
return (_ConstantPool # (constant_pool_count, pool))