X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=compiler%2Fprelude%2FTysWiredIn.lhs;h=7606ff6d634c597cc1fc918551b3f483e6cd825d;hb=e4db45612e3efa59251239e1e0b8a0440783b966;hp=436b121adcf2862129cd4d86814f92d3710462d4;hpb=b00b5bc04ff36a551552470060064f0b7d84ca30;p=ghc-hetmet.git diff --git a/compiler/prelude/TysWiredIn.lhs b/compiler/prelude/TysWiredIn.lhs index 436b121..7606ff6 100644 --- a/compiler/prelude/TysWiredIn.lhs +++ b/compiler/prelude/TysWiredIn.lhs @@ -38,9 +38,10 @@ module TysWiredIn ( unitTyCon, unitDataCon, unitDataConId, pairTyCon, unboxedSingletonTyCon, unboxedSingletonDataCon, unboxedPairTyCon, unboxedPairDataCon, + + boxedTupleArr, unboxedTupleArr, unitTy, - voidTy, -- parallel arrays mkPArrTy, @@ -48,8 +49,6 @@ module TysWiredIn ( parrTyCon_RDR, parrTyConName ) where -#include "HsVersions.h" - import {-# SOURCE #-} MkId( mkDataConIds ) -- friends: @@ -59,16 +58,16 @@ import TysPrim -- others: import Constants ( mAX_TUPLE_SIZE ) import Module ( Module ) -import RdrName ( nameRdrName ) +import RdrName import Name ( Name, BuiltInSyntax(..), nameUnique, nameOccName, nameModule, mkWiredInName ) import OccName ( mkOccNameFS, tcName, dataName, mkTupleOcc, mkDataConWorkerOcc ) import DataCon ( DataCon, mkDataCon, dataConWorkId, dataConSourceArity ) -import Var ( TyVar, tyVarKind ) +import Var import TyCon ( TyCon, AlgTyConRhs(DataTyCon), tyConDataCons, mkTupleTyCon, mkAlgTyCon, tyConName, - AlgTyConParent(NoParentTyCon) ) + TyConParent(NoParentTyCon) ) import BasicTypes ( Arity, RecFlag(..), Boxity(..), isBoxed, StrictnessMark(..) ) @@ -85,8 +84,11 @@ import Array import FastString import Outputable +alpha_tyvar :: [TyVar] alpha_tyvar = [alphaTyVar] -alpha_ty = [alphaTy] + +alpha_ty :: [Type] +alpha_ty = [alphaTy] \end{code} @@ -131,37 +133,45 @@ wiredInTyCons = [ unitTyCon -- Not treated like other tuples, because \begin{code} mkWiredInTyConName :: BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name -mkWiredInTyConName built_in mod fs uniq tycon - = mkWiredInName mod (mkOccNameFS tcName fs) uniq +mkWiredInTyConName built_in modu fs unique tycon + = mkWiredInName modu (mkOccNameFS tcName fs) unique (ATyCon tycon) -- Relevant TyCon built_in mkWiredInDataConName :: BuiltInSyntax -> Module -> FastString -> Unique -> DataCon -> Name -mkWiredInDataConName built_in mod fs uniq datacon - = mkWiredInName mod (mkOccNameFS dataName fs) uniq +mkWiredInDataConName built_in modu fs unique datacon + = mkWiredInName modu (mkOccNameFS dataName fs) unique (ADataCon datacon) -- Relevant DataCon built_in -charTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Char") charTyConKey charTyCon -charDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("C#") charDataConKey charDataCon -intTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Int") intTyConKey intTyCon -intDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("I#") intDataConKey intDataCon - -boolTyConName = mkWiredInTyConName UserSyntax gHC_BASE FSLIT("Bool") boolTyConKey boolTyCon -falseDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("False") falseDataConKey falseDataCon -trueDataConName = mkWiredInDataConName UserSyntax gHC_BASE FSLIT("True") trueDataConKey trueDataCon -listTyConName = mkWiredInTyConName BuiltInSyntax gHC_BASE FSLIT("[]") listTyConKey listTyCon -nilDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT("[]") nilDataConKey nilDataCon -consDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE FSLIT(":") consDataConKey consDataCon - -floatTyConName = mkWiredInTyConName UserSyntax gHC_FLOAT FSLIT("Float") floatTyConKey floatTyCon -floatDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("F#") floatDataConKey floatDataCon -doubleTyConName = mkWiredInTyConName UserSyntax gHC_FLOAT FSLIT("Double") doubleTyConKey doubleTyCon -doubleDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT FSLIT("D#") doubleDataConKey doubleDataCon - -parrTyConName = mkWiredInTyConName BuiltInSyntax gHC_PARR FSLIT("[::]") parrTyConKey parrTyCon -parrDataConName = mkWiredInDataConName UserSyntax gHC_PARR FSLIT("PArr") parrDataConKey parrDataCon - +charTyConName, charDataConName, intTyConName, intDataConName :: Name +charTyConName = mkWiredInTyConName UserSyntax gHC_BASE (fsLit "Char") charTyConKey charTyCon +charDataConName = mkWiredInDataConName UserSyntax gHC_BASE (fsLit "C#") charDataConKey charDataCon +intTyConName = mkWiredInTyConName UserSyntax gHC_BASE (fsLit "Int") intTyConKey intTyCon +intDataConName = mkWiredInDataConName UserSyntax gHC_BASE (fsLit "I#") intDataConKey intDataCon + +boolTyConName, falseDataConName, trueDataConName :: Name +boolTyConName = mkWiredInTyConName UserSyntax gHC_BOOL (fsLit "Bool") boolTyConKey boolTyCon +falseDataConName = mkWiredInDataConName UserSyntax gHC_BOOL (fsLit "False") falseDataConKey falseDataCon +trueDataConName = mkWiredInDataConName UserSyntax gHC_BOOL (fsLit "True") trueDataConKey trueDataCon + +listTyConName, nilDataConName, consDataConName :: Name +listTyConName = mkWiredInTyConName BuiltInSyntax gHC_BASE (fsLit "[]") listTyConKey listTyCon +nilDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE (fsLit "[]") nilDataConKey nilDataCon +consDataConName = mkWiredInDataConName BuiltInSyntax gHC_BASE (fsLit ":") consDataConKey consDataCon + +floatTyConName, floatDataConName, doubleTyConName, doubleDataConName :: Name +floatTyConName = mkWiredInTyConName UserSyntax gHC_FLOAT (fsLit "Float") floatTyConKey floatTyCon +floatDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT (fsLit "F#") floatDataConKey floatDataCon +doubleTyConName = mkWiredInTyConName UserSyntax gHC_FLOAT (fsLit "Double") doubleTyConKey doubleTyCon +doubleDataConName = mkWiredInDataConName UserSyntax gHC_FLOAT (fsLit "D#") doubleDataConKey doubleDataCon + +parrTyConName, parrDataConName :: Name +parrTyConName = mkWiredInTyConName BuiltInSyntax gHC_PARR (fsLit "[::]") parrTyConKey parrTyCon +parrDataConName = mkWiredInDataConName UserSyntax gHC_PARR (fsLit "PArr") parrDataConKey parrDataCon + +boolTyCon_RDR, false_RDR, true_RDR, intTyCon_RDR, charTyCon_RDR, + intDataCon_RDR, listTyCon_RDR, consDataCon_RDR, parrTyCon_RDR:: RdrName boolTyCon_RDR = nameRdrName boolTyConName false_RDR = nameRdrName falseDataConName true_RDR = nameRdrName trueDataConName @@ -191,9 +201,12 @@ funKindTyCon_RDR = nameRdrName funKindTyConName %************************************************************************ \begin{code} +pcNonRecDataTyCon :: Name -> [TyVar] -> [DataCon] -> TyCon pcNonRecDataTyCon = pcTyCon False NonRecursive +pcRecDataTyCon :: Name -> [TyVar] -> [DataCon] -> TyCon pcRecDataTyCon = pcTyCon False Recursive +pcTyCon :: Bool -> RecFlag -> Name -> [TyVar] -> [DataCon] -> TyCon pcTyCon is_enum is_rec name tyvars cons = tycon where @@ -234,10 +247,10 @@ pcDataConWithFixity declared_infix dc_name tyvars arg_tys tycon (mkDataConIds bogus_wrap_name wrk_name data_con) - mod = nameModule dc_name + modu = nameModule dc_name wrk_occ = mkDataConWorkerOcc (nameOccName dc_name) wrk_key = incrUnique (nameUnique dc_name) - wrk_name = mkWiredInName mod wrk_occ wrk_key + wrk_name = mkWiredInName modu wrk_occ wrk_key (AnId (dataConWorkId data_con)) UserSyntax bogus_wrap_name = pprPanic "Wired-in data wrapper id" (ppr dc_name) -- Wired-in types are too simple to need wrappers @@ -269,8 +282,8 @@ mk_tuple :: Boxity -> Int -> (TyCon,DataCon) mk_tuple boxity arity = (tycon, tuple_con) where tycon = mkTupleTyCon tc_name tc_kind arity tyvars tuple_con boxity gen_info - mod = mkTupleModule boxity arity - tc_name = mkWiredInName mod (mkTupleOcc tcName boxity arity) tc_uniq + modu = mkTupleModule boxity arity + tc_name = mkWiredInName modu (mkTupleOcc tcName boxity arity) tc_uniq (ATyCon tycon) BuiltInSyntax tc_kind = mkArrowKinds (map tyVarKind tyvars) res_kind res_kind | isBoxed boxity = liftedTypeKind @@ -281,23 +294,31 @@ mk_tuple boxity arity = (tycon, tuple_con) tuple_con = pcDataCon dc_name tyvars tyvar_tys tycon tyvar_tys = mkTyVarTys tyvars - dc_name = mkWiredInName mod (mkTupleOcc dataName boxity arity) dc_uniq + dc_name = mkWiredInName modu (mkTupleOcc dataName boxity arity) dc_uniq (ADataCon tuple_con) BuiltInSyntax tc_uniq = mkTupleTyConUnique boxity arity dc_uniq = mkTupleDataConUnique boxity arity gen_info = True -- Tuples all have generics.. -- hmm: that's a *lot* of code +unitTyCon :: TyCon unitTyCon = tupleTyCon Boxed 0 +unitDataCon :: DataCon unitDataCon = head (tyConDataCons unitTyCon) +unitDataConId :: Id unitDataConId = dataConWorkId unitDataCon +pairTyCon :: TyCon pairTyCon = tupleTyCon Boxed 2 +unboxedSingletonTyCon :: TyCon unboxedSingletonTyCon = tupleTyCon Unboxed 1 +unboxedSingletonDataCon :: DataCon unboxedSingletonDataCon = tupleCon Unboxed 1 +unboxedPairTyCon :: TyCon unboxedPairTyCon = tupleTyCon Unboxed 2 +unboxedPairDataCon :: DataCon unboxedPairDataCon = tupleCon Unboxed 2 \end{code} @@ -308,49 +329,47 @@ unboxedPairDataCon = tupleCon Unboxed 2 %************************************************************************ \begin{code} --- The Void type is represented as a data type with no constructors --- It's a built in type (i.e. there's no way to define it in Haskell; --- the nearest would be --- --- data Void = -- No constructors! --- --- ) It's lifted; there is only one value of this --- type, namely "void", whose semantics is just bottom. --- --- Haskell 98 drops the definition of a Void type, so we just 'simulate' --- voidTy using (). -voidTy = unitTy -\end{code} - - -\begin{code} +charTy :: Type charTy = mkTyConTy charTyCon +charTyCon :: TyCon charTyCon = pcNonRecDataTyCon charTyConName [] [charDataCon] +charDataCon :: DataCon charDataCon = pcDataCon charDataConName [] [charPrimTy] charTyCon +stringTy :: Type stringTy = mkListTy charTy -- convenience only \end{code} \begin{code} +intTy :: Type intTy = mkTyConTy intTyCon +intTyCon :: TyCon intTyCon = pcNonRecDataTyCon intTyConName [] [intDataCon] +intDataCon :: DataCon intDataCon = pcDataCon intDataConName [] [intPrimTy] intTyCon \end{code} \begin{code} +floatTy :: Type floatTy = mkTyConTy floatTyCon +floatTyCon :: TyCon floatTyCon = pcNonRecDataTyCon floatTyConName [] [floatDataCon] +floatDataCon :: DataCon floatDataCon = pcDataCon floatDataConName [] [floatPrimTy] floatTyCon \end{code} \begin{code} +doubleTy :: Type doubleTy = mkTyConTy doubleTyCon -doubleTyCon = pcNonRecDataTyCon doubleTyConName [] [doubleDataCon] -doubleDataCon = pcDataCon doubleDataConName [] [doublePrimTy] doubleTyCon +doubleTyCon :: TyCon +doubleTyCon = pcNonRecDataTyCon doubleTyConName [] [doubleDataCon] + +doubleDataCon :: DataCon +doubleDataCon = pcDataCon doubleDataConName [] [doublePrimTy] doubleTyCon \end{code} @@ -403,14 +422,18 @@ primitive counterpart. {\em END IDLE SPECULATION BY SIMON} \begin{code} +boolTy :: Type boolTy = mkTyConTy boolTyCon +boolTyCon :: TyCon boolTyCon = pcTyCon True NonRecursive boolTyConName [] [falseDataCon, trueDataCon] +falseDataCon, trueDataCon :: DataCon falseDataCon = pcDataCon falseDataConName [] [] boolTyCon trueDataCon = pcDataCon trueDataConName [] [] boolTyCon +falseDataConId, trueDataConId :: Id falseDataConId = dataConWorkId falseDataCon trueDataConId = dataConWorkId trueDataCon \end{code} @@ -434,9 +457,12 @@ data (,) a b = (,,) a b mkListTy :: Type -> Type mkListTy ty = mkTyConApp listTyCon [ty] +listTyCon :: TyCon listTyCon = pcRecDataTyCon listTyConName alpha_tyvar [nilDataCon, consDataCon] +nilDataCon :: DataCon nilDataCon = pcDataCon nilDataConName alpha_tyvar [] listTyCon +consDataCon :: DataCon consDataCon = pcDataConWithFixity True {- Declared infix -} consDataConName alpha_tyvar [alphaTy, mkTyConApp listTyCon alpha_ty] listTyCon @@ -495,7 +521,8 @@ done by enumeration\srcloc{lib/prelude/InTup?.hs}. mkTupleTy :: Boxity -> Int -> [Type] -> Type mkTupleTy boxity arity tys = mkTyConApp (tupleTyCon boxity arity) tys -unitTy = mkTupleTy Boxed 0 [] +unitTy :: Type +unitTy = mkTupleTy Boxed 0 [] \end{code} %************************************************************************ @@ -565,9 +592,9 @@ mkPArrFakeCon arity = data_con tyvar = head alphaTyVars tyvarTys = replicate arity $ mkTyVarTy tyvar nameStr = mkFastString ("MkPArr" ++ show arity) - name = mkWiredInName gHC_PARR (mkOccNameFS dataName nameStr) uniq + name = mkWiredInName gHC_PARR (mkOccNameFS dataName nameStr) unique (ADataCon data_con) UserSyntax - uniq = mkPArrDataConUnique arity + unique = mkPArrDataConUnique arity -- checks whether a data constructor is a fake constructor for parallel arrays --