]> git.lizzy.rs Git - rust.git/commitdiff
Handle very long struct
authortopecongiro <seuchida@gmail.com>
Sat, 24 Jun 2017 10:45:22 +0000 (19:45 +0900)
committertopecongiro <seuchida@gmail.com>
Wed, 5 Jul 2017 09:00:36 +0000 (18:00 +0900)
src/items.rs

index f113dee2c0ce92ba7801944e71769f120d713dcb..844ebf7f13bdc5d048f6486d8984e45d12ee9193 100644 (file)
@@ -392,7 +392,8 @@ pub fn visit_enum(
         generics: &ast::Generics,
         span: Span,
     ) {
-        self.buffer.push_str(&format_header("enum ", ident, vis));
+        let enum_header = format_header("enum ", ident, vis);
+        self.buffer.push_str(&enum_header);
 
         let enum_snippet = self.snippet(span);
         let brace_pos = enum_snippet.find_uncommented("{").unwrap();
@@ -406,6 +407,7 @@ pub fn visit_enum(
             enum_def.variants.is_empty(),
             self.block_indent,
             mk_sp(span.lo, body_start),
+            last_line_width(&enum_header),
         ).unwrap();
         self.buffer.push_str(&generics_str);
 
@@ -1071,11 +1073,19 @@ fn format_struct_struct(
                 fields.is_empty(),
                 offset,
                 mk_sp(span.lo, body_lo),
+                last_line_width(&result),
             ))
         }
         None => {
-            if context.config.item_brace_style() == BraceStyle::AlwaysNextLine &&
-                !fields.is_empty()
+            // 3 = ` {}`, 2 = ` {`.
+            let overhead = if fields.is_empty() { 3 } else { 2 };
+            if (context.config.item_brace_style() == BraceStyle::AlwaysNextLine &&
+                    !fields.is_empty()) ||
+                context
+                    .config
+                    .max_width()
+                    .checked_sub(result.len())
+                    .unwrap_or(0) < overhead
             {
                 format!("\n{}{{", offset.block_only().to_string(context.config))
             } else {
@@ -1083,7 +1093,18 @@ fn format_struct_struct(
             }
         }
     };
-    result.push_str(&generics_str);
+    // 1 = `}`
+    let overhead = if fields.is_empty() { 1 } else { 0 };
+    let max_len = context.config.max_width() - offset.width();
+    if !generics_str.contains('\n') && result.len() + generics_str.len() + overhead > max_len {
+        result.push('\n');
+        result.push_str(&offset
+            .block_indent(context.config)
+            .to_string(context.config));
+        result.push_str(&generics_str.trim_left());
+    } else {
+        result.push_str(&generics_str);
+    }
 
     if fields.is_empty() {
         let snippet = context.snippet(mk_sp(body_lo, span.hi - BytePos(1)));
@@ -1147,16 +1168,13 @@ fn format_tuple_struct(
 
     let where_clause_str = match generics {
         Some(generics) => {
-            let shape = Shape::indented(offset + last_line_width(&header_str), context.config);
+            let budget = context.budget(last_line_width(&header_str));
+            let shape = Shape::legacy(budget, offset);
             let g_span = mk_sp(span.lo, body_lo);
             let generics_str = try_opt!(rewrite_generics(context, generics, shape, g_span));
             result.push_str(&generics_str);
 
-            let where_budget = context
-                .config
-                .max_width()
-                .checked_sub(last_line_width(&result))
-                .unwrap_or(0);
+            let where_budget = context.budget(last_line_width(&result));
             try_opt!(rewrite_where_clause(
                 context,
                 &generics.where_clause,
@@ -1173,6 +1191,18 @@ fn format_tuple_struct(
     };
 
     if fields.is_empty() {
+        // 3 = `();`
+        let used_width = if result.contains('\n') {
+            last_line_width(&result) + 3
+        } else {
+            offset.width() + result.len() + 3
+        };
+        if used_width > context.config.max_width() {
+            result.push('\n');
+            result.push_str(&offset
+                .block_indent(context.config)
+                .to_string(context.config))
+        }
         result.push('(');
         let snippet = context.snippet(mk_sp(body_lo, context.codemap.span_before(span, ")")));
         if snippet.is_empty() {