More refactoring of constraint simplification
[ghc-hetmet.git] / compiler / typecheck / TcRules.lhs
index c7e951f..28be06e 100644 (file)
@@ -1,25 +1,27 @@
 %
+% (c) The University of Glasgow 2006
 % (c) The AQUA Project, Glasgow University, 1993-1998
 %
-\section[TcRules]{Typechecking transformation rules}
+
+TcRules: Typechecking transformation rules
 
 \begin{code}
 module TcRules ( tcRules ) where
 
 #include "HsVersions.h"
 
-import HsSyn           ( RuleDecl(..), LRuleDecl, RuleBndr(..), mkHsDictLet )
+import HsSyn
 import TcRnMonad
-import TcSimplify      ( tcSimplifyRuleLhs, tcSimplifyInferCheck )
-import TcMType         ( newFlexiTyVarTy, zonkQuantifiedTyVar, tcSkolSigTyVars )
-import TcType          ( tyVarsOfTypes, openTypeKind, SkolemInfo(..), substTyWith, mkTyVarTys )
-import TcHsType                ( UserTypeCtxt(..), tcHsPatSigType )
-import TcExpr          ( tcMonoExpr )
-import TcEnv           ( tcExtendIdEnv, tcExtendTyVarEnv )
-import Inst            ( instToId )
-import Id              ( idType, mkLocalId )
-import Name            ( Name )
-import SrcLoc          ( noLoc, unLoc )
+import TcSimplify
+import TcMType
+import TcType
+import TcHsType
+import TcExpr
+import TcEnv
+import Inst
+import Id
+import Name
+import SrcLoc
 import Outputable
 \end{code}
 
@@ -76,11 +78,12 @@ tcRule (HsRule name act vars lhs fv_lhs rhs fv_rhs)
        --
        -- NB: tcSimplifyInferCheck zonks the forall_tvs, and 
        --     knocks out any that are constrained by the environment
-    tcSimplifyInferCheck (text "tcRule")
+    getInstLoc (SigOrigin (RuleSkol name))     `thenM` \ loc -> 
+    tcSimplifyInferCheck loc
                         forall_tvs
                         lhs_dicts rhs_lie      `thenM` \ (forall_tvs1, rhs_binds) ->
-    mappM zonkQuantifiedTyVar forall_tvs1      `thenM` \ forall_tvs2 ->
-       -- This zonk is exactly the same as the one in TcBinds.tcBindWithSigs
+    zonkQuantifiedTyVars forall_tvs1           `thenM` \ forall_tvs2 ->
+       -- This zonk is exactly the same as the one in TcBinds.generalise
 
     returnM (HsRule name act
                    (map (RuleBndr . noLoc) (forall_tvs2 ++ tpl_ids))   -- yuk
@@ -98,7 +101,7 @@ tcRuleBndrs (RuleBndrSig var rn_ty : vars) thing_inside
 --  e.g        x :: a->a
 --  The tyvar 'a' is brought into scope first, just as if you'd written
 --             a::*, x :: a->a
-  = do { let ctxt = RuleSigCtxt (unLoc var)
+  = do { let ctxt = FunSigCtxt (unLoc var)
        ; (tyvars, ty) <- tcHsPatSigType ctxt rn_ty
        ; let skol_tvs = tcSkolSigTyVars (SigSkol ctxt) tyvars
              id_ty = substTyWith tyvars (mkTyVarTys skol_tvs) ty