rustc_ast_pretty/pp/
convenience.rs

1use std::borrow::Cow;
2
3use crate::pp::{BeginToken, BreakToken, Breaks, IndentStyle, Printer, SIZE_INFINITY, Token};
4
5impl Printer {
6    /// "raw box"
7    pub fn rbox(&mut self, indent: isize, breaks: Breaks) {
8        self.scan_begin(BeginToken { indent: IndentStyle::Block { offset: indent }, breaks })
9    }
10
11    /// Inconsistent breaking box
12    pub fn ibox(&mut self, indent: isize) {
13        self.rbox(indent, Breaks::Inconsistent)
14    }
15
16    /// Consistent breaking box
17    pub fn cbox(&mut self, indent: isize) {
18        self.rbox(indent, Breaks::Consistent)
19    }
20
21    pub fn visual_align(&mut self) {
22        self.scan_begin(BeginToken { indent: IndentStyle::Visual, breaks: Breaks::Consistent });
23    }
24
25    pub fn break_offset(&mut self, n: usize, off: isize) {
26        self.scan_break(BreakToken {
27            offset: off,
28            blank_space: n as isize,
29            ..BreakToken::default()
30        });
31    }
32
33    pub fn end(&mut self) {
34        self.scan_end()
35    }
36
37    pub fn eof(mut self) -> String {
38        self.scan_eof();
39        self.out
40    }
41
42    pub fn word<S: Into<Cow<'static, str>>>(&mut self, wrd: S) {
43        let string = wrd.into();
44        self.scan_string(string)
45    }
46
47    fn spaces(&mut self, n: usize) {
48        self.break_offset(n, 0)
49    }
50
51    pub fn zerobreak(&mut self) {
52        self.spaces(0)
53    }
54
55    pub fn space(&mut self) {
56        self.spaces(1)
57    }
58
59    pub fn hardbreak(&mut self) {
60        self.spaces(SIZE_INFINITY as usize)
61    }
62
63    pub fn is_beginning_of_line(&self) -> bool {
64        match self.last_token() {
65            Some(last_token) => last_token.is_hardbreak_tok(),
66            None => true,
67        }
68    }
69
70    pub(crate) fn hardbreak_tok_offset(off: isize) -> Token {
71        Token::Break(BreakToken {
72            offset: off,
73            blank_space: SIZE_INFINITY,
74            ..BreakToken::default()
75        })
76    }
77
78    pub fn trailing_comma(&mut self) {
79        self.scan_break(BreakToken { pre_break: Some(','), ..BreakToken::default() });
80    }
81
82    pub fn trailing_comma_or_space(&mut self) {
83        self.scan_break(BreakToken {
84            blank_space: 1,
85            pre_break: Some(','),
86            ..BreakToken::default()
87        });
88    }
89}
90
91impl Token {
92    pub(crate) fn is_hardbreak_tok(&self) -> bool {
93        *self == Printer::hardbreak_tok_offset(0)
94    }
95}