jvm-binary-0.9.0: src/Language/JVM/Attribute/MethodParameters.hs
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StandaloneDeriving #-}
{-|
Module : Language.JVM.Attribute.MethodParameters
Copyright : (c) Christian Gram Kalhauge, 2017
License : MIT
Maintainer : kalhuage@cs.ucla.edu
Based on the MethodParameters Attribute, as documented
[here](http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.24).
-}
module Language.JVM.Attribute.MethodParameters
( MethodParameters(..)
, MethodParameter(..)
)
where
import qualified Data.Text as Text
import Language.JVM.Constant
import Language.JVM.Attribute.Base
import Language.JVM.Staged
import Language.JVM.Utils
import Language.JVM.AccessFlag
-- | 'BootstrapMethods' is an Attribute.
instance IsAttribute (MethodParameters Low) where
attrName = Const "MethodParameters"
-- | Is a list of method parameters, one for each parameter
newtype MethodParameters r = MethodParameters
{ methodParameters :: SizedList8 (MethodParameter r)
}
-- | A method parameter
data MethodParameter r = MethodParameter
{ parameterName :: !(Ref Text.Text r)
, parameterAccessFlags :: !(BitSet16 PAccessFlag)
}
instance Staged MethodParameters where
stage f (MethodParameters m) =
label "BootstrapMethods" $ MethodParameters <$> mapM f m
instance Staged MethodParameter where
evolve (MethodParameter a m) = MethodParameter <$> link a <*> pure m
devolve (MethodParameter a m) = MethodParameter <$> unlink a <*> pure m
$(deriveBaseWithBinary ''MethodParameter)
$(deriveBaseWithBinary ''MethodParameters)