%
+% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
This module converts Template Haskell syntax into HsSyn
-
\begin{code}
-module Convert( convertToHsExpr, convertToHsDecls, convertToHsType, thRdrName ) where
+module Convert( convertToHsExpr, convertToHsDecls,
+ convertToHsType, thRdrName ) where
#include "HsVersions.h"
-import Language.Haskell.TH as TH hiding (sigP)
-import Language.Haskell.TH.Syntax as TH
-
import HsSyn as Hs
-import qualified Class (FunDep)
-import RdrName ( RdrName, mkRdrUnqual, mkRdrQual, mkOrig, getRdrName, nameRdrName )
-import qualified Name ( Name, mkInternalName, getName )
-import Module ( ModuleName, mkModuleName, mkModule )
-import RdrHsSyn ( mkClassDecl, mkTyData )
+import qualified Class
+import RdrName
+import qualified Name
+import Module
+import RdrHsSyn
import qualified OccName
-import PackageConfig ( PackageId, stringToPackageId )
-import OccName ( startsVarId, startsVarSym, startsConId, startsConSym,
- pprNameSpace )
-import SrcLoc ( Located(..), SrcSpan )
-import Type ( Type )
-import TysWiredIn ( unitTyCon, tupleTyCon, tupleCon, trueDataCon, nilDataCon, consDataCon )
-import BasicTypes( Boxity(..) )
-import ForeignCall ( Safety(..), CCallConv(..), CCallTarget(..),
- CExportSpec(..))
-import Char ( isAscii, isAlphaNum, isAlpha )
-import List ( partition )
-import Unique ( Unique, mkUniqueGrimily )
-import ErrUtils ( Message )
-import GLAEXTS ( Int(..), Int# )
-import SrcLoc ( noSrcLoc )
-import Bag ( listToBag )
+import PackageConfig
+import OccName
+import SrcLoc
+import Type
+import TysWiredIn
+import BasicTypes
+import ForeignCall
+import Char
+import List
+import Unique
+import ErrUtils
+import Bag
import FastString
import Outputable
+import Language.Haskell.TH as TH hiding (sigP)
+import Language.Haskell.TH.Syntax as TH
+import GHC.Exts
-------------------------------------------------------------------
-- The external interface
= do { (cxt', tc', tvs', _) <- cvt_tycl_hdr ctxt cl tvs
; fds' <- mapM cvt_fundep fds
; (binds', sigs') <- cvtBindsAndSigs decs
- ; returnL $ TyClD $ mkClassDecl (cxt', tc', tvs') fds' sigs' binds' []
- -- no ATs in TH^^
+ ; returnL $ TyClD $ mkClassDecl (cxt', tc', tvs') fds' sigs' binds' [] []
+ -- no ATs or docs in TH ^^ ^^
}
cvtTop (InstanceD tys ty decs)
= do { c' <- cNameL c
; cxt' <- returnL []
; tys' <- mapM cvt_arg strtys
- ; returnL $ ConDecl c' Explicit noExistentials cxt' (PrefixCon tys') ResTyH98 }
+ ; returnL $ ConDecl c' Explicit noExistentials cxt' (PrefixCon tys') ResTyH98 Nothing }
cvtConstr (RecC c varstrtys)
= do { c' <- cNameL c
; cxt' <- returnL []
; args' <- mapM cvt_id_arg varstrtys
- ; returnL $ ConDecl c' Explicit noExistentials cxt' (RecCon args') ResTyH98 }
+ ; returnL $ ConDecl c' Explicit noExistentials cxt' (RecCon args') ResTyH98 Nothing }
cvtConstr (InfixC st1 c st2)
= do { c' <- cNameL c
; cxt' <- returnL []
; st1' <- cvt_arg st1
; st2' <- cvt_arg st2
- ; returnL $ ConDecl c' Explicit noExistentials cxt' (InfixCon st1' st2') ResTyH98 }
+ ; returnL $ ConDecl c' Explicit noExistentials cxt' (InfixCon st1' st2') ResTyH98 Nothing }
cvtConstr (ForallC tvs ctxt (ForallC tvs' ctxt' con'))
= cvtConstr (ForallC (tvs ++ tvs') (ctxt ++ ctxt') con')
; tvs' <- cvtTvs tvs
; ctxt' <- cvtContext ctxt
; case con' of
- ConDecl l _ [] (L _ []) x ResTyH98
- -> returnL $ ConDecl l Explicit tvs' ctxt' x ResTyH98
+ ConDecl l _ [] (L _ []) x ResTyH98 _
+ -> returnL $ ConDecl l Explicit tvs' ctxt' x ResTyH98 Nothing
c -> panic "ForallC: Can't happen" }
cvt_arg (IsStrict, ty) = do { ty' <- cvtType ty; returnL $ HsBangTy HsStrict ty' }
cvt_id_arg (i, str, ty) = do { i' <- vNameL i
; ty' <- cvt_arg (str,ty)
- ; return (i', ty') }
+ ; return (mkRecField i' ty') }
cvtDerivs [] = return Nothing
cvtDerivs cs = do { cs' <- mapM cvt_one cs
; let e = CExport (CExportStatic (mkFastString as) (cvt_conv callconv))
; return $ ForeignExport nm' ty' e }
-cvt_conv CCall = CCallConv
-cvt_conv StdCall = StdCallConv
+cvt_conv TH.CCall = CCallConv
+cvt_conv TH.StdCall = StdCallConv
parse_ccall_impent :: String -> String -> Maybe (FastString, CImportSpec)
parse_ccall_impent nm s
; return $ ExprWithTySig e' t' }
cvt (RecConE c flds) = do { c' <- cNameL c
; flds' <- mapM cvtFld flds
- ; return $ RecordCon c' noPostTcExpr flds' }
+ ; return $ RecordCon c' noPostTcExpr (HsRecordBinds flds') }
cvt (RecUpdE e flds) = do { e' <- cvtl e
; flds' <- mapM cvtFld flds
- ; return $ RecordUpd e' flds' placeHolderType placeHolderType }
+ ; return $ RecordUpd e' (HsRecordBinds flds') placeHolderType placeHolderType }
cvtFld (v,e) = do { v' <- vNameL v; e' <- cvtl e; return (v',e') }
cvtOverLit :: Lit -> CvtM (HsOverLit RdrName)
cvtOverLit (IntegerL i) = do { force i; return $ mkHsIntegral i }
cvtOverLit (RationalL r) = do { force r; return $ mkHsFractional r }
+cvtOverLit (StringL s) = do { let { s' = mkFastString s }; force s'; return $ mkHsIsString s' }
-- An Integer is like an an (overloaded) '3' in a Haskell source program
-- Similarly 3.5 for fractionals
cvtp (ListP ps) = do { ps' <- cvtPats ps; return $ ListPat ps' void }
cvtp (SigP p t) = do { p' <- cvtPat p; t' <- cvtType t; return $ SigPatIn p' t' }
-cvtPatFld (s,p) = do { s' <- vNameL s; p' <- cvtPat p; return (s',p') }
+cvtPatFld (s,p) = do { s' <- vNameL s; p' <- cvtPat p; return (mkRecField s' p') }
-----------------------------------------------------------
-- Types and type variables