@@ -213,14 +213,24 @@ impl PrettyDoc for Select {
213
213
D :: Doc : Clone ,
214
214
A : Clone ,
215
215
{
216
+ fn format < ' b , C , D , A > ( child : & ' b C , arena : & ' b D ) -> DocBuilder < ' b , D , A >
217
+ where
218
+ D : DocAllocator < ' b , A > ,
219
+ D :: Doc : Clone ,
220
+ A : Clone ,
221
+ C : PrettyDoc ,
222
+ {
223
+ child. pretty_doc ( arena) . group ( )
224
+ }
225
+
216
226
fn delegate < ' b , C , D , A > ( child : & ' b Option < C > , arena : & ' b D ) -> Option < DocBuilder < ' b , D , A > >
217
227
where
218
228
D : DocAllocator < ' b , A > ,
219
229
D :: Doc : Clone ,
220
230
A : Clone ,
221
231
C : PrettyDoc ,
222
232
{
223
- child. as_ref ( ) . map ( |inner| inner . pretty_doc ( arena) . group ( ) )
233
+ child. as_ref ( ) . map ( |inner| format ( inner , arena) )
224
234
}
225
235
226
236
let Select {
@@ -232,25 +242,32 @@ impl PrettyDoc for Select {
232
242
group_by,
233
243
having,
234
244
} = self ;
235
- let clauses = [
236
- Some ( project . pretty_doc ( arena) . group ( ) ) ,
245
+ let mut clauses = [
246
+ Some ( format ( project , arena) ) ,
237
247
delegate ( exclude, arena) ,
238
- from. as_ref ( ) . map ( |inner| inner. pretty_doc ( arena) . group ( ) ) ,
239
- from_let
240
- . as_ref ( )
241
- . map ( |inner| inner. pretty_doc ( arena) . group ( ) ) ,
242
- where_clause
243
- . as_ref ( )
244
- . map ( |inner| inner. pretty_doc ( arena) . group ( ) ) ,
245
- group_by
246
- . as_ref ( )
247
- . map ( |inner| inner. pretty_doc ( arena) . group ( ) ) ,
248
- having. as_ref ( ) . map ( |inner| inner. pretty_doc ( arena) . group ( ) ) ,
248
+ delegate ( from, arena) ,
249
+ delegate ( from_let, arena) ,
250
+ delegate ( where_clause, arena) ,
251
+ delegate ( group_by, arena) ,
252
+ delegate ( having, arena) ,
249
253
]
250
254
. into_iter ( )
251
255
. flatten ( ) ;
252
256
253
- arena. intersperse ( clauses, arena. softline ( ) ) . group ( )
257
+ let mut result = arena. nil ( ) ;
258
+ let separator = arena. line ( ) ;
259
+ if let Some ( first) = clauses. next ( ) {
260
+ let mut curr = first;
261
+
262
+ for clause in clauses {
263
+ result = result. append ( curr. append ( separator. clone ( ) ) . group ( ) ) ;
264
+ curr = clause;
265
+ }
266
+
267
+ result = result. append ( curr) ;
268
+ }
269
+
270
+ result
254
271
}
255
272
}
256
273
@@ -282,9 +299,9 @@ impl PrettyDoc for ProjectionKind {
282
299
}
283
300
ProjectionKind :: ProjectPivot ( ProjectPivot { key, value } ) => {
284
301
let parts = [
285
- key. pretty_doc ( arena) ,
286
- arena. text ( "AT" ) ,
287
302
value. pretty_doc ( arena) ,
303
+ arena. text ( "AT" ) ,
304
+ key. pretty_doc ( arena) ,
288
305
] ;
289
306
let decl = arena. intersperse ( parts, arena. space ( ) ) . group ( ) ;
290
307
pretty_annotated_doc ( "PIVOT" , decl, arena)
@@ -401,6 +418,7 @@ impl PrettyDoc for Expr {
401
418
unreachable ! ( ) ;
402
419
}
403
420
}
421
+ . group ( )
404
422
}
405
423
}
406
424
@@ -570,10 +588,13 @@ impl PrettyDoc for BinOp {
570
588
let op = arena. text ( sym) ;
571
589
let lhs = lhs. pretty_doc ( arena) . nest ( nest) ;
572
590
let rhs = rhs. pretty_doc ( arena) . nest ( nest) ;
573
- let sep = arena. space ( ) ;
591
+ let sep = if nest == 0 {
592
+ arena. space ( )
593
+ } else {
594
+ arena. softline ( )
595
+ } ;
574
596
let expr = arena. intersperse ( [ lhs, op, rhs] , sep) . group ( ) ;
575
- let paren_expr = [ arena. text ( "(" ) , expr, arena. text ( ")" ) ] ;
576
- arena. concat ( paren_expr) . group ( )
597
+ pretty_parenthesized_doc ( expr, arena) . group ( )
577
598
}
578
599
}
579
600
@@ -698,30 +719,9 @@ impl PrettyDoc for SimpleCase {
698
719
default,
699
720
} = self ;
700
721
701
- let kw_case = arena. text ( "CASE" ) ;
702
722
let search = expr. pretty_doc ( arena) ;
703
- let branches = cases. iter ( ) . map ( |ExprPair { first, second } | {
704
- let kw_when = arena. text ( "WHEN" ) ;
705
- let test = first. pretty_doc ( arena) ;
706
- let kw_then = arena. text ( "THEN" ) ;
707
- let then = second. pretty_doc ( arena) ;
708
- arena
709
- . intersperse ( [ kw_when, test, kw_then, then] , arena. space ( ) )
710
- . group ( )
711
- } ) ;
712
- let branches = arena
713
- . intersperse ( branches, arena. softline ( ) )
714
- . group ( )
715
- . nest ( MINOR_NEST_INDENT ) ;
716
- let default = default
717
- . as_ref ( )
718
- . map ( |d| arena. text ( "ELSE " ) . append ( d. pretty_doc ( arena) ) ) ;
719
-
720
- if let Some ( default) = default {
721
- arena. intersperse ( [ kw_case, search, branches, default] , arena. softline ( ) )
722
- } else {
723
- arena. intersperse ( [ kw_case, search, branches] , arena. softline ( ) )
724
- }
723
+ let branches = case_branches ( arena, cases, default) ;
724
+ pretty_seq_doc ( branches, "CASE" , Some ( search) , "END" , " " , arena)
725
725
}
726
726
}
727
727
@@ -734,30 +734,37 @@ impl PrettyDoc for SearchedCase {
734
734
{
735
735
let SearchedCase { cases, default } = self ;
736
736
737
- let kw_case = arena. text ( "CASE" ) ;
738
- let branches = cases. iter ( ) . map ( |ExprPair { first, second } | {
737
+ let branches = case_branches ( arena, cases, default) ;
738
+ pretty_seq_doc ( branches, "CASE" , None , "END" , " " , arena)
739
+ }
740
+ }
741
+
742
+ fn case_branches < ' b , D , A > (
743
+ arena : & ' b D ,
744
+ cases : & ' b [ ExprPair ] ,
745
+ default : & ' b Option < Box < Expr > > ,
746
+ ) -> impl Iterator < Item = DocBuilder < ' b , D , A > >
747
+ where
748
+ D : DocAllocator < ' b , A > ,
749
+ D :: Doc : Clone ,
750
+ A : Clone + ' b ,
751
+ {
752
+ cases
753
+ . iter ( )
754
+ . map ( |ExprPair { first, second } | {
739
755
let kw_when = arena. text ( "WHEN" ) ;
740
756
let test = first. pretty_doc ( arena) ;
741
757
let kw_then = arena. text ( "THEN" ) ;
742
758
let then = second. pretty_doc ( arena) ;
743
759
arena
744
760
. intersperse ( [ kw_when, test, kw_then, then] , arena. space ( ) )
745
761
. group ( )
746
- } ) ;
747
- let branches = arena
748
- . intersperse ( branches, arena. softline ( ) )
749
- . group ( )
750
- . nest ( MINOR_NEST_INDENT ) ;
751
- let default = default
752
- . as_ref ( )
753
- . map ( |d| arena. text ( "ELSE " ) . append ( d. pretty_doc ( arena) ) ) ;
754
-
755
- if let Some ( default) = default {
756
- arena. intersperse ( [ kw_case, branches, default] , arena. softline ( ) )
757
- } else {
758
- arena. intersperse ( [ kw_case, branches] , arena. softline ( ) )
759
- }
760
- }
762
+ } )
763
+ . chain (
764
+ default
765
+ . iter ( )
766
+ . map ( |d| arena. text ( "ELSE " ) . append ( d. pretty_doc ( arena) ) . group ( ) ) ,
767
+ )
761
768
}
762
769
763
770
impl PrettyDoc for Struct {
@@ -1258,41 +1265,61 @@ where
1258
1265
D :: Doc : Clone ,
1259
1266
A : Clone ,
1260
1267
{
1261
- arena
1262
- . text ( "(" )
1263
- . append ( arena. space ( ) )
1264
- . append ( doc)
1265
- . append ( arena. space ( ) )
1266
- . append ( arena. text ( ")" ) )
1267
- . group ( )
1268
+ arena. text ( "(" ) . append ( doc) . append ( arena. text ( ")" ) ) . group ( )
1268
1269
}
1269
1270
1270
- fn pretty_seq < ' i , ' b , I , P , D , A > (
1271
- list : I ,
1271
+ fn pretty_seq_doc < ' i , ' b , I , E , D , A > (
1272
+ seq : I ,
1272
1273
start : & ' static str ,
1274
+ qualifier : Option < E > ,
1273
1275
end : & ' static str ,
1274
1276
sep : & ' static str ,
1275
1277
arena : & ' b D ,
1276
1278
) -> DocBuilder < ' b , D , A >
1277
1279
where
1278
- I : IntoIterator < Item = & ' b P > ,
1279
- P : PrettyDoc + ' b ,
1280
+ E : Pretty < ' b , D , A > ,
1281
+ I : IntoIterator < Item = E > ,
1280
1282
D : DocAllocator < ' b , A > ,
1281
1283
D :: Doc : Clone ,
1282
1284
A : Clone ,
1283
1285
{
1284
1286
let start = arena. text ( start) ;
1285
1287
let end = arena. text ( end) ;
1286
1288
let sep = arena. text ( sep) . append ( arena. line ( ) ) ;
1287
- let seq = list. into_iter ( ) . map ( |l| l. pretty_doc ( arena) ) ;
1288
- let body = arena. line ( ) . append ( arena. intersperse ( seq, sep) ) . group ( ) ;
1289
+ let start = if let Some ( qual) = qualifier {
1290
+ start. append ( arena. space ( ) ) . append ( qual)
1291
+ } else {
1292
+ start
1293
+ } ;
1294
+ let body = arena
1295
+ . line ( )
1296
+ . append ( arena. intersperse ( seq, sep) )
1297
+ . append ( arena. line ( ) )
1298
+ . group ( ) ;
1289
1299
start
1290
1300
. append ( body. nest ( MINOR_NEST_INDENT ) )
1291
- . append ( arena. line ( ) )
1292
1301
. append ( end)
1293
1302
. group ( )
1294
1303
}
1295
1304
1305
+ fn pretty_seq < ' i , ' b , I , P , D , A > (
1306
+ list : I ,
1307
+ start : & ' static str ,
1308
+ end : & ' static str ,
1309
+ sep : & ' static str ,
1310
+ arena : & ' b D ,
1311
+ ) -> DocBuilder < ' b , D , A >
1312
+ where
1313
+ I : IntoIterator < Item = & ' b P > ,
1314
+ P : PrettyDoc + ' b ,
1315
+ D : DocAllocator < ' b , A > ,
1316
+ D :: Doc : Clone ,
1317
+ A : Clone ,
1318
+ {
1319
+ let seq = list. into_iter ( ) . map ( |l| l. pretty_doc ( arena) ) ;
1320
+ pretty_seq_doc ( seq, start, None , end, sep, arena)
1321
+ }
1322
+
1296
1323
fn pretty_list < ' b , I , P , D , A > ( list : I , nest : isize , arena : & ' b D ) -> DocBuilder < ' b , D , A >
1297
1324
where
1298
1325
I : IntoIterator < Item = & ' b P > ,
0 commit comments