2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[PrelInfo]{The @PrelInfo@ interface to the compiler's prelude knowledge}
11 wiredInThings, -- Names of wired in things
14 cCallableClassDecl, cReturnableClassDecl,
17 -- Random other things
18 maybeCharLikeCon, maybeIntLikeCon,
21 isCcallishClass, isCreturnableClass, isNoDictClass,
22 isNumericClass, isStandardClass
26 #include "HsVersions.h"
28 import PrelNames ( basicKnownKeyNames,
29 cCallableClassName, cReturnableClassName,
30 hasKey, charDataConKey, intDataConKey,
31 numericClassKeys, standardClassKeys, cCallishClassKeys,
34 import DsMeta ( templateHaskellNames )
35 import NameSet ( nameSetToList )
38 import PrimOp ( allThePrimOps, primOpOcc )
39 import DataCon ( DataCon )
41 import MkId ( mkPrimOpId, wiredInIds )
42 import MkId -- All of it, for re-export
43 import Name ( Name, nameOccName, NamedThing(..) )
44 import RdrName ( mkRdrUnqual, getRdrName )
45 import HsSyn ( HsTyVarBndr(..) )
46 import OccName ( mkVarOcc )
47 import TysPrim ( primTyCons )
48 import TysWiredIn ( wiredInTyCons )
49 import RdrHsSyn ( mkClassDecl )
50 import HscTypes ( TyThing(..), implicitTyThingIds, TypeEnv, mkTypeEnv,
51 GenAvailInfo(..), RdrAvailInfo )
52 import Class ( Class, classKey, className )
53 import Type ( funTyCon, openTypeKind, liftedTypeKind )
54 import TyCon ( tyConName )
55 import SrcLoc ( noSrcLoc )
59 %************************************************************************
61 \subsection[builtinNameInfo]{Lookup built-in names}
63 %************************************************************************
65 We have two ``builtin name funs,'' one to look up @TyCons@ and
66 @Classes@, the other to look up values.
69 wiredInThings :: [TyThing]
72 [ -- Wired in TyCons and their implicit Ids
74 , map AnId (implicitTyThingIds tycon_things)
80 , map (AnId . mkPrimOpId) allThePrimOps
83 tycon_things = map ATyCon ([funTyCon] ++ primTyCons ++ wiredInTyCons)
85 wiredInThingEnv :: TypeEnv
86 wiredInThingEnv = mkTypeEnv wiredInThings
88 knownKeyNames :: [Name]
90 = map getName wiredInThings
93 ++ nameSetToList templateHaskellNames
97 We let a lot of "non-standard" values be visible, so that we can make
98 sense of them in interface pragmas. It's cool, though they all have
99 "non-standard" names, so they won't get past the parser in user code.
101 %************************************************************************
103 \subsection{Export lists for pseudo-modules (GHC.Prim)}
105 %************************************************************************
107 GHC.Prim "exports" all the primops and primitive types, some
108 wired-in Ids, and the CCallable & CReturnable classes.
111 ghcPrimExports :: [RdrAvailInfo]
112 = AvailTC cCallableOcc [ cCallableOcc ] :
113 AvailTC cReturnableOcc [ cReturnableOcc ] :
114 map (Avail . nameOccName . idName) ghcPrimIds ++
115 map (Avail . primOpOcc) allThePrimOps ++
116 [ AvailTC occ [occ] |
117 n <- funTyCon : primTyCons, let occ = nameOccName (tyConName n)
120 cCallableOcc = nameOccName cCallableClassName
121 cReturnableOcc = nameOccName cReturnableClassName
125 ([], getRdrName cCallableClassName, [openAlpha])
133 ([], getRdrName cReturnableClassName, [openAlpha])
139 alpha = mkRdrUnqual (mkVarOcc FSLIT("a"))
140 openAlpha = IfaceTyVar alpha openTypeKind
141 liftedAlpha = IfaceTyVar alpha liftedTypeKind
145 %************************************************************************
147 \subsection{Built-in keys}
149 %************************************************************************
151 ToDo: make it do the ``like'' part properly (as in 0.26 and before).
154 maybeCharLikeCon, maybeIntLikeCon :: DataCon -> Bool
155 maybeCharLikeCon con = con `hasKey` charDataConKey
156 maybeIntLikeCon con = con `hasKey` intDataConKey
160 %************************************************************************
162 \subsection{Class predicates}
164 %************************************************************************
167 isCcallishClass, isCreturnableClass, isNoDictClass,
168 isNumericClass, isStandardClass :: Class -> Bool
170 isNumericClass clas = classKey clas `is_elem` numericClassKeys
171 isStandardClass clas = classKey clas `is_elem` standardClassKeys
172 isCcallishClass clas = classKey clas `is_elem` cCallishClassKeys
173 isCreturnableClass clas = className clas == cReturnableClassName
174 isNoDictClass clas = classKey clas `is_elem` noDictClassKeys
175 is_elem = isIn "is_X_Class"