X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypes%2FClass.lhs;h=4083f568111c4c5f260940b7579a649cc8fa274b;hb=c39373f1371fd1e46ea91be262f00c277b31f8e5;hp=bcf8195556e89c7891a16c35e02c53997152f41d;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/compiler/types/Class.lhs b/ghc/compiler/types/Class.lhs index bcf8195..4083f56 100644 --- a/ghc/compiler/types/Class.lhs +++ b/ghc/compiler/types/Class.lhs @@ -5,21 +5,18 @@ \begin{code} module Class ( - Class, + Class, ClassOpItem, - mkClass, + mkClass, classTyVars, classKey, classSelIds, classTyCon, - classSuperClassTheta, - classBigSig, classInstEnv, - - ClassInstEnv + classBigSig, classExtraBigSig, classInstEnv, classTvsFds ) where #include "HsVersions.h" import {-# SOURCE #-} TyCon ( TyCon ) -import {-# SOURCE #-} Type ( Type ) -import {-# SOURCE #-} SpecEnv ( SpecEnv ) +import {-# SOURCE #-} TypeRep ( Type ) +import {-# SOURCE #-} InstEnv ( InstEnv ) import Var ( Id, TyVar ) import Name ( NamedThing(..), Name ) @@ -38,47 +35,53 @@ A @Class@ corresponds to a Greek kappa in the static semantics: \begin{code} data Class - = Class - Unique -- Key for fast comparison - Name - - [TyVar] -- The class type variables + = Class { + classKey :: Unique, -- Key for fast comparison + className :: Name, + + classTyVars :: [TyVar], -- The class type variables + classFunDeps :: [([TyVar], [TyVar])], -- The functional dependencies - [(Class,[Type])] -- Immediate superclasses, and the - [Id] -- corresponding selector functions to - -- extract them from a dictionary of this - -- class + classSCTheta :: [(Class,[Type])], -- Immediate superclasses, and the + classSCSels :: [Id], -- corresponding selector functions to + -- extract them from a dictionary of this + -- class - [Id] -- * selector functions - [Maybe Id] -- * default methods - -- They are all ordered by tag. The - -- selector ids contain unfoldings. + classOpStuff :: [ClassOpItem], -- Ordered by tag - ClassInstEnv -- All the instances of this class + classInstEnv :: InstEnv, -- All the instances of this class - TyCon -- The data type constructor for dictionaries - -- of this class + classTyCon :: TyCon -- The data type constructor for dictionaries + } -- of this class -type ClassInstEnv = SpecEnv Id -- The Ids are dfuns +type ClassOpItem = (Id, -- Selector function; contains unfolding + Id, -- Default methods + Bool) -- True <=> an explicit default method was + -- supplied in the class decl \end{code} The @mkClass@ function fills in the indirect superclasses. \begin{code} mkClass :: Name -> [TyVar] + -> [([TyVar], [TyVar])] -> [(Class,[Type])] -> [Id] - -> [Id] -> [Maybe Id] + -> [(Id, Id, Bool)] -> TyCon - -> ClassInstEnv + -> InstEnv -> Class -mkClass name tyvars super_classes superdict_sels - dict_sels defms tycon class_insts - = Class (getUnique name) name tyvars - super_classes superdict_sels - dict_sels defms - class_insts - tycon +mkClass name tyvars fds super_classes superdict_sels + op_stuff tycon class_insts + = Class { classKey = getUnique name, + className = name, + classTyVars = tyvars, + classFunDeps = fds, + classSCTheta = super_classes, + classSCSels = superdict_sels, + classOpStuff = op_stuff, + classInstEnv = class_insts, + classTyCon = tycon } \end{code} %************************************************************************ @@ -90,14 +93,19 @@ mkClass name tyvars super_classes superdict_sels The rest of these functions are just simple selectors. \begin{code} -classKey (Class key _ _ _ _ _ _ _ _) = key -classSuperClassTheta (Class _ _ _ scs _ _ _ _ _) = scs -classSelIds (Class _ _ _ _ _ sels _ _ _) = sels -classTyCon (Class _ _ _ _ _ _ _ _ tc) = tc -classInstEnv (Class _ _ _ _ _ _ _ env _) = env - -classBigSig (Class _ _ tyvars super_classes sdsels sels defms _ _) - = (tyvars, super_classes, sdsels, sels, defms) +classSelIds (Class {classSCSels = sc_sels, classOpStuff = op_stuff}) + = sc_sels ++ [op_sel | (op_sel, _, _) <- op_stuff] + +classTvsFds c + = (classTyVars c, classFunDeps c) + +classBigSig (Class {classTyVars = tyvars, classSCTheta = sc_theta, + classSCSels = sc_sels, classOpStuff = op_stuff}) + = (tyvars, sc_theta, sc_sels, op_stuff) +classExtraBigSig (Class {classTyVars = tyvars, classFunDeps = fundeps, + classSCTheta = sc_theta, classSCSels = sc_sels, + classOpStuff = op_stuff}) + = (tyvars, fundeps, sc_theta, sc_sels, op_stuff) \end{code} @@ -127,7 +135,7 @@ instance Uniquable Class where getUnique c = classKey c instance NamedThing Class where - getName (Class _ n _ _ _ _ _ _ _) = n + getName clas = className clas instance Outputable Class where ppr c = ppr (getName c)