From 9dab88712f68d79ec81d87deb433094a3b9d0013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20Ochagav=C3=ADa?= <aochagavia92@gmail.com> Date: Sun, 26 Oct 2014 16:29:27 +0100 Subject: [PATCH] Show a note when closure field is called as method Closes https://github.com/rust-lang/rust/issues/18343 --- src/librustc/middle/typeck/check/method.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) 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,