{-| Module : Language.JVM.Method Copyright : (c) Christian Gram Kalhauge, 2017 License : MIT Maintainer : kalhuage@cs.ucla.edu -} {-# LANGUAGE DeriveGeneric #-} module Language.JVM.Method ( Method (..) , mAccessFlags , mAttributes , mName , mDescriptor -- * Attributes , mCode , mExceptions ) where import Data.Binary import Data.Set (Set) import qualified Data.Text as Text import GHC.Generics (Generic) import Data.Monoid import Language.JVM.AccessFlag import Language.JVM.Attribute (Attribute, fromAttribute', Code, Exceptions) import Language.JVM.Constant (ConstantRef, ConstantPool, lookupText) import Language.JVM.Utils -- | A Method in the class-file, as described -- [here](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.6). data Method = Method { mAccessFlags' :: BitSet16 MAccessFlag , mNameIndex :: ! ConstantRef , mDescriptorIndex :: ! ConstantRef , mAttributes' :: SizedList16 Attribute } deriving (Show, Eq, Generic) instance Binary Method where -- | Unpack the BitSet and get the AccessFlags as a Set. mAccessFlags :: Method -> Set MAccessFlag mAccessFlags = toSet . mAccessFlags' -- | Unpack the SizedList and get the attributes as a List. mAttributes :: Method -> [Attribute] mAttributes = unSizedList . mAttributes' -- | Lookup the name of the method in the 'ConstantPool'. mName :: ConstantPool -> Method -> Maybe Text.Text mName cp = flip lookupText cp . mNameIndex -- | Lookup the descriptor of the method in the 'ConstantPool'. mDescriptor :: ConstantPool -> Method -> Maybe Text.Text mDescriptor cp = flip lookupText cp . mDescriptorIndex -- | Fetch the 'Code' attribute, if any. -- There can only one be one code attribute on a method. mCode :: ConstantPool -> Method -> Maybe (Either String Code) mCode cp = getFirst . foldMap (First . fromAttribute' cp) . mAttributes -- | Fetch the 'Exceptions' attribute. -- There can only one be one exceptions attribute on a method. mExceptions :: ConstantPool -> Method -> Maybe (Either String Exceptions) mExceptions cp = getFirst . foldMap (First . fromAttribute' cp) . mAttributes