@@ -1589,26 +1589,64 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1589
1589
// e.g. `reuse HasSelf::method;` should suggest `reuse HasSelf::method($args);`.
1590
1590
full_call_span. shrink_to_hi ( )
1591
1591
} ;
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
+
1592
1614
let mut suggestion = "(" . to_owned ( ) ;
1593
1615
let mut needs_comma = false ;
1594
1616
for ( expected_idx, provided_idx) in matched_inputs. iter_enumerated ( ) {
1595
1617
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 " ,
1599
1624
}
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
1601
1627
&& let ( _, provided_span) = provided_arg_tys[ * provided_idx]
1602
1628
&& let Ok ( arg_text) = source_map. span_to_snippet ( provided_span)
1603
1629
{
1604
- arg_text
1630
+ ( Some ( provided_span ) , arg_text)
1605
1631
} else {
1606
1632
// Propose a placeholder of the correct type
1607
1633
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) )
1609
1635
} ;
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
+ }
1610
1644
suggestion += & suggestion_text;
1611
1645
}
1646
+ if let ArgumentsFormatting :: Multiline { brace_indent, .. } = arguments_formatting {
1647
+ suggestion += ",\n " ;
1648
+ suggestion += & brace_indent;
1649
+ }
1612
1650
suggestion += ")" ;
1613
1651
err. span_suggestion_verbose (
1614
1652
suggestion_span,
0 commit comments