@@ -146,6 +146,22 @@ pub enum Breaks {
146
146
Inconsistent ,
147
147
}
148
148
149
+ #[ derive( Clone , Copy ) ]
150
+ enum IndentStyle {
151
+ /// Vertically aligned under whatever column this block begins at.
152
+ ///
153
+ /// fn demo(arg1: usize,
154
+ /// arg2: usize);
155
+ Visual ,
156
+ /// Indented relative to the indentation level of the previous line.
157
+ ///
158
+ /// fn demo(
159
+ /// arg1: usize,
160
+ /// arg2: usize,
161
+ /// );
162
+ Block { offset : isize } ,
163
+ }
164
+
149
165
#[ derive( Clone , Copy ) ]
150
166
pub struct BreakToken {
151
167
offset : isize ,
@@ -154,7 +170,7 @@ pub struct BreakToken {
154
170
155
171
#[ derive( Clone , Copy ) ]
156
172
pub struct BeginToken {
157
- offset : isize ,
173
+ indent : IndentStyle ,
158
174
breaks : Breaks ,
159
175
}
160
176
@@ -377,7 +393,10 @@ impl Printer {
377
393
fn print_begin ( & mut self , token : BeginToken , size : isize ) {
378
394
if size > self . space {
379
395
self . print_stack . push ( PrintFrame :: Broken { indent : self . indent , breaks : token. breaks } ) ;
380
- self . indent = ( self . indent as isize + token. offset ) as usize ;
396
+ self . indent = match token. indent {
397
+ IndentStyle :: Block { offset } => ( self . indent as isize + offset) as usize ,
398
+ IndentStyle :: Visual => ( self . margin - self . space ) as usize ,
399
+ } ;
381
400
} else {
382
401
self . print_stack . push ( PrintFrame :: Fits ) ;
383
402
}
@@ -425,7 +444,10 @@ impl Printer {
425
444
426
445
/// "raw box"
427
446
pub fn rbox ( & mut self , indent : usize , breaks : Breaks ) {
428
- self . scan_begin ( BeginToken { offset : indent as isize , breaks } )
447
+ self . scan_begin ( BeginToken {
448
+ indent : IndentStyle :: Block { offset : indent as isize } ,
449
+ breaks,
450
+ } )
429
451
}
430
452
431
453
/// Inconsistent breaking box
@@ -438,6 +460,10 @@ impl Printer {
438
460
self . rbox ( indent, Breaks :: Consistent )
439
461
}
440
462
463
+ pub fn visual_align ( & mut self ) {
464
+ self . scan_begin ( BeginToken { indent : IndentStyle :: Visual , breaks : Breaks :: Consistent } ) ;
465
+ }
466
+
441
467
pub fn break_offset ( & mut self , n : usize , off : isize ) {
442
468
self . scan_break ( BreakToken { offset : off, blank_space : n as isize } )
443
469
}
0 commit comments