@@ -375,7 +375,10 @@ data PDecl' t
375 | PMutual FC [PDecl' t] -- ^ Mutual block
375 | PMutual FC [PDecl' t] -- ^ Mutual block
376 | PDirective (Idris ()) -- ^ Compiler directive. The parser inserts the corresponding action in the Idris monad.
376 | PDirective (Idris ()) -- ^ Compiler directive. The parser inserts the corresponding action in the Idris monad.
377 | PProvider SyntaxInfo FC Name t t -- ^ Type provider. The first t is the type, the second is the term
377 | PProvider SyntaxInfo FC Name t t -- ^ Type provider. The first t is the type, the second is the term
378+ | PReflection FC Name -- type to reflect to
379+ t -- type of variables
380+ [PClause' t] -- ^ Pattern clauses
378− deriving Functor
381+ deriving Functor
380deriving instance Binary PDecl'
383deriving instance Binary PDecl'
@@ -511,7 +514,7 @@ data PTerm = PQuote Raw
511 | PRefl FC PTerm
514 | PRefl FC PTerm
512 | PResolveTC FC
515 | PResolveTC FC
513 | PEq FC PTerm PTerm
516 | PEq FC PTerm PTerm
514− | PRewrite FC PTerm PTerm
517+ | PRewrite FC PTerm PTerm (Maybe PTerm)
515 | PPair FC PTerm PTerm
518 | PPair FC PTerm PTerm
516 | PDPair FC PTerm PTerm PTerm
519 | PDPair FC PTerm PTerm PTerm
517 | PAlternative Bool [PTerm] -- True if only one may work
520 | PAlternative Bool [PTerm] -- True if only one may work
@@ -539,7 +542,8 @@ mapPT f t = f (mpt t) where
539 mpt (PLam n t s) = PLam n (mapPT f t) (mapPT f s)
542 mpt (PLam n t s) = PLam n (mapPT f t) (mapPT f s)
540 mpt (PPi p n t s) = PPi p n (mapPT f t) (mapPT f s)
543 mpt (PPi p n t s) = PPi p n (mapPT f t) (mapPT f s)
541 mpt (PLet n ty v s) = PLet n (mapPT f ty) (mapPT f v) (mapPT f s)
544 mpt (PLet n ty v s) = PLet n (mapPT f ty) (mapPT f v) (mapPT f s)
542− mpt (PRewrite fc t s) = PRewrite fc (mapPT f t) (mapPT f s)
545+ mpt (PRewrite fc t s g) = PRewrite fc (mapPT f t) (mapPT f s)
543 mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)
547 mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)
544 mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os)
548 mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os)
545 mpt (PEq fc l r) = PEq fc (mapPT f l) (mapPT f r)
549 mpt (PEq fc l r) = PEq fc (mapPT f l) (mapPT f r)
@@ -965,7 +969,7 @@ prettyImp impl = prettySe 10
965 prettySe 10 l <+> text "=" $$ nest nestingSize (prettySe 10 r)
969 prettySe 10 l <+> text "=" $$ nest nestingSize (prettySe 10 r)
967 prettySe 10 l <+> text "=" <+> prettySe 10 r
971 prettySe 10 l <+> text "=" <+> prettySe 10 r
968− prettySe p (PRewrite _ l r) =
972+ prettySe p (PRewrite _ l r _) =
969 bracket p 2 $
973 bracket p 2 $
970 if size r > breakingSize then
974 if size r > breakingSize then
971 text "rewrite" <+> prettySe 10 l <+> text "in" $$ nest nestingSize (prettySe 10 r)
975 text "rewrite" <+> prettySe 10 l <+> text "in" $$ nest nestingSize (prettySe 10 r)
@@ -1082,7 +1086,7 @@ showImp impl tm = se 10 tm where
1082 se p (PTrue _) = "()"
1086 se p (PTrue _) = "()"
1083 se p (PFalse _) = "_|_"
1087 se p (PFalse _) = "_|_"
1084 se p (PEq _ l r) = bracket p 2 $ se 10 l ++ " = " ++ se 10 r
1088 se p (PEq _ l r) = bracket p 2 $ se 10 l ++ " = " ++ se 10 r
1085− se p (PRewrite _ l r) = bracket p 2 $ "rewrite " ++ se 10 l ++ " in " ++ se 10 r
1089+ se p (PRewrite _ l r _) = bracket p 2 $ "rewrite " ++ se 10 l ++ " in " ++ se 10 r
1086 se p (PTyped l r) = "(" ++ se 10 l ++ " : " ++ se 10 r ++ ")"
1090 se p (PTyped l r) = "(" ++ se 10 l ++ " : " ++ se 10 r ++ ")"
1087 se p (PPair _ l r) = "(" ++ se 10 l ++ ", " ++ se 10 r ++ ")"
1091 se p (PPair _ l r) = "(" ++ se 10 l ++ ", " ++ se 10 r ++ ")"
1088 se p (PDPair _ l t r) = "(" ++ se 10 l ++ " ** " ++ se 10 r ++ ")"
1092 se p (PDPair _ l t r) = "(" ++ se 10 l ++ " ** " ++ se 10 r ++ ")"
@@ -1160,7 +1164,7 @@ instance Sized PTerm where
1160 size (PRefl fc _) = 1
1164 size (PRefl fc _) = 1
1161 size (PResolveTC fc) = 1
1165 size (PResolveTC fc) = 1
1162 size (PEq fc left right) = 1 + size left + size right
1166 size (PEq fc left right) = 1 + size left + size right
1163− size (PRewrite fc left right) = 1 + size left + size right
1167+ size (PRewrite fc left right _) = 1 + size left + size right
1164 size (PPair fc left right) = 1 + size left + size right
1168 size (PPair fc left right) = 1 + size left + size right
1165 size (PDPair fs left ty right) = 1 + size left + size ty + size right
1169 size (PDPair fs left ty right) = 1 + size left + size ty + size right
1166 size (PAlternative a alts) = 1 + size alts
1170 size (PAlternative a alts) = 1 + size alts
@@ -1194,7 +1198,7 @@ allNamesIn tm = nub $ ni [] tm
1194 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1198 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1195 ni env (PHidden tm) = ni env tm
1199 ni env (PHidden tm) = ni env tm
1196 ni env (PEq _ l r) = ni env l ++ ni env r
1200 ni env (PEq _ l r) = ni env l ++ ni env r
1197− ni env (PRewrite _ l r) = ni env l ++ ni env r
1201+ ni env (PRewrite _ l r _) = ni env l ++ ni env r
1198 ni env (PTyped l r) = ni env l ++ ni env r
1202 ni env (PTyped l r) = ni env l ++ ni env r
1199 ni env (PPair _ l r) = ni env l ++ ni env r
1203 ni env (PPair _ l r) = ni env l ++ ni env r
1200 ni env (PDPair _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1204 ni env (PDPair _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
@@ -1218,7 +1222,7 @@ namesIn uvars ist tm = nub $ ni [] tm
1218 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1222 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1219 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1223 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1220 ni env (PEq _ l r) = ni env l ++ ni env r
1224 ni env (PEq _ l r) = ni env l ++ ni env r
1221− ni env (PRewrite _ l r) = ni env l ++ ni env r
1225+ ni env (PRewrite _ l r _) = ni env l ++ ni env r
1222 ni env (PTyped l r) = ni env l ++ ni env r
1226 ni env (PTyped l r) = ni env l ++ ni env r
1223 ni env (PPair _ l r) = ni env l ++ ni env r
1227 ni env (PPair _ l r) = ni env l ++ ni env r
1224 ni env (PDPair _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1228 ni env (PDPair _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
@@ -1243,7 +1247,7 @@ usedNamesIn vars ist tm = nub $ ni [] tm
1243 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1247 ni env (PLam n ty sc) = ni env ty ++ ni (n:env) sc
1244 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1248 ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc
1245 ni env (PEq _ l r) = ni env l ++ ni env r
1249 ni env (PEq _ l r) = ni env l ++ ni env r
1246− ni env (PRewrite _ l r) = ni env l ++ ni env r
1250+ ni env (PRewrite _ l r _) = ni env l ++ ni env r
1247 ni env (PTyped l r) = ni env l ++ ni env r
1251 ni env (PTyped l r) = ni env l ++ ni env r
1248 ni env (PPair _ l r) = ni env l ++ ni env r
1252 ni env (PPair _ l r) = ni env l ++ ni env r
1249 ni env (PDPair _ (PRef _ n) t r) = ni env t ++ ni (n:env) r
1253 ni env (PDPair _ (PRef _ n) t r) = ni env t ++ ni (n:env) r