Skip to content

Commit

Permalink
When suggesting assoc function with type params, include turbofish
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Oct 5, 2019
1 parent f2023ac commit 5497ba1
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 8 deletions.
27 changes: 19 additions & 8 deletions src/librustc_typeck/check/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -462,15 +462,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
if static_sources.len() == 1 {
if let SelfSource::MethodCall(expr) = source {
err.span_suggestion(expr.span.to(span),
"use associated function syntax instead",
format!("{}::{}",
self.ty_to_string(actual),
item_name),
Applicability::MachineApplicable);
err.span_suggestion(
expr.span.to(span),
"use associated function syntax instead",
format!("{}::{}", self.ty_to_value_string(actual), item_name),
Applicability::MachineApplicable,
);
} else {
err.help(&format!("try with `{}::{}`",
self.ty_to_string(actual), item_name));
err.help(&format!(
"try with `{}::{}`",
self.ty_to_value_string(actual),
item_name,
));
}

report_candidates(span, &mut err, static_sources);
Expand Down Expand Up @@ -579,6 +582,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
None
}

/// Print out the type for use in value namespace.
fn ty_to_value_string(&self, ty: Ty<'tcx>) -> String {
match ty.kind {
ty::Adt(def, substs) => format!("{}", ty::Instance::new(def.did, substs)),
_ => self.ty_to_string(ty),
}
}

fn suggest_use_candidates(&self,
err: &mut DiagnosticBuilder<'_>,
mut msg: String,
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
struct GenericAssocMethod<T>(T);

impl<T> GenericAssocMethod<T> {
fn default_hello() {}
}

fn main() {
let x = GenericAssocMethod(33i32);
x.default_hello();
//~^ ERROR no method named `default_hello` found for type `GenericAssocMethod<i32>`
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
error[E0599]: no method named `default_hello` found for type `GenericAssocMethod<i32>` in the current scope
--> $DIR/suggest-assoc-fn-call-with-turbofish.rs:9:7
|
LL | struct GenericAssocMethod<T>(T);
| -------------------------------- method `default_hello` not found for this
...
LL | x.default_hello();
| --^^^^^^^^^^^^^
| | |
| | this is an associated function, not a method
| help: use associated function syntax instead: `GenericAssocMethod::<i32>::default_hello`
|
= note: found the following associated functions; to be used as methods, functions must have a `self` parameter
note: the candidate is defined in an impl for the type `GenericAssocMethod<_>`
--> $DIR/suggest-assoc-fn-call-with-turbofish.rs:4:5
|
LL | fn default_hello() {}
| ^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0599`.

0 comments on commit 5497ba1

Please sign in to comment.