@@ -35,7 +35,7 @@ import qualified Data.Text as T
3535
3636import Debug.Trace
3737
38−data ElabMode = ETyDecl | ELHS | ERHS
38+data ElabMode = ETyDecl | ETransLHS | ELHS | ERHS
3939 deriving Eq
4040
4141
@@ -220,7 +220,7 @@ elab ist info emode opts fn tm
220220 sequence_ (get_delayed_elab est)
221221 end_unify
222222 ptm <- get_term
223− when pattern -- convert remaining holes to pattern vars
223+ when (pattern || intransform) -- convert remaining holes to pattern vars
224224 (do update_term orderPats
225225 unify_all
226226 matchProblems False -- only the ones we matched earlier
@@ -228,7 +228,8 @@ elab ist info emode opts fn tm
228228 mkPat)
229229 where
230230 pattern = emode == ELHS
231− bindfree = emode == ETyDecl || emode == ELHS
231+ intransform = emode == ETransLHS
232+ bindfree = emode == ETyDecl || emode == ELHS || emode == ETransLHS
232233
233234 get_delayed_elab est =
234235 let ds = delayed_elab est in
@@ -489,7 +490,7 @@ elab ist info emode opts fn tm
489490 = lift $ tfail $ Msg ("No explicit types on left hand side: " ++ show tm)
490491 | pattern && not reflection && not (e_qq ec) && e_nomatching ec
491492 = lift $ tfail $ Msg ("Attempting concrete match on polymorphic argument: " ++ show tm)
492− | (pattern || (bindfree && bindable n)) && not (inparamBlock n) && not (e_qq ec)
493+ | (pattern || intransform || (bindfree && bindable n)) && not (inparamBlock n) && not (e_qq ec)
493494 = do let ina = e_inarg ec
494495 guarded = e_guarded ec
495496 inty = e_intype ec
@@ -500,7 +501,7 @@ elab ist info emode opts fn tm
500501 _ -> True
501502 -- this is to stop us resolve type classes recursively
502503 -- trace (show (n, guarded)) $
503− if (tcname n && ina)
504+ if (tcname n && ina && not intransform)
504505 then erun fc $
505506 do patvar n
506507 update_term liftPats
@@ -611,7 +612,7 @@ elab ist info emode opts fn tm
611612 ivs' <- get_instances
612613 env <- get_env
613614 elabE (ina { e_inarg = True }) (Just fc) sc
614− when (not pattern) $
615+ when (not (pattern || intransform)) $
615616 mapM_ (\n -> do focus n
616617 g <- goal
617618 hs <- get_holes
@@ -799,7 +800,7 @@ elab ist info emode opts fn tm
799800 -- to be needed.
800801 implicitApp :: ElabD [ImplicitInfo] -> ElabD ()
801802 implicitApp elab
802− | pattern = do elab; return ()
803+ | pattern || intransform = do elab; return ()
803804 | otherwise
804805 = do s <- get
805806 imps <- elab