]> git.lizzy.rs Git - rust.git/commitdiff
Show a note when closure field is called as method
authorAdolfo Ochagavía <aochagavia92@gmail.com>
Sun, 26 Oct 2014 15:29:27 +0000 (16:29 +0100)
committerAdolfo Ochagavía <aochagavia92@gmail.com>
Mon, 27 Oct 2014 15:15:50 +0000 (16:15 +0100)
Closes https://github.com/rust-lang/rust/issues/18343

src/librustc/middle/typeck/check/method.rs

index cb2f1e010ac6e6ed719557f56569a850b311a34f..53a301cc94bc34bb9b81c97a5e80a88e4336f116 100644 (file)
@@ -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,