Fix scoped type variables for expression type signatures
[ghc-hetmet.git] / compiler / deSugar / DsBinds.lhs
index e22cb00..f47a4c7 100644 (file)
@@ -323,6 +323,7 @@ simpleSubst subst expr
   = go expr
   where
     go (Var v)        = lookupVarEnv subst v `orElse` Var v
+    go (Cast e co)     = Cast (go e) co
     go (Type ty)       = Type ty
     go (Lit lit)       = Lit lit
     go (App fun arg)   = App (go fun) (go arg)
@@ -418,19 +419,21 @@ addDictScc var rhs = returnDs rhs
 
 
 \begin{code}
-dsCoercion :: ExprCoFn -> DsM CoreExpr -> DsM CoreExpr
-dsCoercion CoHole           thing_inside = thing_inside
-dsCoercion (CoCompose c1 c2) thing_inside = dsCoercion c1 (dsCoercion c2 thing_inside)
-dsCoercion (CoLams ids c)    thing_inside = do { expr <- dsCoercion c thing_inside
-                                              ; return (mkLams ids expr) }
-dsCoercion (CoTyLams tvs c)  thing_inside = do { expr <- dsCoercion c thing_inside
-                                              ; return (mkLams tvs expr) }
-dsCoercion (CoApps c ids)    thing_inside = do { expr <- dsCoercion c thing_inside
-                                              ; return (mkVarApps expr ids) }
-dsCoercion (CoTyApps c tys)  thing_inside = do { expr <- dsCoercion c thing_inside
-                                              ; return (mkTyApps expr tys) }
-dsCoercion (CoLet bs c)      thing_inside = do { prs <- dsLHsBinds bs
-                                              ; expr <- dsCoercion c thing_inside
+dsCoercion :: HsWrapper -> DsM CoreExpr -> DsM CoreExpr
+dsCoercion WpHole           thing_inside = thing_inside
+dsCoercion (WpCompose c1 c2) thing_inside = dsCoercion c1 (dsCoercion c2 thing_inside)
+dsCoercion (WpCo co)     thing_inside = do { expr <- thing_inside
+                                              ; return (Cast expr co) }
+dsCoercion (WpLam id)        thing_inside = do { expr <- thing_inside
+                                              ; return (Lam id expr) }
+dsCoercion (WpTyLam tv)      thing_inside = do { expr <- thing_inside
+                                              ; return (Lam tv expr) }
+dsCoercion (WpApp id)        thing_inside = do { expr <- thing_inside
+                                              ; return (App expr (Var id)) }
+dsCoercion (WpTyApp ty)      thing_inside = do { expr <- thing_inside
+                                              ; return (App expr (Type ty)) }
+dsCoercion (WpLet bs)        thing_inside = do { prs <- dsLHsBinds bs
+                                              ; expr <- thing_inside
                                               ; return (Let (Rec prs) expr) }
 \end{code}