2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Id]{@Ids@: Value and constructor identifiers}
7 #include "HsVersions.h"
11 GenId(..), -- *naughtily* used in some places (e.g., TcHsSyn)
12 SYN_IE(Id), IdDetails,
14 SYN_IE(ConTag), fIRST_TAG,
15 SYN_IE(DataCon), SYN_IE(DictFun), SYN_IE(DictVar),
22 mkIdWithNewUniq, mkIdWithNewName,
37 -- DESTRUCTION (excluding pragmatic info)
52 recordSelectorFieldLabel,
58 cmpId_withSpecDataCon,
61 idWantsToBeINLINEd, getInlinePragma,
62 idMustBeINLINEd, idMustNotBeINLINEd,
65 isConstMethodId_maybe,
66 isDataCon, isAlgCon, isNewCon,
68 isDefaultMethodId_maybe,
75 isSuperDictSelId_maybe,
82 unfoldingUnfriendlyId,
88 -- PRINTING and RENUMBERING
99 -- UNFOLDING, ARITY, UPDATE, AND STRICTNESS STUFF (etc)
113 replaceIdInfo, replacePragmaInfo,
114 addInlinePragma, nukeNoInlinePragma, addNoInlinePragma,
117 SYN_IE(IdEnv), SYN_IE(GenIdSet), SYN_IE(IdSet),
138 modifyIdEnv_Directly,
149 #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ <= 201
150 IMPORT_DELOOPER(IdLoop) -- for paranoia checking
151 IMPORT_DELOOPER(TyLoop) -- for paranoia checking
153 import {-# SOURCE #-} SpecEnv ( SpecEnv )
154 import {-# SOURCE #-} CoreUnfold ( Unfolding )
155 import {-# SOURCE #-} StdIdInfo ( addStandardIdInfo )
156 -- Let's see how much we can leave out..
157 --import {-# SOURCE #-} TyCon
158 --import {-# SOURCE #-} Type
159 --import {-# SOURCE #-} Class
160 --import {-# SOURCE #-} TysWiredIn
161 --import {-# SOURCE #-} TysPrim
162 --import {-# SOURCE #-} TyVar
166 import Class ( classOpString, SYN_IE(Class), GenClass, SYN_IE(ClassOp), GenClassOp )
168 import Maybes ( maybeToBool )
169 import Name ( nameUnique, mkLocalName, mkSysLocalName, isLocalName,
170 mkCompoundName, mkInstDeclName,
171 isLocallyDefinedName, occNameString, modAndOcc,
172 isLocallyDefined, changeUnique, isWiredInName,
173 nameString, getOccString, setNameVisibility,
174 isExported, ExportFlag(..), DefnInfo, Provenance,
175 OccName(..), Name, SYN_IE(Module),
178 import PrelMods ( pREL_TUP, pREL_BASE )
179 import Lex ( mkTupNameStr )
180 import FieldLabel ( fieldLabelName, FieldLabel(..){-instances-} )
181 import PragmaInfo ( PragmaInfo(..) )
182 #if __GLASGOW_HASKELL__ >= 202
183 import PrimOp ( PrimOp )
185 import PprEnv -- ( SYN_IE(NmbrM), NmbrEnv(..) )
186 import PprType ( getTypeString, specMaybeTysSuffix,
191 import MatchEnv ( MatchEnv )
192 import SrcLoc --( mkBuiltinSrcLoc )
193 import TysWiredIn ( tupleTyCon )
194 import TyCon --( TyCon, tyConDataCons )
195 import Type {- ( mkSigmaTy, mkTyVarTys, mkFunTys, mkDictTy,
196 applyTyCon, instantiateTy, mkForAllTys,
197 tyVarsOfType, applyTypeEnvToTy, typePrimRep,
198 GenType, SYN_IE(ThetaType), SYN_IE(TauType), SYN_IE(Type)
200 import TyVar --( alphaTyVars, isEmptyTyVarSet, SYN_IE(TyVarEnv) )
201 import Usage ( SYN_IE(UVar) )
203 import UniqSet -- practically all of it
204 import Unique ( getBuiltinUniques, pprUnique, showUnique,
206 Unique{-instance Ord3-}
208 import Outputable ( ifPprDebug, Outputable(..), PprStyle(..) )
209 import Util {- ( mapAccumL, nOfThem, zipEqual, assoc,
210 panic, panic#, pprPanic, assertPanic
214 Here are the @Id@ and @IdDetails@ datatypes; also see the notes that
217 Every @Id@ has a @Unique@, to uniquify it and for fast comparison, a
218 @Type@, and an @IdInfo@ (non-essential info about it, e.g.,
219 strictness). The essential info about different kinds of @Ids@ is
222 ToDo: possibly cache other stuff in the single-constructor @Id@ type.
226 Unique -- Key for fast comparison
228 ty -- Id's type; used all the time;
229 IdDetails -- Stuff about individual kinds of Ids.
230 PragmaInfo -- Properties of this Id requested by programmer
231 -- eg specialise-me, inline-me
232 IdInfo -- Properties of this Id deduced by compiler
236 data StrictnessMark = MarkedStrict | NotMarkedStrict
240 ---------------- Local values
242 = LocalId Bool -- Local name; mentioned by the user
243 -- True <=> no free type vars
245 | SysLocalId Bool -- Local name; made up by the compiler
248 | PrimitiveId PrimOp -- The Id for a primitive operation
250 | SpecPragmaId -- Local name; introduced by the compiler
251 (Maybe Id) -- for explicit specid in pragma
252 Bool -- as for LocalId
254 ---------------- Global values
256 | ImportedId -- Global name (Imported or Implicit); Id imported from an interface
258 ---------------- Data constructors
260 | AlgConId -- Used for both data and newtype constructors.
261 -- You can tell the difference by looking at the TyCon
263 [StrictnessMark] -- Strict args; length = arity
264 [FieldLabel] -- Field labels for this constructor;
265 --length = 0 (not a record) or arity
267 [TyVar] [(Class,Type)] -- Type vars and context for the data type decl
268 [TyVar] [(Class,Type)] -- Ditto for the context of the constructor,
269 -- the existentially quantified stuff
270 [Type] TyCon -- Args and result tycon
272 -- forall tyvars1 ++ tyvars2. theta1 ++ theta2 =>
273 -- unitype_1 -> ... -> unitype_n -> tycon tyvars
275 | TupleConId Int -- Its arity
277 | RecordSelId FieldLabel
279 ---------------- Things to do with overloading
281 | SuperDictSelId -- Selector for superclass dictionary
282 Class -- The class (input dict)
283 Class -- The superclass (result dict)
285 | MethodSelId Class -- An overloaded class operation, with
286 -- a fully polymorphic type. Its code
287 -- just selects a method from the
288 -- dictionary. The class.
289 ClassOp -- The operation
291 -- NB: The IdInfo for a MethodSelId has all the info about its
292 -- related "constant method Ids", which are just
293 -- specialisations of this general one.
295 | DefaultMethodId -- Default method for a particular class op
296 Class -- same class, <blah-blah> info as MethodSelId
297 ClassOp -- (surprise, surprise)
298 Bool -- True <=> I *know* this default method Id
299 -- is a generated one that just says
300 -- `error "No default method for <op>"'.
303 | DictFunId Class -- A DictFun is uniquely identified
304 Type -- by its class and type; this type has free type vars,
305 -- whose identity is irrelevant. Eg Class = Eq
307 -- The "a" is irrelevant. As it is too painful to
308 -- actually do comparisons that way, we kindly supply
309 -- a Unique for that purpose.
312 | ConstMethodId -- A method which depends only on the type of the
313 -- instance, and not on any further dictionaries etc.
314 Class -- Uniquely identified by:
315 Type -- (class, type, classop) triple
317 Module -- module where instance came from
319 | InstId -- An instance of a dictionary, class operation,
320 -- or overloaded value (Local name)
321 Bool -- as for LocalId
323 | SpecId -- A specialisation of another Id
324 Id -- Id of which this is a specialisation
325 [Maybe Type] -- Types at which it is specialised;
326 -- A "Nothing" says this type ain't relevant.
327 Bool -- True <=> no free type vars; it's not enough
328 -- to know about the unspec version, because
329 -- we may specialise to a type w/ free tyvars
330 -- (i.e., in one of the "Maybe Type" dudes).
332 -- Scheduled for deletion: SLPJ Nov 96
333 -- Nobody seems to depend on knowing this.
334 | WorkerId -- A "worker" for some other Id
335 Id -- Id for which this is a worker
343 DictFunIds are generated from instance decls.
348 instance Foo a => Foo [a] where
351 generates the dict fun id decl
353 dfun.Foo.[*] = \d -> ...
355 The dfun id is uniquely named by the (class, type) pair. Notice, it
356 isn't a (class,tycon) pair any more, because we may get manually or
357 automatically generated specialisations of the instance decl:
359 instance Foo [Int] where
366 The type variables in the name are irrelevant; we print them as stars.
369 Constant method ids are generated from instance decls where
370 there is no context; that is, no dictionaries are needed to
371 construct the method. Example
373 instance Foo Int where
376 Then we get a constant method
381 It is possible, albeit unusual, to have a constant method
382 for an instance decl which has type vars:
384 instance Foo [a] where
388 We get the constant method
392 So a constant method is identified by a class/op/type triple.
393 The type variables in the type are irrelevant.
396 For Ids whose names must be known/deducible in other modules, we have
397 to conjure up their worker's names (and their worker's worker's
398 names... etc) in a known systematic way.
401 %************************************************************************
403 \subsection[Id-documentation]{Documentation}
405 %************************************************************************
409 The @Id@ datatype describes {\em values}. The basic things we want to
410 know: (1)~a value's {\em type} (@idType@ is a very common
411 operation in the compiler); and (2)~what ``flavour'' of value it might
412 be---for example, it can be terribly useful to know that a value is a
416 %----------------------------------------------------------------------
417 \item[@AlgConId@:] For the data constructors declared by a @data@
418 declaration. Their type is kept in {\em two} forms---as a regular
419 @Type@ (in the usual place), and also in its constituent pieces (in
420 the ``details''). We are frequently interested in those pieces.
422 %----------------------------------------------------------------------
423 \item[@TupleConId@:] This is just a special shorthand for @DataCons@ for
424 the infinite family of tuples.
426 %----------------------------------------------------------------------
427 \item[@ImportedId@:] These are values defined outside this module.
428 {\em Everything} we want to know about them must be stored here (or in
431 %----------------------------------------------------------------------
432 \item[@MethodSelId@:] A selector from a dictionary; it may select either
433 a method or a dictionary for one of the class's superclasses.
435 %----------------------------------------------------------------------
438 @mkDictFunId [a,b..] theta C T@ is the function derived from the
441 instance theta => C (T a b ..) where
444 It builds function @Id@ which maps dictionaries for theta,
445 to a dictionary for C (T a b ..).
447 *Note* that with the ``Mark Jones optimisation'', the theta may
448 include dictionaries for the immediate superclasses of C at the type
451 %----------------------------------------------------------------------
454 %----------------------------------------------------------------------
457 %----------------------------------------------------------------------
460 %----------------------------------------------------------------------
461 \item[@LocalId@:] A purely-local value, e.g., a function argument,
462 something defined in a @where@ clauses, ... --- but which appears in
463 the original program text.
465 %----------------------------------------------------------------------
466 \item[@SysLocalId@:] Same as a @LocalId@, except does {\em not} appear in
467 the original program text; these are introduced by the compiler in
470 %----------------------------------------------------------------------
471 \item[@SpecPragmaId@:] Introduced by the compiler to record
472 Specialisation pragmas. It is dead code which MUST NOT be removed
473 before specialisation.
478 %----------------------------------------------------------------------
481 @DataCons@ @TupleCons@, @Importeds@, @SuperDictSelIds@,
482 @MethodSelIds@, @DictFunIds@, and @DefaultMethodIds@ have the following
486 They have no free type variables, so if you are making a
487 type-variable substitution you don't need to look inside them.
489 They are constants, so they are not free variables. (When the STG
490 machine makes a closure, it puts all the free variables in the
491 closure; the above are not required.)
493 Note that @InstIds@, @Locals@ and @SysLocals@ {\em may} have the above
494 properties, but they may not.
497 %************************************************************************
499 \subsection[Id-general-funs]{General @Id@-related functions}
501 %************************************************************************
504 -- isDataCon returns False for @newtype@ constructors
505 isDataCon (Id _ _ _ (AlgConId _ _ _ _ _ _ _ _ tc) _ _) = isDataTyCon tc
506 isDataCon (Id _ _ _ (TupleConId _) _ _) = True
507 isDataCon (Id _ _ _ (SpecId unspec _ _) _ _) = isDataCon unspec
508 isDataCon other = False
510 isNewCon (Id _ _ _ (AlgConId _ _ _ _ _ _ _ _ tc) _ _) = isNewTyCon tc
511 isNewCon other = False
513 -- isAlgCon returns True for @data@ or @newtype@ constructors
514 isAlgCon (Id _ _ _ (AlgConId _ _ _ _ _ _ _ _ _) _ _) = True
515 isAlgCon (Id _ _ _ (TupleConId _) _ _) = True
516 isAlgCon (Id _ _ _ (SpecId unspec _ _) _ _) = isAlgCon unspec
517 isAlgCon other = False
519 isTupleCon (Id _ _ _ (TupleConId _) _ _) = True
520 isTupleCon (Id _ _ _ (SpecId unspec _ _) _ _) = isTupleCon unspec
521 isTupleCon other = False
524 @toplevelishId@ tells whether an @Id@ {\em may} be defined in a nested
525 @let(rec)@ (returns @False@), or whether it is {\em sure} to be
526 defined at top level (returns @True@). This is used to decide whether
527 the @Id@ is a candidate free variable. NB: you are only {\em sure}
528 about something if it returns @True@!
531 toplevelishId :: Id -> Bool
532 idHasNoFreeTyVars :: Id -> Bool
534 toplevelishId (Id _ _ _ details _ _)
537 chk (AlgConId _ __ _ _ _ _ _ _) = True
538 chk (TupleConId _) = True
539 chk (RecordSelId _) = True
540 chk ImportedId = True
541 chk (SuperDictSelId _ _) = True
542 chk (MethodSelId _ _) = True
543 chk (DefaultMethodId _ _ _) = True
544 chk (DictFunId _ _) = True
545 chk (ConstMethodId _ _ _ _) = True
546 chk (SpecId unspec _ _) = toplevelishId unspec
547 -- depends what the unspecialised thing is
548 chk (WorkerId unwrkr) = toplevelishId unwrkr
549 chk (InstId _) = False -- these are local
550 chk (LocalId _) = False
551 chk (SysLocalId _) = False
552 chk (SpecPragmaId _ _) = False
553 chk (PrimitiveId _) = True
555 idHasNoFreeTyVars (Id _ _ _ details _ info)
558 chk (AlgConId _ _ _ _ _ _ _ _ _) = True
559 chk (TupleConId _) = True
560 chk (RecordSelId _) = True
561 chk ImportedId = True
562 chk (SuperDictSelId _ _) = True
563 chk (MethodSelId _ _) = True
564 chk (DefaultMethodId _ _ _) = True
565 chk (DictFunId _ _) = True
566 chk (ConstMethodId _ _ _ _) = True
567 chk (WorkerId unwrkr) = idHasNoFreeTyVars unwrkr
568 chk (SpecId _ _ no_free_tvs) = no_free_tvs
569 chk (InstId no_free_tvs) = no_free_tvs
570 chk (LocalId no_free_tvs) = no_free_tvs
571 chk (SysLocalId no_free_tvs) = no_free_tvs
572 chk (SpecPragmaId _ no_free_tvs) = no_free_tvs
573 chk (PrimitiveId _) = True
575 -- omitIfaceSigForId tells whether an Id's info is implied by other declarations,
576 -- so we don't need to put its signature in an interface file, even if it's mentioned
577 -- in some other interface unfolding.
583 omitIfaceSigForId (Id _ name _ details _ _)
589 ImportedId -> True -- Never put imports in interface file
590 (PrimitiveId _) -> True -- Ditto, for primitives
592 -- This group is Ids that are implied by their type or class decl;
593 -- remember that all type and class decls appear in the interface file.
594 -- The dfun id must *not* be omitted, because it carries version info for
596 (AlgConId _ _ _ _ _ _ _ _ _) -> True
597 (TupleConId _) -> True
598 (RecordSelId _) -> True
599 (SuperDictSelId _ _) -> True
600 (MethodSelId _ _) -> True
602 other -> False -- Don't omit!
603 -- NB DefaultMethodIds are not omitted
607 isImportedId (Id _ _ _ ImportedId _ _) = True
608 isImportedId other = False
610 isBottomingId (Id _ _ _ _ _ info) = bottomIsGuaranteed (strictnessInfo info)
612 isSysLocalId (Id _ _ _ (SysLocalId _) _ _) = True
613 isSysLocalId other = False
615 isSpecPragmaId (Id _ _ _ (SpecPragmaId _ _) _ _) = True
616 isSpecPragmaId other = False
618 isMethodSelId_maybe (Id _ _ _ (MethodSelId cls op) _ _) = Just (cls,op)
619 isMethodSelId_maybe _ = Nothing
621 isDefaultMethodId (Id _ _ _ (DefaultMethodId _ _ _) _ _) = True
622 isDefaultMethodId other = False
624 isDefaultMethodId_maybe (Id _ _ _ (DefaultMethodId cls clsop err) _ _)
625 = Just (cls, clsop, err)
626 isDefaultMethodId_maybe other = Nothing
628 isDictFunId (Id _ _ _ (DictFunId _ _) _ _) = True
629 isDictFunId other = False
631 isConstMethodId (Id _ _ _ (ConstMethodId _ _ _ _) _ _) = True
632 isConstMethodId other = False
634 isConstMethodId_maybe (Id _ _ _ (ConstMethodId cls ty clsop _) _ _)
635 = Just (cls, ty, clsop)
636 isConstMethodId_maybe other = Nothing
638 isSuperDictSelId_maybe (Id _ _ _ (SuperDictSelId c sc) _ _) = Just (c, sc)
639 isSuperDictSelId_maybe other_id = Nothing
641 isWorkerId (Id _ _ _ (WorkerId _) _ _) = True
642 isWorkerId other = False
644 isWrapperId id = workerExists (getIdStrictness id)
646 isPrimitiveId_maybe (Id _ _ _ (PrimitiveId primop) _ _) = Just primop
647 isPrimitiveId_maybe other = Nothing
650 Tell them who my wrapper function is.
653 myWrapperMaybe :: Id -> Maybe Id
655 myWrapperMaybe (Id _ _ _ (WorkerId my_wrapper) _ _) = Just my_wrapper
656 myWrapperMaybe other_id = Nothing
661 unfoldingUnfriendlyId -- return True iff it is definitely a bad
662 :: Id -- idea to export an unfolding that
663 -> Bool -- mentions this Id. Reason: it cannot
664 -- possibly be seen in another module.
666 unfoldingUnfriendlyId id = not (externallyVisibleId id)
669 @externallyVisibleId@: is it true that another module might be
670 able to ``see'' this Id in a code generation sense. That
671 is, another .o file might refer to this Id.
673 In tidyCorePgm (SimplCore.lhs) we carefully set each top level thing's
674 local-ness precisely so that the test here would be easy
677 externallyVisibleId :: Id -> Bool
678 externallyVisibleId id@(Id _ name _ _ _ _) = not (isLocalName name)
679 -- not local => global => externally visible
682 CLAIM (not ASSERTed) for @applyTypeEnvToId@ and @applySubstToId@:
683 `Top-levelish Ids'' cannot have any free type variables, so applying
684 the type-env cannot have any effect. (NB: checked in CoreLint?)
686 The special casing is in @applyTypeEnvToId@, not @apply_to_Id@, as the
687 former ``should be'' the usual crunch point.
690 type TypeEnv = TyVarEnv Type
692 applyTypeEnvToId :: TypeEnv -> Id -> Id
694 applyTypeEnvToId type_env id@(Id _ _ ty _ _ _)
695 | idHasNoFreeTyVars id
698 = apply_to_Id ( \ ty ->
699 applyTypeEnvToTy type_env ty
704 apply_to_Id :: (Type -> Type) -> Id -> Id
706 apply_to_Id ty_fn (Id u n ty details prag info)
710 Id u n new_ty (apply_to_details details) prag (apply_to_IdInfo ty_fn info)
712 apply_to_details (SpecId unspec ty_maybes no_ftvs)
714 new_unspec = apply_to_Id ty_fn unspec
715 new_maybes = map apply_to_maybe ty_maybes
717 SpecId new_unspec new_maybes (no_free_tvs ty)
718 -- ToDo: gratuitous recalc no_ftvs???? (also InstId)
720 apply_to_maybe Nothing = Nothing
721 apply_to_maybe (Just ty) = Just (ty_fn ty)
723 apply_to_details (WorkerId unwrkr)
725 new_unwrkr = apply_to_Id ty_fn unwrkr
729 apply_to_details other = other
732 Sadly, I don't think the one using the magic typechecker substitution
733 can be done with @apply_to_Id@. Here we go....
735 Strictness is very important here. We can't leave behind thunks
736 with pointers to the substitution: it {\em must} be single-threaded.
740 applySubstToId :: Subst -> Id -> (Subst, Id)
742 applySubstToId subst id@(Id u n ty info details)
743 -- *cannot* have a "idHasNoFreeTyVars" get-out clause
744 -- because, in the typechecker, we are still
745 -- *concocting* the types.
746 = case (applySubstToTy subst ty) of { (s2, new_ty) ->
747 case (applySubstToIdInfo s2 info) of { (s3, new_info) ->
748 case (apply_to_details s3 new_ty details) of { (s4, new_details) ->
749 (s4, Id u n new_ty new_info new_details) }}}
751 apply_to_details subst _ (InstId inst no_ftvs)
752 = case (applySubstToInst subst inst) of { (s2, new_inst) ->
753 (s2, InstId new_inst no_ftvs{-ToDo:right???-}) }
755 apply_to_details subst new_ty (SpecId unspec ty_maybes _)
756 = case (applySubstToId subst unspec) of { (s2, new_unspec) ->
757 case (mapAccumL apply_to_maybe s2 ty_maybes) of { (s3, new_maybes) ->
758 (s3, SpecId new_unspec new_maybes (no_free_tvs new_ty)) }}
759 -- NB: recalc no_ftvs (I think it's necessary (?) WDP 95/04)
761 apply_to_maybe subst Nothing = (subst, Nothing)
762 apply_to_maybe subst (Just ty)
763 = case (applySubstToTy subst ty) of { (s2, new_ty) ->
766 apply_to_details subst _ (WorkerId unwrkr)
767 = case (applySubstToId subst unwrkr) of { (s2, new_unwrkr) ->
768 (s2, WorkerId new_unwrkr) }
770 apply_to_details subst _ other = (subst, other)
774 %************************************************************************
776 \subsection[Id-type-funs]{Type-related @Id@ functions}
778 %************************************************************************
781 idType :: GenId ty -> ty
783 idType (Id _ _ ty _ _ _) = ty
788 getMentionedTyConsAndClassesFromId :: Id -> (Bag TyCon, Bag Class)
790 getMentionedTyConsAndClassesFromId id
791 = getMentionedTyConsAndClassesFromType (idType id)
796 idPrimRep i = typePrimRep (idType i)
799 %************************************************************************
801 \subsection[Id-overloading]{Functions related to overloading}
803 %************************************************************************
806 mkSuperDictSelId u clas sc ty
807 = addStandardIdInfo $
808 Id u name ty details NoPragmaInfo noIdInfo
810 name = mkCompoundName name_fn u (getName clas)
811 details = SuperDictSelId clas sc
812 name_fn clas_str = SLIT("scsel_") _APPEND_ clas_str _APPEND_ mod _APPEND_ occNameString occ
813 (mod,occ) = modAndOcc sc
815 -- For method selectors the clean thing to do is
816 -- to give the method selector the same name as the class op itself.
817 mkMethodSelId op_name rec_c op ty
818 = addStandardIdInfo $
819 Id (uniqueOf op_name) op_name ty (MethodSelId rec_c op) NoPragmaInfo noIdInfo
821 mkDefaultMethodId dm_name rec_c op gen ty
822 = Id (uniqueOf dm_name) dm_name ty (DefaultMethodId rec_c op gen) NoPragmaInfo noIdInfo
824 mkDictFunId dfun_name full_ty clas ity
825 = Id (nameUnique dfun_name) dfun_name full_ty details NoPragmaInfo noIdInfo
827 details = DictFunId clas ity
829 mkConstMethodId uniq clas op ity full_ty from_here locn mod info
830 = Id uniq name full_ty details NoPragmaInfo info
832 name = mkInstDeclName uniq mod (VarOcc occ_name) locn from_here
833 details = ConstMethodId clas ity op mod
834 occ_name = classOpString op _APPEND_
835 SLIT("_cm_") _APPEND_ renum_type_string full_ty ity
837 mkWorkerId u unwrkr ty info
838 = Id u name ty details NoPragmaInfo info
840 name = mkCompoundName name_fn u (getName unwrkr)
841 details = WorkerId unwrkr
842 name_fn wkr_str = SLIT("$w") _APPEND_ wkr_str
845 = Id u name ty (InstId (no_free_tvs ty)) NoPragmaInfo noIdInfo
848 getConstMethodId clas op ty
849 = -- constant-method info is hidden in the IdInfo of
850 -- the class-op id (as mentioned up above).
852 sel_id = getMethodSelId clas op
854 case (lookupConstMethodId (getIdSpecialisation sel_id) ty) of
856 Nothing -> pprError "ERROR: getConstMethodId:" (vcat [
857 hsep [ppr PprDebug ty, ppr PprDebug ops, ppr PprDebug op_ids,
858 ppr PprDebug sel_id],
859 text "(This can arise if an interface pragma refers to an instance",
860 text "but there is no imported interface which *defines* that instance.",
861 text "The info above, however ugly, should indicate what else you need to import."
866 renum_type_string full_ty ity
868 nmbrType full_ty `thenNmbr` \ _ -> -- so all the tyvars get added to renumbering...
869 nmbrType ity `thenNmbr` \ rn_ity ->
870 returnNmbr (getTypeString rn_ity)
874 %************************************************************************
876 \subsection[local-funs]{@LocalId@-related functions}
878 %************************************************************************
881 mkImported n ty info = Id (nameUnique n) n ty ImportedId NoPragmaInfo info
883 mkPrimitiveId n ty primop
884 = addStandardIdInfo $
885 Id (nameUnique n) n ty (PrimitiveId primop) IMustBeINLINEd noIdInfo
886 -- The pragma @IMustBeINLINEd@ says that this Id absolutely must be inlined.
887 -- It's only true for primitives, because we don't want to make a closure for each of them.
892 type MyTy a b = GenType (GenTyVar a) b
893 type MyId a b = GenId (MyTy a b)
895 no_free_tvs ty = isEmptyTyVarSet (tyVarsOfType ty)
897 -- SysLocal: for an Id being created by the compiler out of thin air...
898 -- UserLocal: an Id with a name the user might recognize...
899 mkSysLocal :: FAST_STRING -> Unique -> MyTy a b -> SrcLoc -> MyId a b
900 mkUserLocal :: OccName -> Unique -> MyTy a b -> SrcLoc -> MyId a b
902 mkSysLocal str uniq ty loc
903 = Id uniq (mkSysLocalName uniq str loc) ty (SysLocalId (no_free_tvs ty)) NoPragmaInfo noIdInfo
905 mkUserLocal occ uniq ty loc
906 = Id uniq (mkLocalName uniq occ loc) ty (LocalId (no_free_tvs ty)) NoPragmaInfo noIdInfo
908 mkUserId :: Name -> MyTy a b -> PragmaInfo -> MyId a b
909 mkUserId name ty pragma_info
910 = Id (nameUnique name) name ty (LocalId (no_free_tvs ty)) pragma_info noIdInfo
917 -- for a SpecPragmaId being created by the compiler out of thin air...
918 mkSpecPragmaId :: OccName -> Unique -> Type -> Maybe Id -> SrcLoc -> Id
919 mkSpecPragmaId str uniq ty specid loc
920 = Id uniq (mkShortName str loc) ty noIdInfo (SpecPragmaId specid (no_free_tvs ty))
923 mkSpecId u unspec ty_maybes ty info
924 = ASSERT(not (maybeToBool (isSpecId_maybe unspec)))
925 Id u n ty info (SpecId unspec ty_maybes (no_free_tvs ty))
927 -- Specialised version of constructor: only used in STG and code generation
928 -- Note: The specialsied Id has the same unique as the unspeced Id
930 mkSameSpecCon ty_maybes unspec@(Id u n ty info details)
931 = ASSERT(isDataCon unspec)
932 ASSERT(not (maybeToBool (isSpecId_maybe unspec)))
933 Id u n new_ty info (SpecId unspec ty_maybes (no_free_tvs new_ty))
935 new_ty = specialiseTy ty ty_maybes 0
937 localiseId :: Id -> Id
938 localiseId id@(Id u n ty info details)
939 = Id u (mkShortName name loc) ty info (LocalId (no_free_tvs ty))
945 -- See notes with setNameVisibility (Name.lhs)
946 setIdVisibility :: Module -> Id -> Id
947 setIdVisibility mod (Id uniq name ty details prag info)
948 = Id uniq (setNameVisibility mod name) ty details prag info
950 mkIdWithNewUniq :: Id -> Unique -> Id
951 mkIdWithNewUniq (Id _ n ty details prag info) u
952 = Id u (changeUnique n u) ty details prag info
954 mkIdWithNewName :: Id -> Name -> Id
955 mkIdWithNewName (Id _ _ ty details prag info) new_name
956 = Id (uniqueOf new_name) new_name ty details prag info
959 Make some local @Ids@ for a template @CoreExpr@. These have bogus
960 @Uniques@, but that's OK because the templates are supposed to be
961 instantiated before use.
963 mkTemplateLocals :: [Type] -> [Id]
965 = zipWith (\ u -> \ ty -> mkSysLocal SLIT("tpl") u ty mkBuiltinSrcLoc)
966 (getBuiltinUniques (length tys))
971 getIdInfo :: GenId ty -> IdInfo
972 getPragmaInfo :: GenId ty -> PragmaInfo
974 getIdInfo (Id _ _ _ _ _ info) = info
975 getPragmaInfo (Id _ _ _ _ info _) = info
977 replaceIdInfo :: Id -> IdInfo -> Id
978 replaceIdInfo (Id u n ty details pinfo _) info = Id u n ty details pinfo info
980 replacePragmaInfo :: GenId ty -> PragmaInfo -> GenId ty
981 replacePragmaInfo (Id u sn ty details _ info) prag = Id u sn ty details prag info
984 %************************************************************************
986 \subsection[Id-arities]{Arity-related functions}
988 %************************************************************************
990 For locally-defined Ids, the code generator maintains its own notion
991 of their arities; so it should not be asking... (but other things
992 besides the code-generator need arity info!)
995 getIdArity :: Id -> ArityInfo
996 getIdArity id@(Id _ _ _ _ _ id_info)
999 addIdArity :: Id -> ArityInfo -> Id
1000 addIdArity (Id u n ty details pinfo info) arity
1001 = Id u n ty details pinfo (info `addArityInfo` arity)
1004 %************************************************************************
1006 \subsection[Id-arities]{Deforestation related functions}
1008 %************************************************************************
1011 addIdDeforestInfo :: Id -> DeforestInfo -> Id
1012 addIdDeforestInfo (Id u n ty details pinfo info) def_info
1013 = Id u n ty details pinfo (info `addDeforestInfo` def_info)
1016 %************************************************************************
1018 \subsection[constructor-funs]{@DataCon@-related functions (incl.~tuples)}
1020 %************************************************************************
1024 -> [StrictnessMark] -> [FieldLabel]
1025 -> [TyVar] -> ThetaType
1026 -> [TyVar] -> ThetaType
1027 -> [TauType] -> TyCon
1029 -- can get the tag and all the pieces of the type from the Type
1031 mkDataCon n stricts fields tvs ctxt con_tvs con_ctxt args_tys tycon
1032 = ASSERT(length stricts == length args_tys)
1033 addStandardIdInfo data_con
1035 -- NB: data_con self-recursion; should be OK as tags are not
1036 -- looked at until late in the game.
1041 (AlgConId data_con_tag stricts fields tvs ctxt con_tvs con_ctxt args_tys tycon)
1042 IWantToBeINLINEd -- Always inline constructors if possible
1045 data_con_tag = assoc "mkDataCon" (data_con_family `zip` [fIRST_TAG..]) data_con
1046 data_con_family = tyConDataCons tycon
1049 = mkSigmaTy (tvs++con_tvs) (ctxt++con_ctxt)
1050 (mkFunTys args_tys (applyTyCon tycon (mkTyVarTys tvs)))
1053 mkTupleCon :: Arity -> Name -> Type -> Id
1054 mkTupleCon arity name ty
1055 = addStandardIdInfo tuple_id
1057 tuple_id = Id (nameUnique name) name ty
1059 IWantToBeINLINEd -- Always inline constructors if possible
1063 fIRST_TAG = 1 -- Tags allocated from here for real constructors
1066 dataConNumFields gives the number of actual fields in the
1067 {\em representation} of the data constructor. This may be more than appear
1068 in the source code; the extra ones are the existentially quantified
1073 = ASSERT(isDataCon id)
1074 case (dataConSig id) of { (_, _, _, con_theta, arg_tys, _) ->
1075 length con_theta + length arg_tys }
1077 isNullaryDataCon con = dataConNumFields con == 0 -- function of convenience
1082 dataConTag :: DataCon -> ConTag -- will panic if not a DataCon
1083 dataConTag (Id _ _ _ (AlgConId tag _ _ _ _ _ _ _ _) _ _) = tag
1084 dataConTag (Id _ _ _ (TupleConId _) _ _) = fIRST_TAG
1085 dataConTag (Id _ _ _ (SpecId unspec _ _) _ _) = dataConTag unspec
1087 dataConTyCon :: DataCon -> TyCon -- will panic if not a DataCon
1088 dataConTyCon (Id _ _ _ (AlgConId _ _ _ _ _ _ _ _ tycon) _ _) = tycon
1089 dataConTyCon (Id _ _ _ (TupleConId a) _ _) = tupleTyCon a
1091 dataConSig :: DataCon -> ([TyVar], ThetaType, [TyVar], ThetaType, [TauType], TyCon)
1092 -- will panic if not a DataCon
1094 dataConSig (Id _ _ _ (AlgConId _ _ _ tyvars theta con_tyvars con_theta arg_tys tycon) _ _)
1095 = (tyvars, theta, con_tyvars, con_theta, arg_tys, tycon)
1097 dataConSig (Id _ _ _ (TupleConId arity) _ _)
1098 = (tyvars, [], [], [], tyvar_tys, tupleTyCon arity)
1100 tyvars = take arity alphaTyVars
1101 tyvar_tys = mkTyVarTys tyvars
1104 -- dataConRepType returns the type of the representation of a contructor
1105 -- This may differ from the type of the contructor Id itself for two reasons:
1106 -- a) the constructor Id may be overloaded, but the dictionary isn't stored
1107 -- b) the constructor may store an unboxed version of a strict field.
1108 -- Here's an example illustrating both:
1109 -- data Ord a => T a = MkT Int! a
1111 -- T :: Ord a => Int -> a -> T a
1112 -- but the rep type is
1113 -- Trep :: Int# -> a -> T a
1114 -- Actually, the unboxed part isn't implemented yet!
1116 dataConRepType :: GenId (GenType tv u) -> GenType tv u
1118 = mkForAllTys tyvars tau
1120 (tyvars, theta, tau) = splitSigmaTy (idType con)
1122 dataConFieldLabels :: DataCon -> [FieldLabel]
1123 dataConFieldLabels (Id _ _ _ (AlgConId _ _ fields _ _ _ _ _ _) _ _) = fields
1124 dataConFieldLabels (Id _ _ _ (TupleConId _) _ _) = []
1126 dataConStrictMarks :: DataCon -> [StrictnessMark]
1127 dataConStrictMarks (Id _ _ _ (AlgConId _ stricts _ _ _ _ _ _ _) _ _) = stricts
1128 dataConStrictMarks (Id _ _ _ (TupleConId arity) _ _)
1129 = nOfThem arity NotMarkedStrict
1131 dataConRawArgTys :: DataCon -> [TauType] -- a function of convenience
1132 dataConRawArgTys con = case (dataConSig con) of { (_,_, _, _, arg_tys,_) -> arg_tys }
1134 dataConArgTys :: DataCon
1135 -> [Type] -- Instantiated at these types
1136 -> [Type] -- Needs arguments of these types
1137 dataConArgTys con_id inst_tys
1138 = map (instantiateTy tenv) arg_tys
1140 (tyvars, _, _, _, arg_tys, _) = dataConSig con_id
1141 tenv = zipEqual "dataConArgTys" tyvars inst_tys
1145 mkRecordSelId field_label selector_ty
1146 = addStandardIdInfo $ -- Record selectors have a standard unfolding
1147 Id (nameUnique name)
1150 (RecordSelId field_label)
1154 name = fieldLabelName field_label
1156 recordSelectorFieldLabel :: Id -> FieldLabel
1157 recordSelectorFieldLabel (Id _ _ _ (RecordSelId lbl) _ _) = lbl
1159 isRecordSelector (Id _ _ _ (RecordSelId lbl) _ _) = True
1160 isRecordSelector other = False
1164 Data type declarations are of the form:
1166 data Foo a b = C1 ... | C2 ... | ... | Cn ...
1168 For each constructor @Ci@, we want to generate a curried function; so, e.g., for
1169 @C1 x y z@, we want a function binding:
1171 fun_C1 = /\ a -> /\ b -> \ [x, y, z] -> Con C1 [a, b] [x, y, z]
1173 Notice the ``big lambdas'' and type arguments to @Con@---we are producing
1174 2nd-order polymorphic lambda calculus with explicit types.
1176 %************************************************************************
1178 \subsection[unfolding-Ids]{Functions related to @Ids@' unfoldings}
1180 %************************************************************************
1183 getIdUnfolding :: Id -> Unfolding
1185 getIdUnfolding (Id _ _ _ _ _ info) = unfoldInfo info
1187 addIdUnfolding :: Id -> Unfolding -> Id
1188 addIdUnfolding id@(Id u n ty details prag info) unfolding
1189 = Id u n ty details prag (info `addUnfoldInfo` unfolding)
1192 The inline pragma tells us to be very keen to inline this Id, but it's still
1193 OK not to if optimisation is switched off.
1196 getInlinePragma :: Id -> PragmaInfo
1197 getInlinePragma (Id _ _ _ _ prag _) = prag
1199 idWantsToBeINLINEd :: Id -> Bool
1201 idWantsToBeINLINEd (Id _ _ _ _ IWantToBeINLINEd _) = True
1202 idWantsToBeINLINEd (Id _ _ _ _ IMustBeINLINEd _) = True
1203 idWantsToBeINLINEd _ = False
1205 idMustNotBeINLINEd (Id _ _ _ _ IMustNotBeINLINEd _) = True
1206 idMustNotBeINLINEd _ = False
1208 idMustBeINLINEd (Id _ _ _ _ IMustBeINLINEd _) = True
1209 idMustBeINLINEd _ = False
1211 addInlinePragma :: Id -> Id
1212 addInlinePragma (Id u sn ty details _ info)
1213 = Id u sn ty details IWantToBeINLINEd info
1215 nukeNoInlinePragma :: Id -> Id
1216 nukeNoInlinePragma id@(Id u sn ty details IMustNotBeINLINEd info)
1217 = Id u sn ty details NoPragmaInfo info
1218 nukeNoInlinePragma id@(Id u sn ty details _ info) = id -- Otherwise no-op
1220 addNoInlinePragma :: Id -> Id
1221 addNoInlinePragma id@(Id u sn ty details _ info)
1222 = Id u sn ty details IMustNotBeINLINEd info
1227 %************************************************************************
1229 \subsection[IdInfo-funs]{Functions related to @Ids@' @IdInfos@}
1231 %************************************************************************
1234 getIdDemandInfo :: Id -> DemandInfo
1235 getIdDemandInfo (Id _ _ _ _ _ info) = demandInfo info
1237 addIdDemandInfo :: Id -> DemandInfo -> Id
1238 addIdDemandInfo (Id u n ty details prags info) demand_info
1239 = Id u n ty details prags (info `addDemandInfo` demand_info)
1243 getIdUpdateInfo :: Id -> UpdateInfo
1244 getIdUpdateInfo (Id _ _ _ _ _ info) = updateInfo info
1246 addIdUpdateInfo :: Id -> UpdateInfo -> Id
1247 addIdUpdateInfo (Id u n ty details prags info) upd_info
1248 = Id u n ty details prags (info `addUpdateInfo` upd_info)
1253 getIdArgUsageInfo :: Id -> ArgUsageInfo
1254 getIdArgUsageInfo (Id u n ty info details) = argUsageInfo info
1256 addIdArgUsageInfo :: Id -> ArgUsageInfo -> Id
1257 addIdArgUsageInfo (Id u n ty info details) au_info
1258 = Id u n ty (info `addArgusageInfo` au_info) details
1264 getIdFBTypeInfo :: Id -> FBTypeInfo
1265 getIdFBTypeInfo (Id u n ty info details) = fbTypeInfo info
1267 addIdFBTypeInfo :: Id -> FBTypeInfo -> Id
1268 addIdFBTypeInfo (Id u n ty info details) upd_info
1269 = Id u n ty (info `addFBTypeInfo` upd_info) details
1274 getIdSpecialisation :: Id -> SpecEnv
1275 getIdSpecialisation (Id _ _ _ _ _ info) = specInfo info
1277 addIdSpecialisation :: Id -> SpecEnv -> Id
1278 addIdSpecialisation (Id u n ty details prags info) spec_info
1279 = Id u n ty details prags (info `addSpecInfo` spec_info)
1282 Strictness: we snaffle the info out of the IdInfo.
1285 getIdStrictness :: Id -> StrictnessInfo Id
1287 getIdStrictness (Id _ _ _ _ _ info) = strictnessInfo info
1289 addIdStrictness :: Id -> StrictnessInfo Id -> Id
1290 addIdStrictness (Id u n ty details prags info) strict_info
1291 = Id u n ty details prags (info `addStrictnessInfo` strict_info)
1294 %************************************************************************
1296 \subsection[Id-comparison]{Comparison functions for @Id@s}
1298 %************************************************************************
1300 Comparison: equality and ordering---this stuff gets {\em hammered}.
1303 cmpId (Id u1 _ _ _ _ _) (Id u2 _ _ _ _ _) = cmp u1 u2
1304 -- short and very sweet
1308 instance Ord3 (GenId ty) where
1311 instance Eq (GenId ty) where
1312 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
1313 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
1315 instance Ord (GenId ty) where
1316 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
1317 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
1318 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
1319 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
1320 _tagCmp a b = case (a `cmp` b) of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
1323 @cmpId_withSpecDataCon@ ensures that any spectys are taken into
1324 account when comparing two data constructors. We need to do this
1325 because a specialised data constructor has the same Unique as its
1326 unspecialised counterpart.
1329 cmpId_withSpecDataCon :: Id -> Id -> TAG_
1331 cmpId_withSpecDataCon id1 id2
1332 | eq_ids && isDataCon id1 && isDataCon id2
1333 = cmpEqDataCon id1 id2
1338 cmp_ids = cmpId id1 id2
1339 eq_ids = case cmp_ids of { EQ_ -> True; other -> False }
1341 cmpEqDataCon (Id _ _ _ (SpecId _ mtys1 _) _ _) (Id _ _ _ (SpecId _ mtys2 _) _ _)
1342 = panic# "Id.cmpEqDataCon:cmpUniTypeMaybeList mtys1 mtys2"
1344 cmpEqDataCon _ (Id _ _ _ (SpecId _ _ _) _ _) = LT_
1345 cmpEqDataCon (Id _ _ _ (SpecId _ _ _) _ _) _ = GT_
1346 cmpEqDataCon _ _ = EQ_
1349 %************************************************************************
1351 \subsection[Id-other-instances]{Other instance declarations for @Id@s}
1353 %************************************************************************
1356 instance Outputable ty => Outputable (GenId ty) where
1357 ppr sty id = pprId sty id
1359 -- and a SPECIALIZEd one:
1360 instance Outputable {-Id, i.e.:-}(GenId Type) where
1361 ppr sty id = pprId sty id
1363 showId :: PprStyle -> Id -> String
1364 showId sty id = show (pprId sty id)
1367 Default printing code (not used for interfaces):
1369 pprId :: Outputable ty => PprStyle -> GenId ty -> Doc
1371 pprId sty (Id u n _ _ prags _)
1372 = hcat [ppr sty n, pp_prags]
1374 pp_prags = ifPprDebug sty (case prags of
1375 IMustNotBeINLINEd -> text "{n}"
1376 IWantToBeINLINEd -> text "{i}"
1377 IMustBeINLINEd -> text "{I}"
1380 -- WDP 96/05/06: We can re-elaborate this as we go along...
1384 idUnique (Id u _ _ _ _ _) = u
1386 instance Uniquable (GenId ty) where
1389 instance NamedThing (GenId ty) where
1390 getName this_id@(Id u n _ details _ _) = n
1393 Note: The code generator doesn't carry a @UniqueSupply@, so it uses
1394 the @Uniques@ out of local @Ids@ given to it.
1396 %************************************************************************
1398 \subsection{@IdEnv@s and @IdSet@s}
1400 %************************************************************************
1403 type IdEnv elt = UniqFM elt
1405 nullIdEnv :: IdEnv a
1407 mkIdEnv :: [(GenId ty, a)] -> IdEnv a
1408 unitIdEnv :: GenId ty -> a -> IdEnv a
1409 addOneToIdEnv :: IdEnv a -> GenId ty -> a -> IdEnv a
1410 growIdEnv :: IdEnv a -> IdEnv a -> IdEnv a
1411 growIdEnvList :: IdEnv a -> [(GenId ty, a)] -> IdEnv a
1413 delManyFromIdEnv :: IdEnv a -> [GenId ty] -> IdEnv a
1414 delOneFromIdEnv :: IdEnv a -> GenId ty -> IdEnv a
1415 combineIdEnvs :: (a -> a -> a) -> IdEnv a -> IdEnv a -> IdEnv a
1416 mapIdEnv :: (a -> b) -> IdEnv a -> IdEnv b
1417 modifyIdEnv :: (a -> a) -> IdEnv a -> GenId ty -> IdEnv a
1418 rngIdEnv :: IdEnv a -> [a]
1420 isNullIdEnv :: IdEnv a -> Bool
1421 lookupIdEnv :: IdEnv a -> GenId ty -> Maybe a
1422 lookupNoFailIdEnv :: IdEnv a -> GenId ty -> a
1426 addOneToIdEnv = addToUFM
1427 combineIdEnvs = plusUFM_C
1428 delManyFromIdEnv = delListFromUFM
1429 delOneFromIdEnv = delFromUFM
1431 lookupIdEnv = lookupUFM
1434 nullIdEnv = emptyUFM
1438 growIdEnvList env pairs = plusUFM env (listToUFM pairs)
1439 isNullIdEnv env = sizeUFM env == 0
1440 lookupNoFailIdEnv env id = case (lookupIdEnv env id) of { Just xx -> xx }
1442 -- modifyIdEnv: Look up a thing in the IdEnv, then mash it with the
1443 -- modify function, and put it back.
1445 modifyIdEnv mangle_fn env key
1446 = case (lookupIdEnv env key) of
1448 Just xx -> addOneToIdEnv env key (mangle_fn xx)
1450 modifyIdEnv_Directly mangle_fn env key
1451 = case (lookupUFM_Directly env key) of
1453 Just xx -> addToUFM_Directly env key (mangle_fn xx)
1457 type GenIdSet ty = UniqSet (GenId ty)
1458 type IdSet = UniqSet (GenId Type)
1460 emptyIdSet :: GenIdSet ty
1461 intersectIdSets :: GenIdSet ty -> GenIdSet ty -> GenIdSet ty
1462 unionIdSets :: GenIdSet ty -> GenIdSet ty -> GenIdSet ty
1463 unionManyIdSets :: [GenIdSet ty] -> GenIdSet ty
1464 idSetToList :: GenIdSet ty -> [GenId ty]
1465 unitIdSet :: GenId ty -> GenIdSet ty
1466 addOneToIdSet :: GenIdSet ty -> GenId ty -> GenIdSet ty
1467 elementOfIdSet :: GenId ty -> GenIdSet ty -> Bool
1468 minusIdSet :: GenIdSet ty -> GenIdSet ty -> GenIdSet ty
1469 isEmptyIdSet :: GenIdSet ty -> Bool
1470 mkIdSet :: [GenId ty] -> GenIdSet ty
1472 emptyIdSet = emptyUniqSet
1473 unitIdSet = unitUniqSet
1474 addOneToIdSet = addOneToUniqSet
1475 intersectIdSets = intersectUniqSets
1476 unionIdSets = unionUniqSets
1477 unionManyIdSets = unionManyUniqSets
1478 idSetToList = uniqSetToList
1479 elementOfIdSet = elementOfUniqSet
1480 minusIdSet = minusUniqSet
1481 isEmptyIdSet = isEmptyUniqSet
1486 addId, nmbrId, nmbrDataCon :: Id -> NmbrM Id
1488 addId id@(Id u n ty det prag info) nenv@(NmbrEnv ui ut uu idenv tvenv uvenv)
1489 = case (lookupUFM_Directly idenv u) of
1490 Just xx -> trace "addId: already in map!" $
1493 if toplevelishId id then
1494 trace "addId: can't add toplevelish!" $
1496 else -- alloc a new unique for this guy
1497 -- and add an entry in the idenv
1498 -- NB: *** KNOT-TYING ***
1500 nenv_plus_id = NmbrEnv (incrUnique ui) ut uu
1501 (addToUFM_Directly idenv u new_id)
1504 (nenv2, new_ty) = nmbrType ty nenv_plus_id
1505 (nenv3, new_det) = nmbr_details det nenv2
1507 new_id = Id ui n new_ty new_det prag info
1511 nmbrId id@(Id u n ty det prag info) nenv@(NmbrEnv ui ut uu idenv tvenv uvenv)
1512 = case (lookupUFM_Directly idenv u) of
1513 Just xx -> (nenv, xx)
1515 if not (toplevelishId id) then
1516 trace "nmbrId: lookup failed" $
1520 (nenv2, new_ty) = nmbrType ty nenv
1521 (nenv3, new_det) = nmbr_details det nenv2
1523 new_id = Id u n new_ty new_det prag info
1527 -- used when renumbering TyCons to produce data decls...
1528 nmbrDataCon id@(Id _ _ _ (TupleConId _) _ _) nenv
1529 = (nenv, id) -- nothing to do for tuples
1531 nmbrDataCon id@(Id u n ty (AlgConId tag marks fields tvs theta con_tvs con_theta arg_tys tc) prag info)
1532 nenv@(NmbrEnv ui ut uu idenv tvenv uvenv)
1533 = case (lookupUFM_Directly idenv u) of
1534 Just xx -> trace "nmbrDataCon: in env???\n" (nenv, xx)
1537 (nenv2, new_fields) = (mapNmbr nmbrField fields) nenv
1538 (nenv3, new_arg_tys) = (mapNmbr nmbrType arg_tys) nenv2
1540 new_det = AlgConId tag marks new_fields (bottom "tvs") (bottom "theta") (bottom "tvs") (bottom "theta") new_arg_tys tc
1541 new_id = Id u n (bottom "ty") new_det prag info
1545 bottom msg = panic ("nmbrDataCon"++msg)
1548 nmbr_details :: IdDetails -> NmbrM IdDetails
1550 nmbr_details (AlgConId tag marks fields tvs theta con_tvs con_theta arg_tys tc)
1551 = mapNmbr nmbrTyVar tvs `thenNmbr` \ new_tvs ->
1552 mapNmbr nmbrTyVar con_tvs `thenNmbr` \ new_con_tvs ->
1553 mapNmbr nmbrField fields `thenNmbr` \ new_fields ->
1554 mapNmbr nmbr_theta theta `thenNmbr` \ new_theta ->
1555 mapNmbr nmbr_theta con_theta `thenNmbr` \ new_con_theta ->
1556 mapNmbr nmbrType arg_tys `thenNmbr` \ new_arg_tys ->
1557 returnNmbr (AlgConId tag marks new_fields new_tvs new_theta new_con_tvs new_con_theta new_arg_tys tc)
1560 = --nmbrClass c `thenNmbr` \ new_c ->
1561 nmbrType t `thenNmbr` \ new_t ->
1562 returnNmbr (c, new_t)
1564 -- ToDo:add more cases as needed
1565 nmbr_details other_details = returnNmbr other_details
1568 nmbrField (FieldLabel n ty tag)
1569 = nmbrType ty `thenNmbr` \ new_ty ->
1570 returnNmbr (FieldLabel n new_ty tag)