@@ -30,6 +30,8 @@ import Data.Word (Word)
31import Debug.Trace
31import Debug.Trace
33+import Text.PrettyPrint.Annotated.Leijen
33data IOption = IOption { opt_logLevel :: Int,
35data IOption = IOption { opt_logLevel :: Int,
34 opt_typecase :: Bool,
36 opt_typecase :: Bool,
35 opt_typeintype :: Bool,
37 opt_typeintype :: Bool,
@@ -895,7 +897,7 @@ expandNS syn n = case syn_namespace syn of
895instance Show PTerm where
897instance Show PTerm where
896 show tm = showImp Nothing False False tm
898 show tm = showImp Nothing False False tm
898−instance Pretty PTerm where
900+instance Pretty PTerm OutputAnnotation where
899 pretty = prettyImp False
901 pretty = prettyImp False
901instance Show PDecl where
903instance Show PDecl where
@@ -965,15 +967,17 @@ getConsts (_ : xs) = getConsts xs
965getAll :: [PArg] -> [PTerm]
967getAll :: [PArg] -> [PTerm]
966getAll = map getTm
968getAll = map getTm
968-- | Pretty-print a high-level Idris term
971-- | Pretty-print a high-level Idris term
969prettyImp :: Bool -- ^^ whether to show implicits
972prettyImp :: Bool -- ^^ whether to show implicits
970 -> PTerm -- ^^ the term to pretty-print
973 -> PTerm -- ^^ the term to pretty-print
971− -> Doc
974+ -> Doc OutputAnnotation
972prettyImp impl = prettySe 10
975prettyImp impl = prettySe 10
977+ prettySe :: Int -> PTerm -> Doc OutputAnnotation
974 prettySe p (PQuote r) =
978 prettySe p (PQuote r) =
975 if size r > breakingSize then
979 if size r > breakingSize then
976− text "![" $$ pretty r <> text "]"
980+ text "![" <> line <> pretty r <> text "]"
978 text "![" <> pretty r <> text "]"
982 text "![" <> pretty r <> text "]"
979 prettySe p (PPatvar fc n) = pretty n
983 prettySe p (PPatvar fc n) = pretty n
@@ -990,37 +994,37 @@ prettyImp impl = prettySe 10
990 prettySe p (PLam n ty sc) =
994 prettySe p (PLam n ty sc) =
991 bracket p 2 $
995 bracket p 2 $
992 if size sc > breakingSize then
996 if size sc > breakingSize then
993− text "λ" <> pretty n <+> text "=>" $+$ pretty sc
997+ text "λ" <> pretty n <+> text "=>" <> line <> pretty sc
995 text "λ" <> pretty n <+> text "=>" <+> pretty sc
999 text "λ" <> pretty n <+> text "=>" <+> pretty sc
996 prettySe p (PLet n ty v sc) =
1000 prettySe p (PLet n ty v sc) =
997 bracket p 2 $
1001 bracket p 2 $
998 if size sc > breakingSize then
1002 if size sc > breakingSize then
999− text "let" <+> pretty n <+> text "=" <+> prettySe 10 v <+> text "in" $+$
1003+ text "let" <+> pretty n <+> text "=" <+> prettySe 10 v <+> text "in" <>
1000 nest nestingSize (prettySe 10 sc)
1004 nest nestingSize (prettySe 10 sc)
1002 text "let" <+> pretty n <+> text "=" <+> prettySe 10 v <+> text "in" <+>
1006 text "let" <+> pretty n <+> text "=" <+> prettySe 10 v <+> text "in" <+>
1003 prettySe 10 sc
1007 prettySe 10 sc
1004 prettySe p (PPi (Exp l s _ _) n ty sc)
1008 prettySe p (PPi (Exp l s _ _) n ty sc)
1005 | n `elem` allNamesIn sc || impl =
1009 | n `elem` allNamesIn sc || impl =
1006− let open = if l then text "|" <> lparen else lparen in
1010+ let open = (if l then text "|" else empty) <> lparen in
1007 bracket p 2 $
1011 bracket p 2 $
1008 if size sc > breakingSize then
1012 if size sc > breakingSize then
1009− open <> pretty n <+> colon <+> prettySe 10 ty <> rparen <+>
1013+ enclose open rparen (pretty n <+> colon <+> prettySe 10 ty) <+>
1010− st <+> text "->" $+$ prettySe 10 sc
1014+ st <> text "->" <> line <> prettySe 10 sc
1012− open <> pretty n <+> colon <+> prettySe 10 ty <> rparen <+>
1016+ enclose open rparen (pretty n <+> colon <+> prettySe 10 ty) <+>
1013− st <+> text "->" <+> prettySe 10 sc
1017+ st <> text "->" <+> prettySe 10 sc
1014 | otherwise =
1018 | otherwise =
1015 bracket p 2 $
1019 bracket p 2 $
1016 if size sc > breakingSize then
1020 if size sc > breakingSize then
1017− prettySe 0 ty <+> st <+> text "->" $+$ prettySe 10 sc
1021+ prettySe 0 ty <+> st <+> text "->" <> line <> prettySe 10 sc
1019 prettySe 0 ty <+> st <+> text "->" <+> prettySe 10 sc
1023 prettySe 0 ty <+> st <+> text "->" <+> prettySe 10 sc
1022 case s of
1026 case s of
1023− Static -> text "[static]"
1027+ Static -> text "[static]" <> space
1024 _ -> empty
1028 _ -> empty
1025 prettySe p (PPi (Imp l s _ _) n ty sc)
1029 prettySe p (PPi (Imp l s _ _) n ty sc)
1026 | impl =
1030 | impl =
@@ -1028,27 +1032,27 @@ prettyImp impl = prettySe 10
1028 bracket p 2 $
1032 bracket p 2 $
1029 if size sc > breakingSize then
1033 if size sc > breakingSize then
1030 open <> pretty n <+> colon <+> prettySe 10 ty <> rbrace <+>
1034 open <> pretty n <+> colon <+> prettySe 10 ty <> rbrace <+>
1031− st <+> text "->" <+> prettySe 10 sc
1035+ st <> text "->" <+> prettySe 10 sc
1033 open <> pretty n <+> colon <+> prettySe 10 ty <> rbrace <+>
1037 open <> pretty n <+> colon <+> prettySe 10 ty <> rbrace <+>
1034− st <+> text "->" <+> prettySe 10 sc
1038+ st <> text "->" <+> prettySe 10 sc
1035 | otherwise = prettySe 10 sc
1039 | otherwise = prettySe 10 sc
1038 case s of
1042 case s of
1039− Static -> text $ "[static]"
1043+ Static -> text "[static]" <> space
1040 _ -> empty
1044 _ -> empty
1041 prettySe p (PPi (Constraint _ _ _) n ty sc) =
1045 prettySe p (PPi (Constraint _ _ _) n ty sc) =
1042 bracket p 2 $
1046 bracket p 2 $
1043 if size sc > breakingSize then
1047 if size sc > breakingSize then
1044 prettySe 10 ty <+> text "=>" <+> prettySe 10 sc
1048 prettySe 10 ty <+> text "=>" <+> prettySe 10 sc
1046− prettySe 10 ty <+> text "=>" $+$ prettySe 10 sc
1050+ prettySe 10 ty <+> text "=>" <> line <> prettySe 10 sc
1047 prettySe p (PPi (TacImp _ _ s _) n ty sc) =
1051 prettySe p (PPi (TacImp _ _ s _) n ty sc) =
1048 bracket p 2 $
1052 bracket p 2 $
1049 if size sc > breakingSize then
1053 if size sc > breakingSize then
1050 lbrace <> text "tacimp" <+> pretty n <+> colon <+> prettySe 10 ty <>
1054 lbrace <> text "tacimp" <+> pretty n <+> colon <+> prettySe 10 ty <>
1051− rbrace <+> text "->" $+$ prettySe 10 sc
1055+ rbrace <+> text "->" <> line <> prettySe 10 sc
1053 lbrace <> text "tacimp" <+> pretty n <+> colon <+> prettySe 10 ty <>
1057 lbrace <> text "tacimp" <+> pretty n <+> colon <+> prettySe 10 ty <>
1054 rbrace <+> text "->" <+> prettySe 10 sc
1058 rbrace <+> text "->" <+> prettySe 10 sc
@@ -1062,37 +1066,22 @@ prettyImp impl = prettySe 10
1062 let [l, r] = getExps args in
1066 let [l, r] = getExps args in
1063 bracket p 1 $
1067 bracket p 1 $
1064 if size r > breakingSize then
1068 if size r > breakingSize then
1065− prettySe 1 l <+> pretty op $+$ prettySe 0 r
1069+ prettySe 1 l <+> pretty op <> line <> prettySe 0 r
1067 prettySe 1 l <+> pretty op <+> prettySe 0 r
1071 prettySe 1 l <+> pretty op <+> prettySe 0 r
1068 prettySe p (PApp _ f as) =
1072 prettySe p (PApp _ f as) =
1069 let args = getExps as in
1073 let args = getExps as in
1070 bracket p 1 $
1074 bracket p 1 $
1071 prettySe 1 f <+>
1075 prettySe 1 f <+>
1072− if impl then
1076+ align (hsep (if impl
1074− -- foldr (<+>) empty $ map prettyArgS as
1077+ then map prettyArgS as
1076− foldl' fSe empty args
1077− -- foldr (<+>) empty $ map prettyArgSe args
1078+ else map prettyArgSe args))
1080− if size r > breakingSize then
1081− l $+$ nest nestingSize (prettyArgS r)
1086− if size r > breakingSize then
1087− l $+$ nest nestingSize (prettyArgSe r)
1089− l <+> prettyArgSe r
1090 prettySe p (PCase _ scr opts) =
1079 prettySe p (PCase _ scr opts) =
1091− text "case" <+> prettySe 10 scr <+> text "of" $+$ nest nestingSize prettyBody
1080+ text "case" <+> prettySe 10 scr <+> text "of" <> prettyBody
1093− prettyBody = foldr ($$) empty $ intersperse (text "|") $ map sc opts
1082+ prettyBody = foldr (<>) empty $ intersperse (text "|") $ map sc opts
1095− sc (l, r) = prettySe 10 l <+> text "=>" <+> prettySe 10 r
1084+ sc (l, r) = nest nestingSize $ prettySe 10 l <+> text "=>" <+> prettySe 10 r
1096 prettySe p (PHidden tm) = text "." <> prettySe 0 tm
1085 prettySe p (PHidden tm) = text "." <> prettySe 0 tm
1097 prettySe p (PRefl _ _) = text "refl"
1086 prettySe p (PRefl _ _) = text "refl"
1098 prettySe p (PResolveTC _) = text "resolvetc"
1087 prettySe p (PResolveTC _) = text "resolvetc"
@@ -1101,27 +1090,27 @@ prettyImp impl = prettySe 10
1101 prettySe p (PEq _ l r) =
1090 prettySe p (PEq _ l r) =
1102 bracket p 2 $
1091 bracket p 2 $
1103 if size r > breakingSize then
1092 if size r > breakingSize then
1104− prettySe 10 l <+> text "=" $$ nest nestingSize (prettySe 10 r)
1093+ prettySe 10 l <+> text "=" <> nest nestingSize (prettySe 10 r)
1106 prettySe 10 l <+> text "=" <+> prettySe 10 r
1095 prettySe 10 l <+> text "=" <+> prettySe 10 r
1107 prettySe p (PRewrite _ l r _) =
1096 prettySe p (PRewrite _ l r _) =
1108 bracket p 2 $
1097 bracket p 2 $
1109 if size r > breakingSize then
1098 if size r > breakingSize then
1110− text "rewrite" <+> prettySe 10 l <+> text "in" $$ nest nestingSize (prettySe 10 r)
1099+ text "rewrite" <+> prettySe 10 l <+> text "in" <> nest nestingSize (prettySe 10 r)
1112 text "rewrite" <+> prettySe 10 l <+> text "in" <+> prettySe 10 r
1101 text "rewrite" <+> prettySe 10 l <+> text "in" <+> prettySe 10 r
1113 prettySe p (PTyped l r) =
1102 prettySe p (PTyped l r) =
1114 lparen <> prettySe 10 l <+> colon <+> prettySe 10 r <> rparen
1103 lparen <> prettySe 10 l <+> colon <+> prettySe 10 r <> rparen
1115 prettySe p (PPair _ l r) =
1104 prettySe p (PPair _ l r) =
1116 if size r > breakingSize then
1105 if size r > breakingSize then
1117− lparen <> prettySe 10 l <> text "," $+$
1106+ lparen <> prettySe 10 l <> text "," <>
1118− prettySe 10 r <> rparen
1107+ line <> prettySe 10 r <> rparen
1120 lparen <> prettySe 10 l <> text "," <+> prettySe 10 r <> rparen
1109 lparen <> prettySe 10 l <> text "," <+> prettySe 10 r <> rparen
1121 prettySe p (PDPair _ l t r) =
1110 prettySe p (PDPair _ l t r) =
1122 if size r > breakingSize then
1111 if size r > breakingSize then
1123− lparen <> prettySe 10 l <+> text "**" $+$
1112+ lparen <> prettySe 10 l <+> text "**" <>
1124− prettySe 10 r <> rparen
1113+ line <> prettySe 10 r <> rparen
1126 lparen <> prettySe 10 l <+> text "**" <+> prettySe 10 r <> rparen
1115 lparen <> prettySe 10 l <+> text "**" <+> prettySe 10 r <> rparen
1127 prettySe p (PAlternative a as) =
1116 prettySe p (PAlternative a as) =
@@ -1133,9 +1122,9 @@ prettyImp impl = prettySe 10
1133 prettySe p (PConstant c) = pretty c
1122 prettySe p (PConstant c) = pretty c
1134 -- XXX: add pretty for tactics
1123 -- XXX: add pretty for tactics
1135 prettySe p (PProof ts) =
1124 prettySe p (PProof ts) =
1136− text "proof" <+> lbrace $+$ nest nestingSize (text . show $ ts) $+$ rbrace
1125+ text "proof" <+> lbrace <> nest nestingSize (text . show $ ts) <> rbrace
1137 prettySe p (PTactics ts) =
1126 prettySe p (PTactics ts) =
1138− text "tactics" <+> lbrace $+$ nest nestingSize (text . show $ ts) $+$ rbrace
1127+ text "tactics" <+> lbrace <> nest nestingSize (text . show $ ts) <> rbrace
1139 prettySe p (PMetavar n) = text "?" <> pretty n
1128 prettySe p (PMetavar n) = text "?" <> pretty n
1140 prettySe p (PReturn f) = text "return"
1129 prettySe p (PReturn f) = text "return"
1141 prettySe p PImpossible = text "impossible"
1130 prettySe p PImpossible = text "impossible"