diff options
| author | Adolfo OchagavĂa <aochagavia92@gmail.com> | 2014-10-26 16:29:27 +0100 |
|---|---|---|
| committer | Adolfo OchagavĂa <aochagavia92@gmail.com> | 2014-10-27 16:15:50 +0100 |
| commit | 9dab88712f68d79ec81d87deb433094a3b9d0013 (patch) | |
| tree | 5182840ab4f98c254acee41ff418f085a35defae | |
| parent | a93e9c20f2a79eacad21592d0eb58e1a89648629 (diff) | |
| download | rust-9dab88712f68d79ec81d87deb433094a3b9d0013.tar.gz rust-9dab88712f68d79ec81d87deb433094a3b9d0013.zip | |
Show a note when closure field is called as method
Closes https://github.com/rust-lang/rust/issues/18343
| -rw-r--r-- | src/librustc/middle/typeck/check/method.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/librustc/middle/typeck/check/method.rs b/src/librustc/middle/typeck/check/method.rs index cb2f1e010ac..53a301cc94b 100644 --- a/src/librustc/middle/typeck/check/method.rs +++ b/src/librustc/middle/typeck/check/method.rs @@ -223,17 +223,37 @@ pub fn report_error(fcx: &FnCtxt, { match error { NoMatch(static_sources) => { + let cx = fcx.tcx(); + let method_ustring = method_name.user_string(cx); + + // True if the type is a struct and contains a field with + // the same name as the not-found method + let is_field = match ty::get(rcvr_ty).sty { + ty_struct(did, _) => + ty::lookup_struct_fields(cx, did) + .iter() + .any(|f| f.name.user_string(cx) == method_ustring), + _ => false + }; + fcx.type_error_message( span, |actual| { format!("type `{}` does not implement any \ method in scope named `{}`", actual, - method_name.user_string(fcx.tcx())) + method_ustring) }, rcvr_ty, None); + // If the method has the name of a field, give a help note + if is_field { + cx.sess.span_note(span, + format!("use `(s.{0})(...)` if you meant to call the \ + function stored in the `{0}` field", method_ustring).as_slice()); + } + if static_sources.len() > 0 { fcx.tcx().sess.fileline_note( span, |
