2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[PrelInfo]{The @PrelInfo@ interface to the compiler's prelude knowledge}
8 -- finite maps for built-in things (for the renamer and typechecker):
9 builtinNames, derivingOccurrences,
12 maybeCharLikeTyCon, maybeIntLikeTyCon,
14 eq_RDR, ne_RDR, le_RDR, lt_RDR, ge_RDR, gt_RDR, max_RDR, min_RDR,
15 compare_RDR, minBound_RDR, maxBound_RDR, enumFrom_RDR, enumFromTo_RDR,
16 enumFromThen_RDR, enumFromThenTo_RDR, fromEnum_RDR, toEnum_RDR,
17 ratioDataCon_RDR, range_RDR, index_RDR, inRange_RDR, readsPrec_RDR,
18 readList_RDR, showsPrec_RDR, showList_RDR, plus_RDR, times_RDR,
19 ltTag_RDR, eqTag_RDR, gtTag_RDR, eqH_Char_RDR, ltH_Char_RDR,
20 eqH_Word_RDR, ltH_Word_RDR, eqH_Addr_RDR, ltH_Addr_RDR, eqH_Float_RDR,
21 ltH_Float_RDR, eqH_Double_RDR, ltH_Double_RDR, eqH_Int_RDR,
22 ltH_Int_RDR, geH_RDR, leH_RDR, minusH_RDR, false_RDR, true_RDR,
23 and_RDR, not_RDR, append_RDR, map_RDR, compose_RDR, mkInt_RDR,
24 error_RDR, assert_RDR,
25 showString_RDR, showParen_RDR, readParen_RDR, lex_RDR,
26 showSpace_RDR, showList___RDR, readList___RDR, negate_RDR,
28 numClass_RDR, fractionalClass_RDR, eqClass_RDR,
29 ccallableClass_RDR, creturnableClass_RDR,
30 monadZeroClass_RDR, enumClass_RDR, evalClass_RDR, ordClass_RDR,
31 ioDataCon_RDR, ioOkDataCon_RDR,
33 main_NAME, allClass_NAME, ioTyCon_NAME,
35 needsDataDeclCtxtClassKeys, cCallishClassKeys, cCallishTyKeys, isNoDictClass,
36 isNumericClass, isStandardClass, isCcallishClass
39 #include "HsVersions.h"
41 import IdUtils ( primOpName )
44 import PrelMods -- Prelude module names
45 import PrelVals -- VALUES
46 import PrimOp ( PrimOp(..), allThePrimOps )
47 import PrimRep ( PrimRep(..) )
48 import TysPrim -- TYPES
52 import RdrHsSyn ( RdrName(..), varQual, tcQual, qual )
53 import BasicTypes ( IfaceFlavour )
54 import Id ( GenId, Id )
55 import Name ( Name, OccName(..), Provenance(..),
56 getName, mkGlobalName, modAndOcc
58 import Class ( Class, classKey )
59 import TyCon ( tyConDataCons, mkFunTyCon, TyCon )
62 import Unique -- *Key stuff
63 import UniqFM ( UniqFM, listToUFM )
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 type BuiltinNames = Bag Name
79 builtinNames :: BuiltinNames
82 unionManyBags (map getTyConNames wired_in_tycons) `unionBags`
85 listToBag (map getName wired_in_ids) `unionBags`
88 listToBag (map (getName.primOpName) allThePrimOps) `unionBags`
90 -- Other names with magic keys
91 listToBag knownKeyNames
96 getTyConNames :: TyCon -> Bag Name
98 = getName tycon `consBag` listToBag (map getName (tyConDataCons tycon))
99 -- Synonyms return empty list of constructors
103 We let a lot of "non-standard" values be visible, so that we can make
104 sense of them in interface pragmas. It's cool, though they all have
105 "non-standard" names, so they won't get past the parser in user code.
107 %************************************************************************
109 \subsection{Wired in TyCons}
111 %************************************************************************
115 wired_in_tycons = [mkFunTyCon] ++
128 , foreignObjPrimTyCon
129 , mutableArrayPrimTyCon
130 , mutableByteArrayPrimTyCon
138 tuple_tycons = unitTyCon : [tupleTyCon i | i <- [2..37] ]
153 , returnIntAndGMPTyCon
157 , stateAndAddrPrimTyCon
158 , stateAndArrayPrimTyCon
159 , stateAndByteArrayPrimTyCon
160 , stateAndCharPrimTyCon
161 , stateAndDoublePrimTyCon
162 , stateAndFloatPrimTyCon
163 , stateAndForeignObjPrimTyCon
164 , stateAndIntPrimTyCon
165 , stateAndMutableArrayPrimTyCon
166 , stateAndMutableByteArrayPrimTyCon
167 , stateAndPtrPrimTyCon
168 , stateAndStablePtrPrimTyCon
169 , stateAndSynchVarPrimTyCon
170 , stateAndWordPrimTyCon
175 min_nonprim_tycon_list -- used w/ HideMostBuiltinNames
183 , return2GMPsTyCon -- ADR asked for these last two (WDP 94/11)
184 , returnIntAndGMPTyCon
188 %************************************************************************
190 \subsection{Wired in Ids}
192 %************************************************************************
195 ToDo: Some of these should be moved to id_keys_infos!
205 , iRREFUT_PAT_ERROR_ID
210 , nON_EXHAUSTIVE_GUARDS_ERROR_ID
211 , nO_DEFAULT_METHOD_ERROR_ID
212 , nO_EXPLICIT_METHOD_ERROR_ID
221 , unpackCStringAppendId
222 , unpackCStringFoldrId
241 %************************************************************************
243 \subsection{Built-in keys}
245 %************************************************************************
247 Ids, Synonyms, Classes and ClassOps with builtin keys.
250 mkKnownKeyGlobal :: (RdrName, Unique) -> Name
251 mkKnownKeyGlobal (Qual mod occ hif, uniq)
252 = mkGlobalName uniq mod occ NoProvenance
254 allClass_NAME = mkKnownKeyGlobal (allClass_RDR, allClassKey)
255 ioTyCon_NAME = mkKnownKeyGlobal (ioTyCon_RDR, ioTyConKey)
256 main_NAME = mkKnownKeyGlobal (main_RDR, mainKey)
258 knownKeyNames :: [Name]
260 = [main_NAME, allClass_NAME, ioTyCon_NAME]
264 -- Type constructors (synonyms especially)
265 (ioOkDataCon_RDR, ioOkDataConKey)
266 , (orderingTyCon_RDR, orderingTyConKey)
267 , (rationalTyCon_RDR, rationalTyConKey)
268 , (ratioDataCon_RDR, ratioDataConKey)
269 , (ratioTyCon_RDR, ratioTyConKey)
270 , (byteArrayTyCon_RDR, byteArrayTyConKey)
271 , (mutableByteArrayTyCon_RDR, mutableByteArrayTyConKey)
274 -- Classes. *Must* include:
275 -- classes that are grabbed by key (e.g., eqClassKey)
276 -- classes in "Class.standardClassKeys" (quite a few)
277 , (eqClass_RDR, eqClassKey) -- mentioned, derivable
278 , (ordClass_RDR, ordClassKey) -- derivable
279 , (evalClass_RDR, evalClassKey) -- mentioned
280 , (boundedClass_RDR, boundedClassKey) -- derivable
281 , (numClass_RDR, numClassKey) -- mentioned, numeric
282 , (enumClass_RDR, enumClassKey) -- derivable
283 , (monadClass_RDR, monadClassKey)
284 , (monadZeroClass_RDR, monadZeroClassKey)
285 , (monadPlusClass_RDR, monadPlusClassKey)
286 , (functorClass_RDR, functorClassKey)
287 , (showClass_RDR, showClassKey) -- derivable
288 , (realClass_RDR, realClassKey) -- numeric
289 , (integralClass_RDR, integralClassKey) -- numeric
290 , (fractionalClass_RDR, fractionalClassKey) -- numeric
291 , (floatingClass_RDR, floatingClassKey) -- numeric
292 , (realFracClass_RDR, realFracClassKey) -- numeric
293 , (realFloatClass_RDR, realFloatClassKey) -- numeric
294 , (readClass_RDR, readClassKey) -- derivable
295 , (ixClass_RDR, ixClassKey) -- derivable (but it isn't Prelude.Ix; hmmm)
296 , (ccallableClass_RDR, cCallableClassKey) -- mentioned, ccallish
297 , (creturnableClass_RDR, cReturnableClassKey) -- mentioned, ccallish
300 , (fromInt_RDR, fromIntClassOpKey)
301 , (fromInteger_RDR, fromIntegerClassOpKey)
302 , (ge_RDR, geClassOpKey)
303 , (minus_RDR, minusClassOpKey)
304 , (enumFrom_RDR, enumFromClassOpKey)
305 , (enumFromThen_RDR, enumFromThenClassOpKey)
306 , (enumFromTo_RDR, enumFromToClassOpKey)
307 , (enumFromThenTo_RDR, enumFromThenToClassOpKey)
308 , (fromEnum_RDR, fromEnumClassOpKey)
309 , (toEnum_RDR, toEnumClassOpKey)
310 , (eq_RDR, eqClassOpKey)
311 , (thenM_RDR, thenMClassOpKey)
312 , (returnM_RDR, returnMClassOpKey)
313 , (zeroM_RDR, zeroClassOpKey)
314 , (fromRational_RDR, fromRationalClassOpKey)
317 , (otherwiseId_RDR, otherwiseIdKey)
321 ToDo: make it do the ``like'' part properly (as in 0.26 and before).
324 maybeCharLikeTyCon tc = if (uniqueOf tc == charDataConKey) then Just charDataCon else Nothing
325 maybeIntLikeTyCon tc = if (uniqueOf tc == intDataConKey) then Just intDataCon else Nothing
328 %************************************************************************
330 \subsection{Commonly-used RdrNames}
332 %************************************************************************
334 These RdrNames are not really "built in", but some parts of the compiler
335 (notably the deriving mechanism) need to mention their names, and it's convenient
336 to write them all down in one place.
339 prelude_primop op = qual (modAndOcc (primOpName op))
341 intTyCon_RDR = qual (modAndOcc intTyCon)
342 ioTyCon_RDR = tcQual (iO_BASE, SLIT("IO"))
343 ioDataCon_RDR = varQual (iO_BASE, SLIT("IO"))
344 ioOkDataCon_RDR = varQual (iO_BASE, SLIT("IOok"))
345 orderingTyCon_RDR = tcQual (pREL_BASE, SLIT("Ordering"))
346 rationalTyCon_RDR = tcQual (pREL_NUM, SLIT("Rational"))
347 ratioTyCon_RDR = tcQual (pREL_NUM, SLIT("Ratio"))
348 ratioDataCon_RDR = varQual (pREL_NUM, SLIT(":%"))
350 byteArrayTyCon_RDR = tcQual (aRR_BASE, SLIT("ByteArray"))
351 mutableByteArrayTyCon_RDR = tcQual (aRR_BASE, SLIT("MutableByteArray"))
353 allClass_RDR = tcQual (gHC__, SLIT("All"))
354 eqClass_RDR = tcQual (pREL_BASE, SLIT("Eq"))
355 ordClass_RDR = tcQual (pREL_BASE, SLIT("Ord"))
356 evalClass_RDR = tcQual (pREL_BASE, SLIT("Eval"))
357 boundedClass_RDR = tcQual (pREL_BASE, SLIT("Bounded"))
358 numClass_RDR = tcQual (pREL_BASE, SLIT("Num"))
359 enumClass_RDR = tcQual (pREL_BASE, SLIT("Enum"))
360 monadClass_RDR = tcQual (pREL_BASE, SLIT("Monad"))
361 monadZeroClass_RDR = tcQual (pREL_BASE, SLIT("MonadZero"))
362 monadPlusClass_RDR = tcQual (pREL_BASE, SLIT("MonadPlus"))
363 functorClass_RDR = tcQual (pREL_BASE, SLIT("Functor"))
364 showClass_RDR = tcQual (pREL_BASE, SLIT("Show"))
365 realClass_RDR = tcQual (pREL_NUM, SLIT("Real"))
366 integralClass_RDR = tcQual (pREL_NUM, SLIT("Integral"))
367 fractionalClass_RDR = tcQual (pREL_NUM, SLIT("Fractional"))
368 floatingClass_RDR = tcQual (pREL_NUM, SLIT("Floating"))
369 realFracClass_RDR = tcQual (pREL_NUM, SLIT("RealFrac"))
370 realFloatClass_RDR = tcQual (pREL_NUM, SLIT("RealFloat"))
371 readClass_RDR = tcQual (pREL_READ, SLIT("Read"))
372 ixClass_RDR = tcQual (iX, SLIT("Ix"))
373 ccallableClass_RDR = tcQual (gHC__, SLIT("CCallable"))
374 creturnableClass_RDR = tcQual (gHC__, SLIT("CReturnable"))
376 fromInt_RDR = varQual (pREL_BASE, SLIT("fromInt"))
377 fromInteger_RDR = varQual (pREL_BASE, SLIT("fromInteger"))
378 minus_RDR = varQual (pREL_BASE, SLIT("-"))
379 toEnum_RDR = varQual (pREL_BASE, SLIT("toEnum"))
380 fromEnum_RDR = varQual (pREL_BASE, SLIT("fromEnum"))
381 enumFrom_RDR = varQual (pREL_BASE, SLIT("enumFrom"))
382 enumFromTo_RDR = varQual (pREL_BASE, SLIT("enumFromTo"))
383 enumFromThen_RDR = varQual (pREL_BASE, SLIT("enumFromThen"))
384 enumFromThenTo_RDR = varQual (pREL_BASE, SLIT("enumFromThenTo"))
386 thenM_RDR = varQual (pREL_BASE, SLIT(">>="))
387 returnM_RDR = varQual (pREL_BASE, SLIT("return"))
388 zeroM_RDR = varQual (pREL_BASE, SLIT("zero"))
389 fromRational_RDR = varQual (pREL_NUM, SLIT("fromRational"))
391 negate_RDR = varQual (pREL_BASE, SLIT("negate"))
392 eq_RDR = varQual (pREL_BASE, SLIT("=="))
393 ne_RDR = varQual (pREL_BASE, SLIT("/="))
394 le_RDR = varQual (pREL_BASE, SLIT("<="))
395 lt_RDR = varQual (pREL_BASE, SLIT("<"))
396 ge_RDR = varQual (pREL_BASE, SLIT(">="))
397 gt_RDR = varQual (pREL_BASE, SLIT(">"))
398 ltTag_RDR = varQual (pREL_BASE, SLIT("LT"))
399 eqTag_RDR = varQual (pREL_BASE, SLIT("EQ"))
400 gtTag_RDR = varQual (pREL_BASE, SLIT("GT"))
401 max_RDR = varQual (pREL_BASE, SLIT("max"))
402 min_RDR = varQual (pREL_BASE, SLIT("min"))
403 compare_RDR = varQual (pREL_BASE, SLIT("compare"))
404 minBound_RDR = varQual (pREL_BASE, SLIT("minBound"))
405 maxBound_RDR = varQual (pREL_BASE, SLIT("maxBound"))
406 false_RDR = varQual (pREL_BASE, SLIT("False"))
407 true_RDR = varQual (pREL_BASE, SLIT("True"))
408 and_RDR = varQual (pREL_BASE, SLIT("&&"))
409 not_RDR = varQual (pREL_BASE, SLIT("not"))
410 compose_RDR = varQual (pREL_BASE, SLIT("."))
411 append_RDR = varQual (pREL_BASE, SLIT("++"))
412 map_RDR = varQual (pREL_BASE, SLIT("map"))
414 showList___RDR = varQual (pREL_BASE, SLIT("showList__"))
415 showsPrec_RDR = varQual (pREL_BASE, SLIT("showsPrec"))
416 showList_RDR = varQual (pREL_BASE, SLIT("showList"))
417 showSpace_RDR = varQual (pREL_BASE, SLIT("showSpace"))
418 showString_RDR = varQual (pREL_BASE, SLIT("showString"))
419 showParen_RDR = varQual (pREL_BASE, SLIT("showParen"))
421 range_RDR = varQual (iX, SLIT("range"))
422 index_RDR = varQual (iX, SLIT("index"))
423 inRange_RDR = varQual (iX, SLIT("inRange"))
425 readsPrec_RDR = varQual (pREL_READ, SLIT("readsPrec"))
426 readList_RDR = varQual (pREL_READ, SLIT("readList"))
427 readParen_RDR = varQual (pREL_READ, SLIT("readParen"))
428 lex_RDR = varQual (pREL_READ, SLIT("lex"))
429 readList___RDR = varQual (pREL_READ, SLIT("readList__"))
431 plus_RDR = varQual (pREL_BASE, SLIT("+"))
432 times_RDR = varQual (pREL_BASE, SLIT("*"))
433 mkInt_RDR = varQual (pREL_BASE, SLIT("I#"))
435 error_RDR = varQual (gHC_ERR, SLIT("error"))
436 assert_RDR = varQual (gHC_ERR, SLIT("assert__"))
438 eqH_Char_RDR = prelude_primop CharEqOp
439 ltH_Char_RDR = prelude_primop CharLtOp
440 eqH_Word_RDR = prelude_primop WordEqOp
441 ltH_Word_RDR = prelude_primop WordLtOp
442 eqH_Addr_RDR = prelude_primop AddrEqOp
443 ltH_Addr_RDR = prelude_primop AddrLtOp
444 eqH_Float_RDR = prelude_primop FloatEqOp
445 ltH_Float_RDR = prelude_primop FloatLtOp
446 eqH_Double_RDR = prelude_primop DoubleEqOp
447 ltH_Double_RDR = prelude_primop DoubleLtOp
448 eqH_Int_RDR = prelude_primop IntEqOp
449 ltH_Int_RDR = prelude_primop IntLtOp
450 geH_RDR = prelude_primop IntGeOp
451 leH_RDR = prelude_primop IntLeOp
452 minusH_RDR = prelude_primop IntSubOp
454 main_RDR = varQual (mAIN, SLIT("main"))
456 otherwiseId_RDR = varQual (pREL_BASE, SLIT("otherwise"))
459 %************************************************************************
461 \subsection[Class-std-groups]{Standard groups of Prelude classes}
463 %************************************************************************
465 @derivableClassKeys@ is also used in checking \tr{deriving} constructs
468 @derivingOccurrences@ maps a class name to a list of the (qualified) occurrences
469 that will be mentioned by the derived code for the class when it is later generated.
470 We don't need to put in things that are WiredIn (because they are already mapped to their
471 correct name by the @NameSupply@. The class itself, and all its class ops, is
472 already flagged as an occurrence so we don't need to mention that either.
474 @derivingOccurrences@ has an item for every derivable class, even if that item is empty,
475 because we treat lookup failure as indicating that the class is illegal in a deriving clause.
478 derivingOccurrences :: UniqFM [RdrName]
479 derivingOccurrences = listToUFM deriving_occ_info
481 derivableClassKeys = map fst deriving_occ_info
484 = [ (eqClassKey, [intTyCon_RDR, and_RDR, not_RDR])
485 , (ordClassKey, [intTyCon_RDR, compose_RDR, eqTag_RDR])
486 -- EQ (from Ordering) is needed to force in the constructors
487 -- as well as the type constructor.
488 , (enumClassKey, [intTyCon_RDR, map_RDR])
489 , (evalClassKey, [intTyCon_RDR])
490 , (boundedClassKey, [intTyCon_RDR])
491 , (showClassKey, [intTyCon_RDR, numClass_RDR, ordClass_RDR, compose_RDR, showString_RDR,
492 showParen_RDR, showSpace_RDR, showList___RDR])
493 , (readClassKey, [intTyCon_RDR, numClass_RDR, ordClass_RDR, append_RDR,
494 lex_RDR, readParen_RDR, readList___RDR])
495 , (ixClassKey, [intTyCon_RDR, numClass_RDR, and_RDR, map_RDR, enumFromTo_RDR,
496 returnM_RDR, zeroM_RDR])
497 -- the last two are needed to force returnM, thenM and zeroM
498 -- in before typechecking the list(monad) comprehension
499 -- generated for derived Ix instances (range method)
500 -- of single constructor types. -- SOF 8/97
502 -- intTyCon: Practically any deriving needs Int, either for index calculations,
504 -- ordClass: really it's the methods that are actually used.
505 -- numClass: for Int literals
509 NOTE: @Eq@ and @Text@ do need to appear in @standardClasses@
510 even though every numeric class has these two as a superclass,
511 because the list of ambiguous dictionaries hasn't been simplified.
514 isCcallishClass, isNoDictClass, isNumericClass, isStandardClass :: Class -> Bool
516 isNumericClass clas = classKey clas `is_elem` numericClassKeys
517 isStandardClass clas = classKey clas `is_elem` standardClassKeys
518 isCcallishClass clas = classKey clas `is_elem` cCallishClassKeys
519 isNoDictClass clas = classKey clas `is_elem` noDictClassKeys
520 is_elem = isIn "is_X_Class"
532 needsDataDeclCtxtClassKeys -- see comments in TcDeriv
536 cCallishClassKeys = [ cCallableClassKey, cReturnableClassKey ]
538 -- Renamer always imports these data decls replete with constructors
539 -- so that desugarer can always see the constructor. Ugh!
540 cCallishTyKeys = [ addrTyConKey, wordTyConKey, byteArrayTyConKey,
541 mutableByteArrayTyConKey, foreignObjTyConKey ]
544 = derivableClassKeys ++ numericClassKeys ++ cCallishClassKeys
546 -- We have to have "CCallable" and "CReturnable" in the standard
547 -- classes, so that if you go...
549 -- _ccall_ foo ... 93{-numeric literal-} ...
551 -- ... it can do The Right Thing on the 93.
553 noDictClassKeys -- These classes are used only for type annotations;
554 -- they are not implemented by dictionaries, ever.
556 -- I used to think that class Eval belonged in here, but
557 -- we really want functions with type (Eval a => ...) and that
558 -- means that we really want to pass a placeholder for an Eval
559 -- dictionary. The unit tuple is what we'll get if we leave things
560 -- alone, and that'll do for now. Could arrange to drop that parameter