{-# LANGUAGE LambdaCase #-}

module JVM.Data.Convert.Type where

import Data.Text (Text)
import JVM.Data.Abstract.Name (toInternalName)
import JVM.Data.Abstract.Type qualified as Abs

baseTypeDescriptor :: Abs.PrimitiveType -> Text
baseTypeDescriptor :: PrimitiveType -> Text
baseTypeDescriptor = \case
    PrimitiveType
Abs.Byte -> Text
"B"
    PrimitiveType
Abs.Char -> Text
"C"
    PrimitiveType
Abs.Double -> Text
"D"
    PrimitiveType
Abs.Float -> Text
"F"
    PrimitiveType
Abs.Int -> Text
"I"
    PrimitiveType
Abs.Long -> Text
"J"
    PrimitiveType
Abs.Short -> Text
"S"
    PrimitiveType
Abs.Boolean -> Text
"Z"

fieldTypeDescriptor :: Abs.FieldType -> Text
fieldTypeDescriptor :: FieldType -> Text
fieldTypeDescriptor = \case
    Abs.PrimitiveFieldType PrimitiveType
base -> PrimitiveType -> Text
baseTypeDescriptor PrimitiveType
base
    Abs.ObjectFieldType QualifiedClassName
name -> Text
"L" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> QualifiedClassName -> Text
toInternalName QualifiedClassName
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
";"
    Abs.ArrayFieldType FieldType
fieldType -> Text
"[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> FieldType -> Text
fieldTypeDescriptor FieldType
fieldType

classInfoTypeDescriptor :: Abs.ClassInfoType -> Text
classInfoTypeDescriptor :: ClassInfoType -> Text
classInfoTypeDescriptor = \case
    Abs.ClassInfoType QualifiedClassName
name -> QualifiedClassName -> Text
toInternalName QualifiedClassName
name
    Abs.ArrayClassInfoType ClassInfoType
classInfoType -> Text
"[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ClassInfoType -> Text
classInfoTypeDescriptor ClassInfoType
classInfoType
    Abs.PrimitiveClassInfoType PrimitiveType
base -> PrimitiveType -> Text
baseTypeDescriptor PrimitiveType
base