module Language.Java.Reflect.Types where
import Foreign.Java.Utils
import Data.Int
import Data.Data
data JavaType
= JBoolean
| JChar
| JByte
| JShort
| JInt
| JLong
| JFloat
| JDouble
| JObj {
typeName :: String
}
| JArr {
componentType :: JavaType
}
deriving (Eq, Ord, Show, Read, Data, Typeable)
printJavaType :: JavaType -> String
printJavaType t = case t of
JBoolean -> "boolean"
JChar -> "char"
JByte -> "byte"
JShort -> "short"
JInt -> "int"
JLong -> "long"
JFloat -> "float"
JDouble -> "double"
JObj n -> n
JArr c -> printJavaType c ++ "[]"
data JavaClass = JavaClass {
className :: String,
classPackage :: Maybe String,
classModName :: String,
classParents :: [String],
classIfaces :: [String],
classConstructors :: [JavaConstructor],
classMethods :: [JavaMethod],
classFields :: [JavaField],
classTypeParams :: [JavaTypeParam],
classEnum :: Bool,
classEnumConstants :: [(Int32, String)],
classIface :: Bool,
classAnnotation :: Bool,
classAbstract :: Bool,
classFinal :: Bool
} deriving (Eq, Show, Read, Data, Typeable)
data JavaClassType = Annotation | Interface | Enum | Class | Exception | Error
deriving (Eq, Ord, Show, Read, Data, Typeable)
classType :: JavaClass -> JavaClassType
classType clazz
| "java.lang.Error" `elem` classParents clazz = Error
| "java.lang.Exception" `elem` classParents clazz = Exception
| classAnnotation clazz = Annotation
| classIface clazz = Interface
| classEnum clazz = Enum
| otherwise = Class
classDependencies :: JavaClass -> [String]
classDependencies clazz = concat [
classParents clazz,
classIfaces clazz,
concatMap fieldDependencies (classFields clazz),
concatMap methodDependencies (classMethods clazz),
concatMap constructorDependencies (classConstructors clazz) ]
classFullName :: JavaClass -> String
classFullName clazz = makeName (classPackage clazz) (className clazz)
data JavaTypeParam = JavaTypeParam {
paramName :: TyVar,
paramBounds :: [JavaGenericType]
} deriving (Eq, Ord, Show, Read, Data, Typeable)
newtype TyVar = TyVar { tyVarName :: String }
deriving (Eq, Ord, Show, Read, Data, Typeable)
data JavaGenericType
=
Wildcard {
jgtBounds :: [JavaGenericType],
jgtLowerBounds :: [JavaGenericType]
}
|
Parameterized {
jgtBasetype :: String,
jgtParameters :: [JavaGenericType]
}
|
GenericArray {
jgtComponentType :: JavaGenericType
}
|
TypeVarReference {
jgtName :: TyVar
}
|
NotSoGeneric {
jgtBasetype :: String
} deriving (Eq, Ord, Show, Read, Data, Typeable)
data JavaGenericTypeType = WildcardT
| ParameterizedT
| GenericArrayT
| TypeVarReferenceT
| NotSoGenericT
jgtType :: JavaGenericType -> JavaGenericTypeType
jgtType t = case t of
(Wildcard _ _) -> WildcardT
(Parameterized _ _) -> ParameterizedT
(GenericArray _) -> GenericArrayT
(TypeVarReference _) -> TypeVarReferenceT
(NotSoGeneric _) -> NotSoGenericT
data JavaField = JavaField {
fieldName :: String,
fieldType :: (JavaType, JavaGenericType),
fieldFinal :: Bool,
fieldStatic :: Bool
} deriving (Eq, Show, Read, Data, Typeable)
fieldDependencies :: JavaField -> [String]
fieldDependencies field = case fst (fieldType field) of
JObj n -> [n]
_ -> []
data JavaMethod = JavaMethod {
methodName :: String,
methodName' :: String,
methodParams :: [(JavaType, JavaGenericType)],
methodReturnType :: (Maybe JavaType, JavaGenericType),
methodExceptions :: [String],
methodTypeParams :: [JavaTypeParam],
methodStatic :: Bool,
methodAbstract :: Bool,
methodFinal :: Bool,
methodNative :: Bool,
methodSynchronized :: Bool
} deriving (Eq, Show, Read, Data, Typeable)
methodDependencies :: JavaMethod -> [String]
methodDependencies method = foldl classReference [] referenced
where
referenced = maybe paramTypes (: paramTypes) (fst $ methodReturnType method)
paramTypes = map fst $ methodParams method
classReference r c = case c of
JObj n -> n : r
_ -> r
data JavaConstructor = JavaConstructor {
constructorParams :: [(JavaType, JavaGenericType)],
constructorExceptions :: [String],
constructorTypeParams :: [JavaTypeParam]
} deriving (Eq, Show, Read, Data, Typeable)
constructorDependencies :: JavaConstructor -> [String]
constructorDependencies constr = foldl classReference []
$ map fst $ constructorParams constr
where
classReference r c = case c of
JObj n -> n : r
_ -> r