@@ -751,22 +751,53 @@ pClause syn
751 (wheres, nmap) <- choice [pWhereblock n wsyn,
751 (wheres, nmap) <- choice [pWhereblock n wsyn,
752 do lchar ';'
752 do lchar ';'
753 return ([], [])]
753 return ([], [])]
754− return $ PClause n (PApp fc (PRef fc n)
754+ let capp = PApp fc (PRef fc n)
755− (iargs ++ cargs ++ map pexp args)) wargs rhs wheres)
755+ (iargs ++ cargs ++ map pexp args)
756+ setState (ist { lastParse = Just (n, capp, wargs) })
757+ return $ PClause n capp wargs rhs wheres)
758+ <|> try (do wargs <- many (pWExpr syn)
760+ (n, capp, owargs) <- case lastParse ist of
762+ Nothing -> fail "Invalid clause"
764+ let ctxt = tt_ctxt ist
765+ let wsyn = syn { syn_namespace = [] }
766+ (wheres, nmap) <- choice [pWhereblock n wsyn,
769+ return $ PClause n capp (owargs ++ wargs) rhs wheres)
756 <|> try (do n_in <- pfName; let n = expandNS syn n_in
771 <|> try (do n_in <- pfName; let n = expandNS syn n_in
757 cargs <- many (pConstraintArg syn)
772 cargs <- many (pConstraintArg syn)
758 iargs <- many (pImplicitArg syn)
773 iargs <- many (pImplicitArg syn)
759 fc <- pfc
774 fc <- pfc
760 args <- many (pArgExpr syn)
775 args <- many (pArgExpr syn)
761 wargs <- many (pWExpr syn)
776 wargs <- many (pWExpr syn)
777+ let capp = PApp fc (PRef fc n)
778+ (iargs ++ cargs ++ map pexp args)
780+ setState (ist { lastParse = Just (n, capp, wargs) })
762 reserved "with"
781 reserved "with"
763 wval <- pExpr syn
782 wval <- pExpr syn
764 lchar '{'
783 lchar '{'
765 ds <- many1 $ pFunDecl syn
784 ds <- many1 $ pFunDecl syn
766 let withs = concat ds
785 let withs = concat ds
767 lchar '}'
786 lchar '}'
768− return $ PWith n (PApp fc (PRef fc n)
787+ return $ PWith n capp wargs wval withs)
769− (iargs ++ cargs ++ map pexp args)) wargs wval withs)
788+
789+ <|> try (do wargs <- many (pWExpr syn)
792+ (n, capp, owargs) <- case lastParse ist of
794+ Nothing -> fail "Invalid clause"
797+ ds <- many1 $ pFunDecl syn
798+ let withs = concat ds
800+ return $ PWith n capp (owargs ++ wargs) wval withs)
771 <|> do l <- pArgExpr syn
802 <|> do l <- pArgExpr syn
772 op <- operator
803 op <- operator
@@ -779,8 +810,10 @@ pClause syn
779 (wheres, nmap) <- choice [pWhereblock n wsyn,
810 (wheres, nmap) <- choice [pWhereblock n wsyn,
780 do lchar ';'
811 do lchar ';'
781 return ([], [])]
812 return ([], [])]
782− return $ PClause n (PApp fc (PRef fc n) [pexp l,pexp r])
814+ let capp = PApp fc (PRef fc n) [pexp l, pexp r]
815+ setState (ist { lastParse = Just (n, capp, wargs) })
783− wargs rhs wheres
816+ return $ PClause n capp wargs rhs wheres
785 <|> do l <- pArgExpr syn
818 <|> do l <- pArgExpr syn
786 op <- operator
819 op <- operator
@@ -794,7 +827,10 @@ pClause syn
794 ds <- many1 $ pFunDecl syn
827 ds <- many1 $ pFunDecl syn
795 let withs = concat ds
828 let withs = concat ds
796 lchar '}'
829 lchar '}'
797− return $ PWith n (PApp fc (PRef fc n) [pexp l, pexp r]) wargs wval withs
831+ let capp = PApp fc (PRef fc n) [pexp l, pexp r]
832+ setState (ist { lastParse = Just (n, capp, wargs) })
833+ return $ PWith n capp wargs wval withs
799pWExpr :: SyntaxInfo -> IParser PTerm
835pWExpr :: SyntaxInfo -> IParser PTerm
800pWExpr syn = do lchar '|'; pExpr' syn
836pWExpr syn = do lchar '|'; pExpr' syn