{-|
Module      : Language.JVM.Attribute.BootstrapMethods
Copyright   : (c) Christian Gram Kalhauge, 2017
License     : MIT
Maintainer  : kalhuage@cs.ucla.edu

Based on the BootstrapMethods Attribute, as documented
[here](http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.23).
-}
{-# LANGUAGE DeriveGeneric   #-}

module Language.JVM.Attribute.BootstrapMethods
  ( BootstrapMethods (..)
  , methods
  , BootstrapMethod (..)
  , arguments
  ) where

import           GHC.Generics          (Generic)

import           Data.Binary

import           Language.JVM.Constant (ConstantRef (..))
import           Language.JVM.Utils

-- | Is a list of bootstrapped methods.
data BootstrapMethods = BootstrapMethods
  { methods' :: SizedList16 BootstrapMethod
  } deriving (Show, Eq, Generic)

instance Binary BootstrapMethods where

-- | The methods as list
methods :: BootstrapMethods -> [ BootstrapMethod ]
methods = unSizedList . methods'

-- | A bootstraped methods.
data BootstrapMethod = BootstrapMethod
  { methodIndex :: ConstantRef
  , arguments' :: SizedList16 ConstantRef
  } deriving (Show, Eq, Generic)

-- | The arguments is a cool
arguments :: BootstrapMethod -> [ ConstantRef ]
arguments = unSizedList . arguments'

instance Binary BootstrapMethod where