% -----------------------------------------------------------------------------
% $Id: HsSyn.lhs,v 1.5 2002/04/26 11:18:57 simonmar Exp $
%
% (c) The GHC Team, 1997-2002
%
% A suite of datatypes describing the abstract syntax of Haskell 98.
%
% -----------------------------------------------------------------------------
\begin{code}
module HsSyn (
SrcLoc(..), Module(..), HsQName(..), HsName(..), HsIdentifier(..),
HsModule(..), HsExportSpec(..),
HsImportDecl(..), HsImportSpec(..), HsAssoc(..),
HsDecl(..), HsMatch(..), HsConDecl(..), HsFieldDecl(..),
HsBangType(..), HsRhs(..),
HsGuardedRhs(..), HsType(..), HsContext, HsAsst,
HsLiteral(..), HsExp(..), HsPat(..), HsPatField(..), HsStmt(..),
HsFieldUpdate(..), HsAlt(..), HsGuardedAlts(..), HsGuardedAlt(..),
HsCallConv(..), HsFISafety(..), HsFunDep,
mkHsForAllType,
prelude_mod, main_mod,
unit_con_name, tuple_con_name, nil_con_name,
as_name, qualified_name, hiding_name, minus_name, pling_name, dot_name,
forall_name, unsafe_name, safe_name, threadsafe_name, export_name,
stdcall_name, ccall_name, dotnet_name,
unit_tycon_name, fun_tycon_name, list_tycon_name, tuple_tycon_name,
unit_tycon, fun_tycon, list_tycon, tuple_tycon,
) where
data SrcLoc = SrcLoc Int Int -- (Line, Indentation)
deriving (Eq,Ord,Show)
newtype Module = Module String
deriving (Eq,Ord,Show)
data HsQName
= Qual Module HsName
| UnQual HsName
deriving (Eq,Ord)
instance Show HsQName where
showsPrec _ (Qual (Module m) s) =
showString m . showString "." . shows s
showsPrec _ (UnQual s) = shows s
data HsName
= HsTyClsName HsIdentifier
| HsVarName HsIdentifier
deriving (Eq,Ord)
instance Show HsName where
showsPrec p (HsTyClsName i) = showsPrec p i
showsPrec p (HsVarName i) = showsPrec p i
data HsIdentifier
= HsIdent String
| HsSymbol String
| HsSpecial String
deriving (Eq,Ord)
instance Show HsIdentifier where
showsPrec _ (HsIdent s) = showString s
showsPrec _ (HsSymbol s) = showString s
showsPrec _ (HsSpecial s) = showString s
data HsModule = HsModule Module (Maybe [HsExportSpec])
[HsImportDecl] [HsDecl] (Maybe String)
deriving Show
-- Export/Import Specifications
data HsExportSpec
= HsEVar HsQName -- variable
| HsEAbs HsQName -- T
| HsEThingAll HsQName -- T(..)
| HsEThingWith HsQName [HsQName] -- T(C_1,...,C_n)
| HsEModuleContents Module -- module M (not for imports)
| HsEGroup Int String -- a doc section heading
| HsEDoc String -- some documentation
| HsEDocNamed String -- a reference to named doc
deriving (Eq,Show)
data HsImportDecl
= HsImportDecl SrcLoc Module Bool (Maybe Module)
(Maybe (Bool,[HsImportSpec]))
deriving (Eq,Show)
data HsImportSpec
= HsIVar HsName -- variable
| HsIAbs HsName -- T
| HsIThingAll HsName -- T(..)
| HsIThingWith HsName [HsName] -- T(C_1,...,C_n)
deriving (Eq,Show)
data HsAssoc
= HsAssocNone
| HsAssocLeft
| HsAssocRight
deriving (Eq,Show)
data HsFISafety
= HsFIUnsafe
| HsFISafe
| HsFIThreadSafe
deriving (Eq,Show)
data HsCallConv
= HsCCall
| HsStdCall
| HsDotNetCall
deriving (Eq,Show)
data HsDecl
= HsTypeDecl SrcLoc HsName [HsName] HsType
| HsDataDecl SrcLoc HsContext HsName [HsName] [HsConDecl] [HsQName]
| HsInfixDecl SrcLoc HsAssoc Int [HsName]
| HsNewTypeDecl SrcLoc HsContext HsName [HsName] HsConDecl [HsQName]
| HsClassDecl SrcLoc HsType [HsFunDep] [HsDecl]
| HsInstDecl SrcLoc HsType [HsDecl]
| HsDefaultDecl SrcLoc [HsType]
| HsTypeSig SrcLoc [HsName] HsType
| HsFunBind [HsMatch]
| HsPatBind SrcLoc HsPat HsRhs {-where-} [HsDecl]
| HsForeignImport SrcLoc HsCallConv HsFISafety String HsName HsType
| HsForeignExport SrcLoc HsCallConv String HsName HsType
| HsDocCommentNext String -- a documentation annotation
| HsDocCommentPrev String -- a documentation annotation
| HsDocCommentNamed String -- a documentation annotation
| HsDocGroup Int String -- a documentation group
deriving (Eq,Show)
data HsMatch
= HsMatch SrcLoc HsQName [HsPat] HsRhs {-where-} [HsDecl]
deriving (Eq,Show)
data HsConDecl
= HsConDecl SrcLoc HsName [HsBangType] (Maybe String)
| HsRecDecl SrcLoc HsName [HsFieldDecl] (Maybe String)
deriving (Eq,Show)
data HsFieldDecl
= HsFieldDecl [HsName] HsBangType (Maybe String)
deriving (Eq,Show)
data HsBangType
= HsBangedTy HsType
| HsUnBangedTy HsType
deriving (Eq,Show)
data HsRhs
= HsUnGuardedRhs HsExp
| HsGuardedRhss [HsGuardedRhs]
deriving (Eq,Show)
data HsGuardedRhs
= HsGuardedRhs SrcLoc [HsStmt] HsExp
deriving (Eq,Show)
data HsType
= HsForAllType (Maybe [HsName]) HsContext HsType
| HsTyFun HsType HsType
| HsTyTuple Bool{-boxed-} [HsType]
| HsTyApp HsType HsType
| HsTyVar HsName
| HsTyCon HsQName
deriving (Eq,Show)
type HsFunDep = ([HsName], [HsName])
type HsContext = [HsAsst]
type HsAsst = (HsQName,[HsType]) -- for multi-parameter type classes
data HsLiteral
= HsInt Integer
| HsChar Char
| HsString String
| HsFrac Rational
-- GHC unboxed literals:
| HsCharPrim Char
| HsStringPrim String
| HsIntPrim Integer
| HsFloatPrim Rational
| HsDoublePrim Rational
deriving (Eq, Show)
data HsExp
= HsVar HsQName
| HsCon HsQName
| HsLit HsLiteral
| HsInfixApp HsExp HsExp HsExp
| HsApp HsExp HsExp
| HsNegApp HsExp
| HsLambda [HsPat] HsExp
| HsLet [HsDecl] HsExp
| HsIf HsExp HsExp HsExp
| HsCase HsExp [HsAlt]
| HsDo [HsStmt]
| HsTuple Bool{-boxed-} [HsExp]
| HsList [HsExp]
| HsParen HsExp
| HsLeftSection HsExp HsExp
| HsRightSection HsExp HsExp
| HsRecConstr HsQName [HsFieldUpdate]
| HsRecUpdate HsExp [HsFieldUpdate]
| HsEnumFrom HsExp
| HsEnumFromTo HsExp HsExp
| HsEnumFromThen HsExp HsExp
| HsEnumFromThenTo HsExp HsExp HsExp
| HsListComp HsExp [HsStmt]
| HsExpTypeSig SrcLoc HsExp HsType
| HsAsPat HsName HsExp -- pattern only
| HsWildCard -- ditto
| HsIrrPat HsExp -- ditto
-- HsCCall (ghc extension)
-- HsSCC (ghc extension)
deriving (Eq,Show)
data HsPat
= HsPVar HsName
| HsPLit HsLiteral
| HsPNeg HsPat
| HsPInfixApp HsPat HsQName HsPat
| HsPApp HsQName [HsPat]
| HsPTuple Bool{-boxed-} [HsPat]
| HsPList [HsPat]
| HsPParen HsPat
| HsPRec HsQName [HsPatField]
| HsPAsPat HsName HsPat
| HsPWildCard
| HsPIrrPat HsPat
| HsPTypeSig HsPat HsType
deriving (Eq,Show)
data HsPatField
= HsPFieldPat HsQName HsPat
deriving (Eq,Show)
data HsStmt
= HsGenerator HsPat HsExp
| HsQualifier HsExp
| HsLetStmt [HsDecl]
deriving (Eq,Show)
data HsFieldUpdate
= HsFieldUpdate HsQName HsExp
deriving (Eq,Show)
data HsAlt
= HsAlt SrcLoc HsPat HsGuardedAlts [HsDecl]
deriving (Eq,Show)
data HsGuardedAlts
= HsUnGuardedAlt HsExp
| HsGuardedAlts [HsGuardedAlt]
deriving (Eq,Show)
data HsGuardedAlt
= HsGuardedAlt SrcLoc [HsStmt] HsExp
deriving (Eq,Show)
-----------------------------------------------------------------------------
-- Smart constructors
-- pinched from GHC
mkHsForAllType (Just []) [] ty = ty -- Explicit for-all with no tyvars
mkHsForAllType mtvs1 [] (HsForAllType mtvs2 ctxt ty)
= mkHsForAllType (mtvs1 `plus` mtvs2) ctxt ty
where
mtvs1 `plus` Nothing = mtvs1
Nothing `plus` mtvs2 = mtvs2
(Just tvs1) `plus` (Just tvs2) = Just (tvs1 ++ tvs2)
mkHsForAllType tvs ctxt ty = HsForAllType tvs ctxt ty
-----------------------------------------------------------------------------
-- Builtin names.
prelude_mod = Module "Prelude"
main_mod = Module "Main"
unit_ident = HsSpecial "()"
tuple_ident i = HsSpecial ("("++replicate i ','++")")
nil_ident = HsSpecial "[]"
unit_con_name = Qual prelude_mod (HsVarName unit_ident)
tuple_con_name i = Qual prelude_mod (HsVarName (tuple_ident i))
nil_con_name = Qual prelude_mod (HsVarName nil_ident)
as_name = HsVarName (HsIdent "as")
qualified_name = HsVarName (HsIdent "qualified")
hiding_name = HsVarName (HsIdent "hiding")
unsafe_name = HsVarName (HsIdent "unsafe")
safe_name = HsVarName (HsIdent "safe")
forall_name = HsVarName (HsIdent "threadsafe")
threadsafe_name = HsVarName (HsIdent "threadsafe")
export_name = HsVarName (HsIdent "export")
ccall_name = HsVarName (HsIdent "ccall")
stdcall_name = HsVarName (HsIdent "stdcall")
dotnet_name = HsVarName (HsIdent "dotnet")
minus_name = HsVarName (HsSymbol "-")
pling_name = HsVarName (HsSymbol "!")
dot_name = HsVarName (HsSymbol ".")
unit_tycon_name = Qual prelude_mod (HsTyClsName unit_ident)
fun_tycon_name = Qual prelude_mod (HsTyClsName (HsSpecial "->"))
list_tycon_name = Qual prelude_mod (HsTyClsName (HsSpecial "[]"))
tuple_tycon_name i = Qual prelude_mod (HsTyClsName (tuple_ident i))
unit_tycon = HsTyCon unit_tycon_name
fun_tycon = HsTyCon fun_tycon_name
list_tycon = HsTyCon list_tycon_name
tuple_tycon i = HsTyCon (tuple_tycon_name i)
\end{code}