Rustfmt: Single expression closure without parameters

Created on 6 Jun 2019  路  2Comments  路  Source: rust-lang/rustfmt

Before formatting:

vm.get_method_or_type_error(
    obj.clone(),
    "__getitem__",
    || format!("'{}' object is not iterable", obj.class().name)
)?;

After formatting:

vm.get_method_or_type_error(obj.clone(), "__getitem__", || {
    format!("'{}' object is not iterable", obj.class().name)
})?;

Maybe lazy string (empty closure params and format! call inside) and other single expression closures should not be split by a new line, and instead being considered as an atomic element?

If I add more arguments, so that a list would be formatted as arg-per-line anyway, it behaves exactly like that and is more readable in my opinion

vm.get_method_or_type_error(
    obj.clone(),
    obj.clone(),
    obj.clone(),
    "__getitem__",
    || format!("hello, world1111111111111112222222222, 2222222221111111111111222"),
)?;
a-closures p-low poor-formatting

Most helpful comment

@scampi I would rather not add additional complex heuristics to function formatting, as it's already enough complex and hacky.

I think that we can fix this by disabling adding a block to the body of the closure when the closure is the last argument of the function call.

All 2 comments

I think always adopting a vertical layout for a function's arguments is better, regardless of the closure having a parameter or not.
As an example, see the code below where the closure takes a parameter:

 fn foo() {
-    vm.get_method_or_type_error(
-        obj.clone(),
-        |arg: &str| format!("{}: '{}' object is not iterable", arg, obj.class().name)
-    )?;
+    vm.get_method_or_type_error(obj.clone(), |arg: &str| {
+        format!("{}: '{}' object is not iterable", arg, obj.class().name)
+    })?;
 }

If a function's arguments meets the following criteria, then a vertical layout would be selected:

  • 2+ args
  • at least 1 arg is a closure

What do you think @topecongiro ?

@scampi I would rather not add additional complex heuristics to function formatting, as it's already enough complex and hacky.

I think that we can fix this by disabling adding a block to the body of the closure when the closure is the last argument of the function call.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Diggsey picture Diggsey  路  4Comments

0x7CFE picture 0x7CFE  路  5Comments

torkleyy picture torkleyy  路  5Comments

scampi picture scampi  路  4Comments

gnzlbg picture gnzlbg  路  3Comments