@@ -120,6 +120,7 @@ let rec external_precedence = (exp: Exp.t): Precedence.t => {
120120
121121 // Same goes for forms which are already surrounded
122122 | Parens (_ )
123+ | Projector (_ )
123124 | ListLit (_ )
124125 | Test (_ )
125126 | HintedTest (_ )
@@ -175,7 +176,8 @@ let external_precedence_pat = (dp: Pat.t) =>
175176
176177 // Same goes for forms which are already surrounded
177178 | ListLit (_ )
178- | Parens (_ ) => Precedence . max
179+ | Parens (_ )
180+ | Projector (_ ) => Precedence . max
179181
180182 // Other forms
181183 | Cons (_ ) => Precedence . cons
@@ -203,6 +205,7 @@ let external_precedence_typ = (tp: Typ.t) =>
203205 | ProdExtension (_ ) => Precedence . ap
204206 // Same goes for forms which are already surrounded
205207 | Parens (_ )
208+ | Projector (_ )
206209 | ProofOf (_ )
207210 | List (_ ) => Precedence . max
208211
@@ -508,6 +511,8 @@ let rec parenthesize =
508511 | Parens (e ) =>
509512 Parens (parenthesize(~already_paren= true , e) |> paren_at(Precedence . min))
510513 |> rewrap
514+ | Projector (data , e ) =>
515+ Projector (data, parenthesize(e) |> paren_at(Precedence . min)) |> rewrap
511516 | Cons (e1 , e2 ) =>
512517 Cons (
513518 parenthesize(e1) |> paren_at(Precedence . cons),
@@ -598,6 +603,9 @@ and parenthesize_pat =
598603 |> paren_pat_at(Precedence . min),
599604 )
600605 |> rewrap
606+ | Projector (data , p ) =>
607+ Projector (data, parenthesize_pat(p) |> paren_pat_at(Precedence . min))
608+ |> rewrap
601609 | Cons (p1 , p2 ) =>
602610 Cons (
603611 parenthesize_pat(p1) |> paren_pat_at(Precedence . cons),
@@ -675,6 +683,9 @@ and parenthesize_typ =
675683 |> paren_typ_at(Precedence . min),
676684 )
677685 |> rewrap
686+ | Projector (data , t ) =>
687+ Projector (data, parenthesize_typ(t) |> paren_typ_at(Precedence . min))
688+ |> rewrap
678689 | List (t ) =>
679690 List (parenthesize_typ(t) |> paren_typ_at(Precedence . min)) |> rewrap
680691 | Prod ([] ) => typ
@@ -1508,6 +1519,14 @@ let rec exp_to_pretty = (~settings: Settings.t, exp: Exp.t): pretty => {
15081519 let id = exp |> Exp . rep_id;
15091520 let + e = go(e);
15101521 wrap (exp , [ mk_form (ParensExp , id , [ e ] )] );
1522+ | Projector ({kind, model}, e) =>
1523+ let id = exp |> Exp . rep_id;
1524+ let + inner_seg = go(e);
1525+ let syntax = Segment . parenthesize(inner_seg);
1526+ wrap(
1527+ exp,
1528+ [ Piece . Projector (ProjectorCore . mk(~id, kind, syntax, model))] ,
1529+ );
15111530 | Cons (e1, e2) =>
15121531 // TODO: Add optional newlines
15131532 let id = exp |> Exp . rep_id;
@@ -1710,6 +1729,14 @@ and pat_to_pretty = (~settings: Settings.t, pat: Pat.t): pretty => {
17101729 let id = pat |> Pat . rep_id;
17111730 let + p = go(p);
17121731 wrap (pat , [ mk_form (ParensPat , id , [ p ] )] );
1732+ | Projector ({kind, model}, p ) =>
1733+ let id = pat |> Pat . rep_id;
1734+ let + inner_seg = go(p);
1735+ let syntax = Segment . parenthesize(inner_seg);
1736+ wrap(
1737+ pat,
1738+ [ Piece . Projector (ProjectorCore . mk(~id, kind, syntax, model))] ,
1739+ );
17131740 | MultiHole (es ) =>
17141741 let + es = es |> List.map(any_to_pretty(~settings: Settings.t)) |> all;
17151742 /* Use IDs from the term for grout pieces, like Tuple uses for commas. */
@@ -1943,6 +1970,14 @@ and typ_to_pretty = (~settings: Settings.t, typ: Typ.t): pretty => {
19431970 let id = typ |> Typ . rep_id;
19441971 let + t = go(t);
19451972 wrap (typ , [ mk_form (ParensTyp , id , [ t ] )] );
1973+ | Projector ({kind, model}, t ) =>
1974+ let id = typ |> Typ . rep_id;
1975+ let + inner_seg = go(t);
1976+ let syntax = Segment . parenthesize(inner_seg);
1977+ wrap(
1978+ typ,
1979+ [ Piece . Projector (ProjectorCore . mk(~id, kind, syntax, model))] ,
1980+ );
19461981 | Rec (tp , t ) =>
19471982 let id = typ |> Typ . rep_id;
19481983 let + tp = tpat_to_pretty(~settings: Settings.t, tp)
0 commit comments