diff options
Diffstat (limited to 'src/overflow.rs')
| -rw-r--r-- | src/overflow.rs | 57 |
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 + } +} |
