2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[PrelInfo]{The @PrelInfo@ interface to the compiler's prelude knowledge}
11 builtinNames, -- Names of things whose *unique* must be known, but
12 -- that is all. If something is in here, you know that
13 -- if it's used at all then it's Name will be just as
14 -- it is here, unique and all. Includes all the
16 derivingOccurrences, -- For a given class C, this tells what other
17 derivableClassKeys, -- things are needed as a result of a
23 eqH_Char_RDR, ltH_Char_RDR, eqH_Word_RDR, ltH_Word_RDR,
24 eqH_Addr_RDR, ltH_Addr_RDR, eqH_Float_RDR, ltH_Float_RDR,
25 eqH_Double_RDR, ltH_Double_RDR, eqH_Int_RDR, ltH_Int_RDR,
26 geH_RDR, leH_RDR, minusH_RDR, tagToEnumH_RDR,
28 -- Random other things
29 maybeCharLikeCon, maybeIntLikeCon,
30 needsDataDeclCtxtClassKeys, cCallishClassKeys, cCallishTyKeys,
31 isNoDictClass, isNumericClass, isStandardClass, isCcallishClass,
32 isCreturnableClass, numericTyKeys, fractionalClassKeys,
36 #include "HsVersions.h"
40 import PrelNames -- Prelude module names
42 import PrimOp ( PrimOp(..), allThePrimOps, primOpRdrName )
43 import DataCon ( DataCon, dataConId, dataConWrapId )
44 import PrimRep ( PrimRep(..) )
45 import TysPrim -- TYPES
49 import RdrName ( RdrName )
50 import Var ( varUnique, Id )
51 import Name ( Name, OccName, Provenance(..),
52 NameSpace, tcName, clsName, varName, dataName,
54 getName, mkGlobalName, nameRdrName
56 import Class ( Class, classKey )
57 import TyCon ( tyConDataConsIfAvailable, TyCon )
58 import Type ( funTyCon )
60 import BasicTypes ( Boxity(..) )
61 import Unique -- *Key stuff
62 import UniqFM ( UniqFM, listToUFM )
64 import Panic ( panic )
67 %************************************************************************
69 \subsection[builtinNameInfo]{Lookup built-in names}
71 %************************************************************************
73 We have two ``builtin name funs,'' one to look up @TyCons@ and
74 @Classes@, the other to look up values.
77 builtinNames :: Bag Name
81 unionManyBags (map getTyConNames wired_in_tycons)
84 , listToBag (map getName wiredInIds)
87 , listToBag (map (getName . mkPrimOpId) allThePrimOps)
89 -- Other names with magic keys
90 , listToBag knownKeyNames
96 getTyConNames :: TyCon -> Bag Name
98 = getName tycon `consBag`
99 unionManyBags (map get_data_con_names (tyConDataConsIfAvailable tycon))
100 -- Synonyms return empty list of constructors
102 get_data_con_names dc = listToBag [getName (dataConId dc), -- Worker
103 getName (dataConWrapId dc)] -- Wrapper
106 We let a lot of "non-standard" values be visible, so that we can make
107 sense of them in interface pragmas. It's cool, though they all have
108 "non-standard" names, so they won't get past the parser in user code.
111 %************************************************************************
113 \subsection{RdrNames for the primops}
115 %************************************************************************
117 These can't be in PrelNames, because we get the RdrName from the PrimOp,
118 which is above PrelNames in the module hierarchy.
121 eqH_Char_RDR = primOpRdrName CharEqOp
122 ltH_Char_RDR = primOpRdrName CharLtOp
123 eqH_Word_RDR = primOpRdrName WordEqOp
124 ltH_Word_RDR = primOpRdrName WordLtOp
125 eqH_Addr_RDR = primOpRdrName AddrEqOp
126 ltH_Addr_RDR = primOpRdrName AddrLtOp
127 eqH_Float_RDR = primOpRdrName FloatEqOp
128 ltH_Float_RDR = primOpRdrName FloatLtOp
129 eqH_Double_RDR = primOpRdrName DoubleEqOp
130 ltH_Double_RDR = primOpRdrName DoubleLtOp
131 eqH_Int_RDR = primOpRdrName IntEqOp
132 ltH_Int_RDR = primOpRdrName IntLtOp
133 geH_RDR = primOpRdrName IntGeOp
134 leH_RDR = primOpRdrName IntLeOp
135 minusH_RDR = primOpRdrName IntSubOp
137 tagToEnumH_RDR = primOpRdrName TagToEnumOp
140 %************************************************************************
142 \subsection{Wired in TyCons}
144 %************************************************************************
147 wired_in_tycons = [funTyCon] ++
150 unboxed_tuple_tycons ++
162 , foreignObjPrimTyCon
164 , mutableArrayPrimTyCon
165 , mutableByteArrayPrimTyCon
170 , stableNamePrimTyCon
177 tuple_tycons = unitTyCon : [tupleTyCon Boxed i | i <- [2..37] ]
178 unboxed_tuple_tycons = [tupleTyCon Unboxed i | i <- [1..37] ]
194 %************************************************************************
196 \subsection{Built-in keys}
198 %************************************************************************
200 Ids, Synonyms, Classes and ClassOps with builtin keys.
203 knownKeyNames :: [Name]
205 = map mkKnownKeyGlobal
207 -- Type constructors (synonyms especially)
208 (ioTyCon_RDR, ioTyConKey)
209 , (main_RDR, mainKey)
210 , (orderingTyCon_RDR, orderingTyConKey)
211 , (rationalTyCon_RDR, rationalTyConKey)
212 , (ratioDataCon_RDR, ratioDataConKey)
213 , (ratioTyCon_RDR, ratioTyConKey)
214 , (byteArrayTyCon_RDR, byteArrayTyConKey)
215 , (mutableByteArrayTyCon_RDR, mutableByteArrayTyConKey)
216 , (foreignObjTyCon_RDR, foreignObjTyConKey)
217 , (stablePtrTyCon_RDR, stablePtrTyConKey)
218 , (stablePtrDataCon_RDR, stablePtrDataConKey)
220 -- Classes. *Must* include:
221 -- classes that are grabbed by key (e.g., eqClassKey)
222 -- classes in "Class.standardClassKeys" (quite a few)
223 , (eqClass_RDR, eqClassKey) -- mentioned, derivable
224 , (ordClass_RDR, ordClassKey) -- derivable
225 , (boundedClass_RDR, boundedClassKey) -- derivable
226 , (numClass_RDR, numClassKey) -- mentioned, numeric
227 , (enumClass_RDR, enumClassKey) -- derivable
228 , (monadClass_RDR, monadClassKey)
229 , (monadPlusClass_RDR, monadPlusClassKey)
230 , (functorClass_RDR, functorClassKey)
231 , (showClass_RDR, showClassKey) -- derivable
232 , (realClass_RDR, realClassKey) -- numeric
233 , (integralClass_RDR, integralClassKey) -- numeric
234 , (fractionalClass_RDR, fractionalClassKey) -- numeric
235 , (floatingClass_RDR, floatingClassKey) -- numeric
236 , (realFracClass_RDR, realFracClassKey) -- numeric
237 , (realFloatClass_RDR, realFloatClassKey) -- numeric
238 , (readClass_RDR, readClassKey) -- derivable
239 , (ixClass_RDR, ixClassKey) -- derivable (but it isn't Prelude.Ix; hmmm)
240 , (ccallableClass_RDR, cCallableClassKey) -- mentioned, ccallish
241 , (creturnableClass_RDR, cReturnableClassKey) -- mentioned, ccallish
244 , (fromInt_RDR, fromIntClassOpKey)
245 , (fromInteger_RDR, fromIntegerClassOpKey)
246 , (ge_RDR, geClassOpKey)
247 , (minus_RDR, minusClassOpKey)
248 , (enumFrom_RDR, enumFromClassOpKey)
249 , (enumFromThen_RDR, enumFromThenClassOpKey)
250 , (enumFromTo_RDR, enumFromToClassOpKey)
251 , (enumFromThenTo_RDR, enumFromThenToClassOpKey)
252 , (fromEnum_RDR, fromEnumClassOpKey)
253 , (toEnum_RDR, toEnumClassOpKey)
254 , (eq_RDR, eqClassOpKey)
255 , (thenM_RDR, thenMClassOpKey)
256 , (returnM_RDR, returnMClassOpKey)
257 , (failM_RDR, failMClassOpKey)
258 , (fromRational_RDR, fromRationalClassOpKey)
260 , (deRefStablePtr_RDR, deRefStablePtrIdKey)
261 , (makeStablePtr_RDR, makeStablePtrIdKey)
262 , (bindIO_RDR, bindIOIdKey)
263 , (returnIO_RDR, returnIOIdKey)
264 , (addr2Integer_RDR, addr2IntegerIdKey)
267 , (map_RDR, mapIdKey)
268 , (append_RDR, appendIdKey)
269 , (unpackCString_RDR, unpackCStringIdKey)
270 , (unpackCString2_RDR, unpackCString2IdKey)
271 , (unpackCStringAppend_RDR, unpackCStringAppendIdKey)
272 , (unpackCStringFoldr_RDR, unpackCStringFoldrIdKey)
275 , (concat_RDR, concatIdKey)
276 , (filter_RDR, filterIdKey)
277 , (zip_RDR, zipIdKey)
278 , (foldr_RDR, foldrIdKey)
279 , (build_RDR, buildIdKey)
280 , (augment_RDR, augmentIdKey)
282 -- FFI primitive types that are not wired-in.
283 , (int8TyCon_RDR, int8TyConKey)
284 , (int16TyCon_RDR, int16TyConKey)
285 , (int32TyCon_RDR, int32TyConKey)
286 , (int64TyCon_RDR, int64TyConKey)
287 , (word8TyCon_RDR, word8TyConKey)
288 , (word16TyCon_RDR, word16TyConKey)
289 , (word32TyCon_RDR, word32TyConKey)
290 , (word64TyCon_RDR, word64TyConKey)
293 , (otherwiseId_RDR, otherwiseIdKey)
294 , (assert_RDR, assertIdKey)
295 , (runSTRep_RDR, runSTRepIdKey)
299 ToDo: make it do the ``like'' part properly (as in 0.26 and before).
302 maybeCharLikeCon, maybeIntLikeCon :: DataCon -> Bool
303 maybeCharLikeCon con = con `hasKey` charDataConKey
304 maybeIntLikeCon con = con `hasKey` intDataConKey
307 %************************************************************************
309 \subsection[Class-std-groups]{Standard groups of Prelude classes}
311 %************************************************************************
313 @derivableClassKeys@ is also used in checking \tr{deriving} constructs
316 @derivingOccurrences@ maps a class name to a list of the (qualified) occurrences
317 that will be mentioned by the derived code for the class when it is later generated.
318 We don't need to put in things that are WiredIn (because they are already mapped to their
319 correct name by the @NameSupply@. The class itself, and all its class ops, is
320 already flagged as an occurrence so we don't need to mention that either.
322 @derivingOccurrences@ has an item for every derivable class, even if that item is empty,
323 because we treat lookup failure as indicating that the class is illegal in a deriving clause.
326 derivingOccurrences :: UniqFM [RdrName]
327 derivingOccurrences = listToUFM deriving_occ_info
329 derivableClassKeys = map fst deriving_occ_info
332 = [ (eqClassKey, [intTyCon_RDR, and_RDR, not_RDR])
333 , (ordClassKey, [intTyCon_RDR, compose_RDR, eqTag_RDR])
334 -- EQ (from Ordering) is needed to force in the constructors
335 -- as well as the type constructor.
336 , (enumClassKey, [intTyCon_RDR, eq_RDR, ge_RDR, and_RDR, map_RDR, plus_RDR, showsPrec_RDR, append_RDR])
337 -- The last two Enum deps are only used to produce better
338 -- error msgs for derived toEnum methods.
339 , (boundedClassKey, [intTyCon_RDR])
340 , (showClassKey, [intTyCon_RDR, numClass_RDR, ordClass_RDR, compose_RDR, showString_RDR,
341 showParen_RDR, showSpace_RDR, showList___RDR])
342 , (readClassKey, [intTyCon_RDR, numClass_RDR, ordClass_RDR, append_RDR,
343 foldr_RDR, build_RDR,
344 -- foldr and build required for list comprehension
346 lex_RDR, readParen_RDR, readList___RDR, thenM_RDR])
347 -- returnM (and the rest of the Monad class decl)
348 -- will be forced in as result of depending
349 -- on thenM. -- SOF 1/99
350 , (ixClassKey, [intTyCon_RDR, numClass_RDR, and_RDR, map_RDR, enumFromTo_RDR,
351 foldr_RDR, build_RDR,
352 -- foldr and build required for list comprehension used
353 -- with single constructor types -- KSW 2000-06
354 returnM_RDR, failM_RDR])
355 -- the last two are needed to force returnM, thenM and failM
356 -- in before typechecking the list(monad) comprehension
357 -- generated for derived Ix instances (range method)
358 -- of single constructor types. -- SOF 8/97
360 -- intTyCon: Practically any deriving needs Int, either for index calculations,
362 -- ordClass: really it's the methods that are actually used.
363 -- numClass: for Int literals
367 NOTE: @Eq@ and @Text@ do need to appear in @standardClasses@
368 even though every numeric class has these two as a superclass,
369 because the list of ambiguous dictionaries hasn't been simplified.
372 isCcallishClass, isCreturnableClass, isNoDictClass,
373 isNumericClass, isStandardClass :: Class -> Bool
375 isFractionalClass clas = classKey clas `is_elem` fractionalClassKeys
376 isNumericClass clas = classKey clas `is_elem` numericClassKeys
377 isStandardClass clas = classKey clas `is_elem` standardClassKeys
378 isCcallishClass clas = classKey clas `is_elem` cCallishClassKeys
379 isCreturnableClass clas = classKey clas == cReturnableClassKey
380 isNoDictClass clas = classKey clas `is_elem` noDictClassKeys
381 is_elem = isIn "is_X_Class"
388 ++ fractionalClassKeys
390 fractionalClassKeys =
397 -- the strictness analyser needs to know about numeric types
398 -- (see SaAbsInt.lhs)
408 needsDataDeclCtxtClassKeys = -- see comments in TcDeriv
414 , cReturnableClassKey
417 -- Renamer always imports these data decls replete with constructors
418 -- so that desugarer can always see their constructors. Ugh!
423 , mutableByteArrayTyConKey
437 = derivableClassKeys ++ numericClassKeys ++ cCallishClassKeys
439 -- We have to have "CCallable" and "CReturnable" in the standard
440 -- classes, so that if you go...
442 -- _ccall_ foo ... 93{-numeric literal-} ...
444 -- ... it can do The Right Thing on the 93.
446 noDictClassKeys -- These classes are used only for type annotations;
447 -- they are not implemented by dictionaries, ever.