]> git.lizzy.rs Git - rust.git/blobdiff - src/shape.rs
deps: bump rustc-ap to v672
[rust.git] / src / shape.rs
index d793d99a3183a4c3c8322c582059e2d064dbc2cf..4376fd12b526005706f526bcc3252446f8cf74c0 100644 (file)
@@ -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<Shape> {
+    pub(crate) fn block_left(&self, width: usize) -> Option<Shape> {
         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<Shape> {
+    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<Shape> {
         Some(Shape {
             width: self.width.checked_sub(width)?,
             ..*self
         })
     }
 
-    pub fn shrink_left(&self, width: usize) -> Option<Shape> {
+    pub(crate) fn shrink_left(&self, width: usize) -> Option<Shape> {
         Some(Shape {
             width: self.width.checked_sub(width)?,
             indent: self.indent + width,
@@ -243,21 +250,21 @@ pub fn shrink_left(&self, width: usize) -> Option<Shape> {
         })
     }
 
-    pub fn offset_left(&self, width: usize) -> Option<Shape> {
+    pub(crate) fn offset_left(&self, width: usize) -> Option<Shape> {
         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)]