method ctyp =
fun f t ->
let () = o#node f t Ast.loc_of_ctyp
in
match t with
| Ast.TyAli (_, t1, t2) ->
pp f "@[<2>%a@ as@ %a@]" o#simple_ctyp t1
o#simple_ctyp t2
| Ast.TyArr (_, t1, t2) ->
pp f "@[<2>%a@ ->@ %a@]" o#ctyp1 t1 o#ctyp t2
| Ast.TyQuP (_, s) -> pp f "+'%a" o#var s
| Ast.TyQuM (_, s) -> pp f "-'%a" o#var s
| Ast.TyOr (_, t1, t2) ->
pp f "%a@ | %a" o#ctyp t1 o#ctyp t2
| Ast.TyCol (_, t1, (Ast.TyMut (_, t2))) ->
pp f "@[mutable@ %a :@ %a@]" o#ctyp t1 o#ctyp t2
| Ast.TyCol (_, t1, t2) ->
pp f "@[<2>%a :@ %a@]" o#ctyp t1 o#ctyp t2
| Ast.TySem (_, t1, t2) ->
pp f "%a;@ %a" o#ctyp t1 o#ctyp t2
| Ast.TyOf (_, t, (Ast.TyNil _)) -> o#ctyp f t
| Ast.TyOf (_, t1, t2) ->
pp f "@[<h>%a@ @[<3>of@ %a@]@]" o#ctyp t1
o#constructor_type t2
| Ast.TyOfAmp (_, t1, t2) ->
pp f "@[<h>%a@ @[<3>of &@ %a@]@]" o#ctyp t1
o#constructor_type t2
| Ast.TyAnd (_, t1, t2) ->
pp f "%a@ and %a" o#ctyp t1 o#ctyp t2
| Ast.TyMut (_, t) ->
pp f "@[<2>mutable@ %a@]" o#ctyp t
| Ast.TyAmp (_, t1, t2) ->
pp f "%a@ &@ %a" o#ctyp t1 o#ctyp t2
| Ast.TyMan (_, t1, t2) ->
pp f "@[<2>%a =@ %a@]" o#simple_ctyp t1 o#ctyp t2
| Ast.TyDcl (_, tn, tp, te, cl) ->
(pp f "@[<2>%a%a@]" o#type_params tp o#var tn;
(match te with
| Ast.TyNil _ -> ()
| _ -> pp f " =@ %a" o#ctyp te);
if cl <> []
then pp f "@ %a" (list o#constrain "@ ") cl
else ())
| t -> o#ctyp1 f t