@@ -1589,26 +1589,70 @@ 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
- if needs_comma {
1596
- suggestion += ", " ;
1597
- } else {
1598
- needs_comma = true ;
1617
+ match ( needs_comma, & arguments_formatting) {
1618
+ ( true , ArgumentsFormatting :: SingleLine ) => {
1619
+ suggestion += ", " ;
1620
+ }
1621
+ ( false , ArgumentsFormatting :: SingleLine ) => {
1622
+ needs_comma = true ;
1623
+ }
1624
+ ( true , ArgumentsFormatting :: Multiline { .. } ) => {
1625
+ suggestion += ",\n " ;
1626
+ }
1627
+ ( false , ArgumentsFormatting :: Multiline { .. } ) => {
1628
+ suggestion += "\n " ;
1629
+ needs_comma = true ;
1630
+ }
1599
1631
}
1600
- let suggestion_text = if let Some ( provided_idx) = provided_idx
1632
+ let ( suggestion_span , suggestion_text) = if let Some ( provided_idx) = provided_idx
1601
1633
&& let ( _, provided_span) = provided_arg_tys[ * provided_idx]
1602
1634
&& let Ok ( arg_text) = source_map. span_to_snippet ( provided_span)
1603
1635
{
1604
- arg_text
1636
+ ( Some ( provided_span ) , arg_text)
1605
1637
} else {
1606
1638
// Propose a placeholder of the correct type
1607
1639
let ( _, expected_ty) = formal_and_expected_inputs[ expected_idx] ;
1608
- ty_to_snippet ( expected_ty, expected_idx)
1640
+ ( None , ty_to_snippet ( expected_ty, expected_idx) )
1609
1641
} ;
1642
+ if let ArgumentsFormatting :: Multiline { fallback_indent, .. } =
1643
+ & arguments_formatting
1644
+ {
1645
+ let indent = suggestion_span
1646
+ . and_then ( |span| source_map. indentation_before ( span) )
1647
+ . unwrap_or_else ( || fallback_indent. clone ( ) ) ;
1648
+ suggestion += & indent;
1649
+ }
1610
1650
suggestion += & suggestion_text;
1611
1651
}
1652
+ if let ArgumentsFormatting :: Multiline { brace_indent, .. } = arguments_formatting {
1653
+ suggestion += "\n " ;
1654
+ suggestion += & brace_indent;
1655
+ }
1612
1656
suggestion += ")" ;
1613
1657
err. span_suggestion_verbose (
1614
1658
suggestion_span,
0 commit comments