2 | import public Text.PrettyPrint.Bernardy
3 | import Language.Reflection.Util
4 | import public Derive.Show
9 | data PlaceHolder = US
12 | Pretty PlaceHolder where
13 | prettyPrec _ _ = symbol '_'
23 | generalPrettyType : (implicits : List Arg) -> (arg : TTImp) -> TTImp
24 | generalPrettyType is arg =
25 | piAll `({opts : LayoutOpts
} -> Prec
-> ~(arg) -> Doc opts
) is
30 | prettyClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
31 | prettyClaim vis fun p =
32 | simpleClaim vis fun (generalPrettyType (allImplicits p "Pretty") p.applied)
36 | prettyImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
37 | prettyImplClaim v impl p = implClaimVis v impl (implType "Pretty" p)
45 | prettyImplDef : (fun, impl : Name) -> Decl
46 | prettyImplDef f i = def i [patClause (var i) (var "MkPretty" `app` var f)]
51 | parameters (nms : List Name)
53 | arg : BoundArg 1 Explicit -> TTImp
54 | arg (BA (MkArg M0 _ _ _) _ _) = `(pretty US
)
55 | arg (BA (MkArg _ _ _ t) [x] _) = assertIfRec nms t `(prettyArg
~(var x))
58 | rhs : Name -> SnocList TTImp -> TTImp
59 | rhs n st = `(prettyCon p
~(n.namePrim) ~(listOf st))
62 | narg : BoundArg 1 NamedExplicit -> TTImp
64 | let nm := (argName a).namePrim
66 | M0 => `(prettyField
~(nm) US
)
67 | _ => assertIfRec nms a.type `(prettyField
~(nm) ~(var x))
70 | nrhs : Name -> SnocList TTImp -> TTImp
71 | nrhs n st = `(prettyRecord p
~(n.namePrim) ~(listOf st))
74 | prettyClauses : (fun : Maybe Name) -> TypeInfo -> List Clause
75 | prettyClauses fun ti = map clause ti.cons
78 | lhs : TTImp -> TTImp
79 | lhs bc = maybe bc (\x => `(~(var x) ~(pvar) ~(bc))) fun
81 | clause : Con ti.arty ti.args -> Clause
82 | clause c = case all namedArg c.args of
83 | True => accumArgs namedExplicit lhs (nrhs c.name) narg c
84 | False => accumArgs explicit lhs (rhs c.name) arg c
87 | prettyDef : Name -> TypeInfo -> Decl
88 | prettyDef fun ti = def fun (prettyClauses (Just fun) ti)
99 | derivePretty : Elab (Pretty f)
102 | | Nothing => fail "Can't infer goal"
103 | let Just (resTpe, nm) := extractResult tpe
104 | | Nothing => fail "Invalid goal type: \{show tpe}"
108 | lam (lambdaArg {a = Name} "p") $
109 | lam (lambdaArg {a = Name} "x") $
110 | iCase `(x
) implicitFalse (prettyClauses [ti.name] Nothing ti)
112 | logTerm "derive.definitions" 1 "pretty implementation" impl
113 | check $
var "MkPretty" `app` impl
117 | PrettyVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
118 | PrettyVis vis nms p =
119 | let fun := funName p "prettyPrec"
120 | impl := implName p "Pretty"
122 | [ TL (prettyClaim vis fun p) (prettyDef nms fun p.info)
123 | , TL (prettyImplClaim vis impl p) (prettyImplDef fun impl)
128 | Pretty : List Name -> ParamTypeInfo -> Res (List TopLevel)
129 | Pretty = PrettyVis Public