X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fshape.rs;h=4376fd12b526005706f526bcc3252446f8cf74c0;hb=e4617e0e612206fda148bb7f1ba2388bdf3f68f3;hp=d793d99a3183a4c3c8322c582059e2d064dbc2cf;hpb=7a3b7c9275f057aa1d71ea7516ef33a44bdffb7f;p=rust.git diff --git a/src/shape.rs b/src/shape.rs index d793d99a318..4376fd12b52 100644 --- a/src/shape.rs +++ b/src/shape.rs @@ -5,12 +5,12 @@ use crate::Config; #[derive(Copy, Clone, Debug)] -pub struct Indent { +pub(crate) struct Indent { // Width of the block indent, in characters. Must be a multiple of // Config::tab_spaces. - pub block_indent: usize, + pub(crate) block_indent: usize, // Alignment in characters. - pub alignment: usize, + pub(crate) alignment: usize, } // INDENT_BUFFER.len() = 81 @@ -19,14 +19,14 @@ pub struct Indent { "\n "; impl Indent { - pub fn new(block_indent: usize, alignment: usize) -> Indent { + pub(crate) fn new(block_indent: usize, alignment: usize) -> Indent { Indent { block_indent, alignment, } } - pub fn from_width(config: &Config, width: usize) -> Indent { + pub(crate) fn from_width(config: &Config, width: usize) -> Indent { if config.hard_tabs() { let tab_num = width / config.tab_spaces(); let alignment = width % config.tab_spaces(); @@ -36,23 +36,23 @@ pub fn from_width(config: &Config, width: usize) -> Indent { } } - pub fn empty() -> Indent { + pub(crate) fn empty() -> Indent { Indent::new(0, 0) } - pub fn block_only(&self) -> Indent { + pub(crate) fn block_only(&self) -> Indent { Indent { block_indent: self.block_indent, alignment: 0, } } - pub fn block_indent(mut self, config: &Config) -> Indent { + pub(crate) fn block_indent(mut self, config: &Config) -> Indent { self.block_indent += config.tab_spaces(); self } - pub fn block_unindent(mut self, config: &Config) -> Indent { + pub(crate) fn block_unindent(mut self, config: &Config) -> Indent { if self.block_indent < config.tab_spaces() { Indent::new(self.block_indent, 0) } else { @@ -61,15 +61,15 @@ pub fn block_unindent(mut self, config: &Config) -> Indent { } } - pub fn width(&self) -> usize { + pub(crate) fn width(&self) -> usize { self.block_indent + self.alignment } - pub fn to_string(&self, config: &Config) -> Cow<'static, str> { + pub(crate) fn to_string(&self, config: &Config) -> Cow<'static, str> { self.to_string_inner(config, 1) } - pub fn to_string_with_newline(&self, config: &Config) -> Cow<'static, str> { + pub(crate) fn to_string_with_newline(&self, config: &Config) -> Cow<'static, str> { self.to_string_inner(config, 0) } @@ -136,14 +136,17 @@ fn sub(self, rhs: usize) -> Indent { } } +// 8096 is close enough to infinite for rustfmt. +const INFINITE_SHAPE_WIDTH: usize = 8096; + #[derive(Copy, Clone, Debug)] -pub struct Shape { - pub width: usize, +pub(crate) struct Shape { + pub(crate) width: usize, // The current indentation of code. - pub indent: Indent, + pub(crate) indent: Indent, // Indentation + any already emitted text on the first line of the current // statement. - pub offset: usize, + pub(crate) offset: usize, } impl Shape { @@ -162,7 +165,7 @@ impl Shape { // |<------------>| max width // |<---->| indent // |<--->| width - pub fn legacy(width: usize, indent: Indent) -> Shape { + pub(crate) fn legacy(width: usize, indent: Indent) -> Shape { Shape { width, indent, @@ -170,7 +173,7 @@ pub fn legacy(width: usize, indent: Indent) -> Shape { } } - pub fn indented(indent: Indent, config: &Config) -> Shape { + pub(crate) fn indented(indent: Indent, config: &Config) -> Shape { Shape { width: config.max_width().saturating_sub(indent.width()), indent, @@ -178,14 +181,14 @@ pub fn indented(indent: Indent, config: &Config) -> Shape { } } - pub fn with_max_width(&self, config: &Config) -> Shape { + pub(crate) fn with_max_width(&self, config: &Config) -> Shape { Shape { width: config.max_width().saturating_sub(self.indent.width()), ..*self } } - pub fn visual_indent(&self, extra_width: usize) -> Shape { + pub(crate) fn visual_indent(&self, extra_width: usize) -> Shape { let alignment = self.offset + extra_width; Shape { width: self.width, @@ -194,7 +197,7 @@ pub fn visual_indent(&self, extra_width: usize) -> Shape { } } - pub fn block_indent(&self, extra_width: usize) -> Shape { + pub(crate) fn block_indent(&self, extra_width: usize) -> Shape { if self.indent.alignment == 0 { Shape { width: self.width, @@ -210,32 +213,36 @@ pub fn block_indent(&self, extra_width: usize) -> Shape { } } - pub fn block_left(&self, width: usize) -> Option { + pub(crate) fn block_left(&self, width: usize) -> Option { self.block_indent(width).sub_width(width) } - pub fn add_offset(&self, extra_width: usize) -> Shape { + pub(crate) fn add_offset(&self, extra_width: usize) -> Shape { Shape { offset: self.offset + extra_width, ..*self } } - pub fn block(&self) -> Shape { + pub(crate) fn block(&self) -> Shape { Shape { indent: self.indent.block_only(), ..*self } } - pub fn sub_width(&self, width: usize) -> Option { + pub(crate) fn saturating_sub_width(&self, width: usize) -> Shape { + self.sub_width(width).unwrap_or(Shape { width: 0, ..*self }) + } + + pub(crate) fn sub_width(&self, width: usize) -> Option { Some(Shape { width: self.width.checked_sub(width)?, ..*self }) } - pub fn shrink_left(&self, width: usize) -> Option { + pub(crate) fn shrink_left(&self, width: usize) -> Option { Some(Shape { width: self.width.checked_sub(width)?, indent: self.indent + width, @@ -243,21 +250,21 @@ pub fn shrink_left(&self, width: usize) -> Option { }) } - pub fn offset_left(&self, width: usize) -> Option { + pub(crate) fn offset_left(&self, width: usize) -> Option { self.add_offset(width).sub_width(width) } - pub fn used_width(&self) -> usize { + pub(crate) fn used_width(&self) -> usize { self.indent.block_indent + self.offset } - pub fn rhs_overhead(&self, config: &Config) -> usize { + pub(crate) fn rhs_overhead(&self, config: &Config) -> usize { config .max_width() .saturating_sub(self.used_width() + self.width) } - pub fn comment(&self, config: &Config) -> Shape { + pub(crate) fn comment(&self, config: &Config) -> Shape { let width = min( self.width, config.comment_width().saturating_sub(self.indent.width()), @@ -265,11 +272,19 @@ pub fn comment(&self, config: &Config) -> Shape { Shape { width, ..*self } } - pub fn to_string_with_newline(&self, config: &Config) -> Cow<'static, str> { + pub(crate) fn to_string_with_newline(&self, config: &Config) -> Cow<'static, str> { let mut offset_indent = self.indent; offset_indent.alignment = self.offset; offset_indent.to_string_inner(config, 0) } + + /// Creates a `Shape` with a virtually infinite width. + pub(crate) fn infinite_width(&self) -> Shape { + Shape { + width: INFINITE_SHAPE_WIDTH, + ..*self + } + } } #[cfg(test)]