{-# LANGUAGE QuasiQuotes, OverloadedStrings, RecordWildCards #-}
module Language.Bond.Codegen.Java.Util
( qualifiedDeclaredTypeName
, generatedClassAnnotations
, modifierConstantName
, isPrimitiveNonEnumBondType
, isPrimitiveBondType
, isGenericBondStructType
, twosComplement
) where
import Prelude
import Data.List (intercalate)
import Data.Text.Lazy (Text)
import Text.Shakespeare.Text
import Language.Bond.Syntax.Types
import Language.Bond.Syntax.Util
import Language.Bond.Codegen.TypeMapping
import Language.Bond.Codegen.Util()
qualifiedDeclaredTypeName :: MappingContext -> Declaration -> String
qualifiedDeclaredTypeName java d = intercalate "." $ getDeclNamespace java d ++ [declName d]
generatedClassAnnotations :: Text
generatedClassAnnotations = [lt|@javax.annotation.Generated("gbc")|]
modifierConstantName :: Modifier -> Text
modifierConstantName Optional = [lt|org.bondlib.Modifier.Optional|]
modifierConstantName Required = [lt|org.bondlib.Modifier.Required|]
modifierConstantName RequiredOptional = [lt|org.bondlib.Modifier.RequiredOptional|]
isPrimitiveNonEnumBondType :: Type -> Bool
isPrimitiveNonEnumBondType BT_Int8 = True
isPrimitiveNonEnumBondType BT_Int16 = True
isPrimitiveNonEnumBondType BT_Int32 = True
isPrimitiveNonEnumBondType BT_Int64 = True
isPrimitiveNonEnumBondType BT_UInt8 = True
isPrimitiveNonEnumBondType BT_UInt16 = True
isPrimitiveNonEnumBondType BT_UInt32 = True
isPrimitiveNonEnumBondType BT_UInt64 = True
isPrimitiveNonEnumBondType BT_Float = True
isPrimitiveNonEnumBondType BT_Double = True
isPrimitiveNonEnumBondType BT_Bool = True
isPrimitiveNonEnumBondType BT_String = True
isPrimitiveNonEnumBondType BT_WString = True
isPrimitiveNonEnumBondType BT_MetaName = True
isPrimitiveNonEnumBondType BT_MetaFullName = True
isPrimitiveNonEnumBondType (BT_UserDefined a@Alias {} args) = isPrimitiveNonEnumBondType (resolveAlias a args)
isPrimitiveNonEnumBondType _ = False
isPrimitiveBondType :: Type -> Bool
isPrimitiveBondType (BT_UserDefined Enum {..} _) = True
isPrimitiveBondType t = isPrimitiveNonEnumBondType t
isGenericBondStructType :: Type -> Bool
isGenericBondStructType (BT_UserDefined Struct {..} _) = not (null declParams)
isGenericBondStructType _ = False
twosComplement :: Integer -> Integer -> Integer
twosComplement bitCount value = if value < (2 ^ (bitCount - 1))
then value
else value - (2 ^ bitCount)