language-java-0.2.9: Language/Java/Syntax/Types.hs
{-# LANGUAGE DeriveDataTypeable, DeriveGeneric #-}
module Language.Java.Syntax.Types where
import Data.Data
import GHC.Generics (Generic)
-- | There are two kinds of types in the Java programming language: primitive types and reference types.
data Type
= PrimType PrimType
| RefType RefType
deriving (Eq,Show,Read,Typeable,Generic,Data)
-- | There are three kinds of reference types: class types, interface types, and array types.
-- Reference types may be parameterized with type arguments.
-- Type variables cannot be syntactically distinguished from class type identifiers,
-- and are thus represented uniformly as single ident class types.
data RefType
= ClassRefType ClassType
{- | TypeVariable Ident -}
| ArrayType Type
deriving (Eq,Show,Read,Typeable,Generic,Data)
-- | A class or interface type consists of a type declaration specifier,
-- optionally followed by type arguments (in which case it is a parameterized type).
data ClassType
= ClassType [(Ident, [TypeArgument])]
deriving (Eq,Show,Read,Typeable,Generic,Data)
-- | Type arguments may be either reference types or wildcards.
data TypeArgument
= Wildcard (Maybe WildcardBound)
| ActualType RefType
deriving (Eq,Show,Read,Typeable,Generic,Data)
data TypeDeclSpecifier
= TypeDeclSpecifier ClassType
| TypeDeclSpecifierWithDiamond ClassType Ident Diamond
| TypeDeclSpecifierUnqualifiedWithDiamond Ident Diamond
deriving (Eq,Show,Read,Typeable,Generic,Data)
data Diamond = Diamond
deriving (Eq,Show,Read,Typeable,Generic,Data)
-- | Wildcards may be given explicit bounds, either upper (@extends@) or lower (@super@) bounds.
data WildcardBound
= ExtendsBound RefType
| SuperBound RefType
deriving (Eq,Show,Read,Typeable,Generic,Data)
-- | A primitive type is predefined by the Java programming language and named by its reserved keyword.
data PrimType
= BooleanT
| ByteT
| ShortT
| IntT
| LongT
| CharT
| FloatT
| DoubleT
deriving (Eq,Show,Read,Typeable,Generic,Data)
-- | A class is generic if it declares one or more type variables. These type variables are known
-- as the type parameters of the class.
data TypeParam = TypeParam Ident [RefType]
deriving (Eq,Show,Read,Typeable,Generic,Data)
-----------------------------------------------------------------------
-- Names and identifiers
-- | A single identifier.
data Ident = Ident String
deriving (Eq,Ord,Show,Read,Typeable,Generic,Data)
-- | A name, i.e. a period-separated list of identifiers.
data Name = Name [Ident]
deriving (Eq,Ord,Show,Read,Typeable,Generic,Data)