2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[PrelInfo]{The @PrelInfo@ interface to the compiler's prelude knowledge}
13 cCallableClassDecl, cReturnableClassDecl,
16 -- Random other things
17 maybeCharLikeCon, maybeIntLikeCon,
20 isCcallishClass, isCreturnableClass, isNoDictClass,
21 isNumericClass, isStandardClass
25 #include "HsVersions.h"
27 import PrelNames ( basicKnownKeyNames,
28 cCallableClassName, cReturnableClassName,
29 hasKey, charDataConKey, intDataConKey,
30 numericClassKeys, standardClassKeys, cCallishClassKeys,
33 import DsMeta ( templateHaskellNames )
34 import NameSet ( nameSetToList )
37 import PrimOp ( allThePrimOps, primOpOcc )
38 import DataCon ( DataCon )
40 import MkId ( mkPrimOpId, wiredInIds )
41 import MkId -- All of it, for re-export
42 import Name ( Name, nameOccName, NamedThing(..) )
43 import RdrName ( mkRdrUnqual, getRdrName )
44 import HsSyn ( HsTyVarBndr(..) )
45 import OccName ( mkVarOcc )
46 import TysPrim ( primTyCons )
47 import TysWiredIn ( wiredInTyCons )
48 import RdrHsSyn ( mkClassDecl )
49 import HscTypes ( TyThing(..), implicitTyThings, TypeEnv, mkTypeEnv,
50 GenAvailInfo(..), RdrAvailInfo )
51 import Class ( Class, classKey, className )
52 import Type ( funTyCon, openTypeKind, liftedTypeKind )
53 import TyCon ( tyConName )
54 import SrcLoc ( noSrcLoc )
58 %************************************************************************
60 \subsection[builtinNameInfo]{Lookup built-in names}
62 %************************************************************************
64 We have two ``builtin name funs,'' one to look up @TyCons@ and
65 @Classes@, the other to look up values.
68 wiredInThings :: [TyThing]
71 [ -- Wired in TyCons and their implicit Ids
73 , implicitTyThings tycon_things
79 , map (AnId . mkPrimOpId) allThePrimOps
82 tycon_things = map ATyCon ([funTyCon] ++ primTyCons ++ wiredInTyCons)
84 wiredInThingEnv :: TypeEnv
85 wiredInThingEnv = mkTypeEnv wiredInThings
87 knownKeyNames :: [Name]
89 = map getName wiredInThings
92 ++ nameSetToList templateHaskellNames
96 We let a lot of "non-standard" values be visible, so that we can make
97 sense of them in interface pragmas. It's cool, though they all have
98 "non-standard" names, so they won't get past the parser in user code.
100 %************************************************************************
102 \subsection{Export lists for pseudo-modules (GHC.Prim)}
104 %************************************************************************
106 GHC.Prim "exports" all the primops and primitive types, some
107 wired-in Ids, and the CCallable & CReturnable classes.
110 ghcPrimExports :: [RdrAvailInfo]
111 = AvailTC cCallableOcc [ cCallableOcc ] :
112 AvailTC cReturnableOcc [ cReturnableOcc ] :
113 map (Avail . nameOccName . idName) ghcPrimIds ++
114 map (Avail . primOpOcc) allThePrimOps ++
115 [ AvailTC occ [occ] |
116 n <- funTyCon : primTyCons, let occ = nameOccName (tyConName n)
119 cCallableOcc = nameOccName cCallableClassName
120 cReturnableOcc = nameOccName cReturnableClassName
124 ([], getRdrName cCallableClassName, [openAlpha])
132 ([], getRdrName cReturnableClassName, [openAlpha])
138 alpha = mkRdrUnqual (mkVarOcc FSLIT("a"))
139 openAlpha = IfaceTyVar alpha openTypeKind
140 liftedAlpha = IfaceTyVar alpha liftedTypeKind
144 %************************************************************************
146 \subsection{Built-in keys}
148 %************************************************************************
150 ToDo: make it do the ``like'' part properly (as in 0.26 and before).
153 maybeCharLikeCon, maybeIntLikeCon :: DataCon -> Bool
154 maybeCharLikeCon con = con `hasKey` charDataConKey
155 maybeIntLikeCon con = con `hasKey` intDataConKey
159 %************************************************************************
161 \subsection{Class predicates}
163 %************************************************************************
166 isCcallishClass, isCreturnableClass, isNoDictClass,
167 isNumericClass, isStandardClass :: Class -> Bool
169 isNumericClass clas = classKey clas `is_elem` numericClassKeys
170 isStandardClass clas = classKey clas `is_elem` standardClassKeys
171 isCcallishClass clas = classKey clas `is_elem` cCallishClassKeys
172 isCreturnableClass clas = className clas == cReturnableClassName
173 isNoDictClass clas = classKey clas `is_elem` noDictClassKeys
174 is_elem = isIn "is_X_Class"