@@ -1589,26 +1589,64 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
15891589 // e.g. `reuse HasSelf::method;` should suggest `reuse HasSelf::method($args);`.
15901590 full_call_span. shrink_to_hi ( )
15911591 } ;
1592+
1593+ // Controls how the arguments should be listed in the suggestion.
1594+ enum ArgumentsFormatting {
1595+ SingleLine ,
1596+ Multiline { fallback_indent : String , brace_indent : String } ,
1597+ }
1598+ let arguments_formatting = {
1599+ let mut provided_inputs = matched_inputs. iter ( ) . filter_map ( |a| * a) ;
1600+ if let Some ( brace_indent) = source_map. indentation_before ( suggestion_span)
1601+ && let Some ( first_idx) = provided_inputs. by_ref ( ) . next ( )
1602+ && let Some ( last_idx) = provided_inputs. by_ref ( ) . next ( )
1603+ && let ( _, first_span) = provided_arg_tys[ first_idx]
1604+ && let ( _, last_span) = provided_arg_tys[ last_idx]
1605+ && source_map. is_multiline ( first_span. to ( last_span) )
1606+ && let Some ( fallback_indent) = source_map. indentation_before ( first_span)
1607+ {
1608+ ArgumentsFormatting :: Multiline { fallback_indent, brace_indent }
1609+ } else {
1610+ ArgumentsFormatting :: SingleLine
1611+ }
1612+ } ;
1613+
15921614 let mut suggestion = "(" . to_owned ( ) ;
15931615 let mut needs_comma = false ;
15941616 for ( expected_idx, provided_idx) in matched_inputs. iter_enumerated ( ) {
15951617 if needs_comma {
1596- suggestion += ", " ;
1597- } else {
1598- needs_comma = true ;
1618+ suggestion += "," ;
1619+ }
1620+ match & arguments_formatting {
1621+ ArgumentsFormatting :: SingleLine if needs_comma => suggestion += " " ,
1622+ ArgumentsFormatting :: SingleLine => { }
1623+ ArgumentsFormatting :: Multiline { .. } => suggestion += "\n " ,
15991624 }
1600- let suggestion_text = if let Some ( provided_idx) = provided_idx
1625+ needs_comma = true ;
1626+ let ( suggestion_span, suggestion_text) = if let Some ( provided_idx) = provided_idx
16011627 && let ( _, provided_span) = provided_arg_tys[ * provided_idx]
16021628 && let Ok ( arg_text) = source_map. span_to_snippet ( provided_span)
16031629 {
1604- arg_text
1630+ ( Some ( provided_span ) , arg_text)
16051631 } else {
16061632 // Propose a placeholder of the correct type
16071633 let ( _, expected_ty) = formal_and_expected_inputs[ expected_idx] ;
1608- ty_to_snippet ( expected_ty, expected_idx)
1634+ ( None , ty_to_snippet ( expected_ty, expected_idx) )
16091635 } ;
1636+ if let ArgumentsFormatting :: Multiline { fallback_indent, .. } =
1637+ & arguments_formatting
1638+ {
1639+ let indent = suggestion_span
1640+ . and_then ( |span| source_map. indentation_before ( span) )
1641+ . unwrap_or_else ( || fallback_indent. clone ( ) ) ;
1642+ suggestion += & indent;
1643+ }
16101644 suggestion += & suggestion_text;
16111645 }
1646+ if let ArgumentsFormatting :: Multiline { brace_indent, .. } = arguments_formatting {
1647+ suggestion += ",\n " ;
1648+ suggestion += & brace_indent;
1649+ }
16121650 suggestion += ")" ;
16131651 err. span_suggestion_verbose (
16141652 suggestion_span,
0 commit comments