mirror of https://github.com/rust-lang/rust.git
Account for type params on method without parens
This commit is contained in:
parent
a19edd6b16
commit
97d47a5e7c
|
@ -1586,7 +1586,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
&format!("a method `{}` also exists, call it with parentheses", field),
|
||||
field,
|
||||
expr_t,
|
||||
expr.hir_id,
|
||||
expr,
|
||||
);
|
||||
}
|
||||
err.emit();
|
||||
|
@ -1609,7 +1609,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
"use parentheses to call the method",
|
||||
field,
|
||||
expr_t,
|
||||
expr.hir_id,
|
||||
expr,
|
||||
);
|
||||
} else {
|
||||
err.help("methods are immutable and cannot be assigned to");
|
||||
|
|
|
@ -135,7 +135,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
msg: &str,
|
||||
method_name: ast::Ident,
|
||||
self_ty: Ty<'tcx>,
|
||||
call_expr_id: hir::HirId,
|
||||
call_expr: &hir::Expr<'_>,
|
||||
) {
|
||||
let has_params = self
|
||||
.probe_for_name(
|
||||
|
@ -144,7 +144,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
method_name,
|
||||
IsSuggestion(false),
|
||||
self_ty,
|
||||
call_expr_id,
|
||||
call_expr.hir_id,
|
||||
ProbeScope::TraitsInScope,
|
||||
)
|
||||
.and_then(|pick| {
|
||||
|
@ -152,13 +152,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
Ok(sig.inputs().skip_binder().len() > 1)
|
||||
});
|
||||
|
||||
// Account for `foo.bar<T>`;
|
||||
let sugg_span = method_name.span.with_hi(call_expr.span.hi());
|
||||
let snippet = self
|
||||
.tcx
|
||||
.sess
|
||||
.source_map()
|
||||
.span_to_snippet(sugg_span)
|
||||
.unwrap_or_else(|_| method_name.to_string());
|
||||
let (suggestion, applicability) = if has_params.unwrap_or_default() {
|
||||
(format!("{}(...)", method_name), Applicability::HasPlaceholders)
|
||||
(format!("{}(...)", snippet), Applicability::HasPlaceholders)
|
||||
} else {
|
||||
(format!("{}()", method_name), Applicability::MaybeIncorrect)
|
||||
(format!("{}()", snippet), Applicability::MaybeIncorrect)
|
||||
};
|
||||
|
||||
err.span_suggestion(method_name.span, msg, suggestion, applicability);
|
||||
err.span_suggestion(sugg_span, msg, suggestion, applicability);
|
||||
}
|
||||
|
||||
/// Performs method lookup. If lookup is successful, it will return the callee
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
fn main() {
|
||||
let _ = vec![].into_iter().collect::<usize>;
|
||||
//~^ ERROR attempted to take value of method `collect` on type `std::vec::IntoIter<_>`
|
||||
//~| ERROR field expressions may not have generic arguments
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
error: field expressions may not have generic arguments
|
||||
--> $DIR/method-missing-parentheses.rs:2:41
|
||||
|
|
||||
LL | let _ = vec![].into_iter().collect::<usize>;
|
||||
| ^^^^^^^
|
||||
|
||||
error[E0615]: attempted to take value of method `collect` on type `std::vec::IntoIter<_>`
|
||||
--> $DIR/method-missing-parentheses.rs:2:32
|
||||
|
|
||||
LL | let _ = vec![].into_iter().collect::<usize>;
|
||||
| ^^^^^^^---------
|
||||
| |
|
||||
| help: use parentheses to call the method: `collect::<usize>()`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0615`.
|
Loading…
Reference in New Issue