about summary refs log tree commit diff
path: root/src/overflow.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/overflow.rs')
-rw-r--r--src/overflow.rs57
1 files changed, 54 insertions, 3 deletions
diff --git a/src/overflow.rs b/src/overflow.rs
index 22b07fbc178..47979fa119c 100644
--- a/src/overflow.rs
+++ b/src/overflow.rs
@@ -18,7 +18,6 @@ use syntax::{ast, ptr};
 use closures;
 use expr::{
     can_be_overflowed_expr, is_every_expr_simple, is_method_call, is_nested_call, is_simple_expr,
-    maybe_get_args_offset,
 };
 use lists::{definitive_tactic, itemize_list, write_list, ListFormatting, ListItem, Separator};
 use macros::MacroArg;
@@ -32,6 +31,42 @@ use utils::{count_newlines, extra_offset, first_line_width, last_line_width, mk_
 
 use std::cmp::min;
 
+const SHORT_ITEM_THRESHOLD: usize = 10;
+
+/// A list of `format!`-like macros, that take a long format string and a list of arguments to
+/// format.
+///
+/// Organized as a list of `(&str, usize)` tuples, giving the name of the macro and the number of
+/// arguments before the format string (none for `format!("format", ...)`, one for `assert!(result,
+/// "format", ...)`, two for `assert_eq!(left, right, "format", ...)`).
+const SPECIAL_MACRO_WHITELIST: &[(&str, usize)] = &[
+    // format! like macros
+    // From the Rust Standard Library.
+    ("eprint!", 0),
+    ("eprintln!", 0),
+    ("format!", 0),
+    ("format_args!", 0),
+    ("print!", 0),
+    ("println!", 0),
+    ("panic!", 0),
+    ("unreachable!", 0),
+    // From the `log` crate.
+    ("debug!", 0),
+    ("error!", 0),
+    ("info!", 0),
+    ("warn!", 0),
+    // write! like macros
+    ("assert!", 1),
+    ("debug_assert!", 1),
+    ("write!", 1),
+    ("writeln!", 1),
+    // assert_eq! like macros
+    ("assert_eq!", 2),
+    ("assert_ne!", 2),
+    ("debug_assert_eq!", 2),
+    ("debug_assert_ne!", 2),
+];
+
 pub enum OverflowableItem<'a> {
     Expr(&'a ast::Expr),
     GenericParam(&'a ast::GenericParam),
@@ -178,8 +213,6 @@ where
     iter.map(|x| IntoOverflowableItem::into_overflowable_item(x))
 }
 
-const SHORT_ITEM_THRESHOLD: usize = 10;
-
 pub fn rewrite_with_parens<'a, T: 'a + IntoOverflowableItem<'a>>(
     context: &'a RewriteContext,
     ident: &'a str,
@@ -661,3 +694,21 @@ fn no_long_items(list: &[ListItem]) -> bool {
     list.iter()
         .all(|item| item.inner_as_ref().len() <= SHORT_ITEM_THRESHOLD)
 }
+
+/// In case special-case style is required, returns an offset from which we start horizontal layout.
+pub fn maybe_get_args_offset(callee_str: &str, args: &[OverflowableItem]) -> Option<(bool, usize)> {
+    if let Some(&(_, num_args_before)) = args
+        .get(0)?
+        .whitelist()
+        .iter()
+        .find(|&&(s, _)| s == callee_str)
+    {
+        let all_simple = args.len() > num_args_before
+            && is_every_expr_simple(&args[0..num_args_before])
+            && is_every_expr_simple(&args[num_args_before + 1..]);
+
+        Some((all_simple, num_args_before))
+    } else {
+        None
+    }
+}