1
Fork 0

Clarify suggetion for field used as method

Instead of

```
error: no method named `src_addr` found for type `&wire::ipv4::Repr` in the current scope
   --> src/wire/ipv4.rs:409:34
    |
409 |         packet.set_src_addr(self.src_addr());
    |                                  ^^^^^^^^
    |
note: did you mean to write `self.src_addr`?
   --> src/wire/ipv4.rs:409:34
    |
409 |         packet.set_src_addr(self.src_addr());
    |                                  ^^^^^^^^
```

present

```
error: no method named `src_addr` found for type `&wire::ipv4::Repr` in the current scope
   --> src/wire/ipv4.rs:409:34
    |
409 |         packet.set_src_addr(self.src_addr());
    |                                  ^^^^^^^^ `src_addr` is a field, not a method
    |
    = help: did you mean to write `self.src_addr` instead of `self.src_addr(...)`?
```
This commit is contained in:
Esteban Küber 2017-03-24 23:40:24 -07:00
parent c62e532f3d
commit 6341a8b0e5
5 changed files with 56 additions and 30 deletions

View file

@ -197,17 +197,23 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
let field_ty = field.ty(tcx, substs); let field_ty = field.ty(tcx, substs);
if self.is_fn_ty(&field_ty, span) { if self.is_fn_ty(&field_ty, span) {
err.span_note(span, err.help(&format!("use `({0}.{1})(...)` if you \
&format!("use `({0}.{1})(...)` if you \ meant to call the function \
meant to call the function \ stored in the `{1}` field",
stored in the `{1}` field", expr_string,
expr_string, item_name));
item_name)); err.span_label(span,
&format!("`{}` is a field storing a \
function, not a method",
item_name));
} else { } else {
err.span_note(span, err.help(&format!("did you mean to write `{0}.{1}` \
&format!("did you mean to write `{0}.{1}`?", instead of `{0}.{1}(...)`?",
expr_string, expr_string,
item_name)); item_name));
err.span_label(span,
&format!("`{}` is a field, not a method",
item_name));
} }
break; break;
} }

View file

@ -14,6 +14,8 @@ struct Obj<F> where F: FnMut() -> u32 {
fn main() { fn main() {
let o = Obj { closure: || 42 }; let o = Obj { closure: || 42 };
o.closure(); //~ ERROR no method named `closure` found o.closure();
//~^ NOTE use `(o.closure)(...)` if you meant to call the function stored in the `closure` field //~^ ERROR no method named `closure` found
//~| HELP use `(o.closure)(...)` if you meant to call the function stored in the `closure` field
//~| NOTE `closure` is a field storing a function, not a method
} }

View file

@ -48,45 +48,58 @@ fn main() {
let o_closure = Obj { closure: || 42, not_closure: 42 }; let o_closure = Obj { closure: || 42, not_closure: 42 };
o_closure.closure(); //~ ERROR no method named `closure` found o_closure.closure(); //~ ERROR no method named `closure` found
//~^ NOTE use `(o_closure.closure)(...)` if you meant to call the function stored //~^ HELP use `(o_closure.closure)(...)` if you meant to call the function stored
//~| NOTE `closure` is a field storing a function, not a method
o_closure.not_closure(); //~ ERROR no method named `not_closure` found o_closure.not_closure();
//~^ NOTE did you mean to write `o_closure.not_closure`? //~^ ERROR no method named `not_closure` found
//~| NOTE `not_closure` is a field, not a method
//~| HELP did you mean to write `o_closure.not_closure` instead of `o_closure.not_closure(...)`?
let o_func = Obj { closure: func, not_closure: 5 }; let o_func = Obj { closure: func, not_closure: 5 };
o_func.closure(); //~ ERROR no method named `closure` found o_func.closure(); //~ ERROR no method named `closure` found
//~^ NOTE use `(o_func.closure)(...)` if you meant to call the function stored //~^ HELP use `(o_func.closure)(...)` if you meant to call the function stored
//~| NOTE `closure` is a field storing a function, not a method
let boxed_fn = BoxedObj { boxed_closure: Box::new(func) }; let boxed_fn = BoxedObj { boxed_closure: Box::new(func) };
boxed_fn.boxed_closure();//~ ERROR no method named `boxed_closure` found boxed_fn.boxed_closure();//~ ERROR no method named `boxed_closure` found
//~^ NOTE use `(boxed_fn.boxed_closure)(...)` if you meant to call the function stored //~^ HELP use `(boxed_fn.boxed_closure)(...)` if you meant to call the function stored
//~| NOTE `boxed_closure` is a field storing a function, not a method
let boxed_closure = BoxedObj { boxed_closure: Box::new(|| 42_u32) as Box<FnBox() -> u32> }; let boxed_closure = BoxedObj { boxed_closure: Box::new(|| 42_u32) as Box<FnBox() -> u32> };
boxed_closure.boxed_closure();//~ ERROR no method named `boxed_closure` found boxed_closure.boxed_closure();//~ ERROR no method named `boxed_closure` found
//~^ NOTE use `(boxed_closure.boxed_closure)(...)` if you meant to call the function stored //~^ HELP use `(boxed_closure.boxed_closure)(...)` if you meant to call the function stored
//~| NOTE `boxed_closure` is a field storing a function, not a method
// test expression writing in the notes // test expression writing in the notes
let w = Wrapper { wrap: o_func }; let w = Wrapper { wrap: o_func };
w.wrap.closure();//~ ERROR no method named `closure` found w.wrap.closure();//~ ERROR no method named `closure` found
//~^ NOTE use `(w.wrap.closure)(...)` if you meant to call the function stored //~^ HELP use `(w.wrap.closure)(...)` if you meant to call the function stored
//~| NOTE `closure` is a field storing a function, not a method
w.wrap.not_closure();//~ ERROR no method named `not_closure` found w.wrap.not_closure();
//~^ NOTE did you mean to write `w.wrap.not_closure`? //~^ ERROR no method named `not_closure` found
//~| NOTE `not_closure` is a field, not a method
//~| HELP did you mean to write `w.wrap.not_closure` instead of `w.wrap.not_closure(...)`?
check_expression().closure();//~ ERROR no method named `closure` found check_expression().closure();//~ ERROR no method named `closure` found
//~^ NOTE use `(check_expression().closure)(...)` if you meant to call the function stored //~^ HELP use `(check_expression().closure)(...)` if you meant to call the function stored
//~| NOTE `closure` is a field storing a function, not a method
} }
impl FuncContainerOuter { impl FuncContainerOuter {
fn run(&self) { fn run(&self) {
unsafe { unsafe {
(*self.container).f1(1); //~ ERROR no method named `f1` found (*self.container).f1(1); //~ ERROR no method named `f1` found
//~^ NOTE use `((*self.container).f1)(...)` //~^ HELP use `((*self.container).f1)(...)`
//~| NOTE `f1` is a field storing a function, not a method
(*self.container).f2(1); //~ ERROR no method named `f2` found (*self.container).f2(1); //~ ERROR no method named `f2` found
//~^ NOTE use `((*self.container).f2)(...)` //~^ HELP use `((*self.container).f2)(...)`
//~| NOTE `f2` is a field storing a function, not a method
(*self.container).f3(1); //~ ERROR no method named `f3` found (*self.container).f3(1); //~ ERROR no method named `f3` found
//~^ NOTE use `((*self.container).f3)(...)` //~^ HELP use `((*self.container).f3)(...)`
//~| NOTE `f3` is a field storing a function, not a method
} }
} }
} }

View file

@ -19,7 +19,9 @@ fn main() {
}) })
}; };
demo.example(1); //~ ERROR no method named `example` demo.example(1);
//~^ NOTE use `(demo.example)(...)` //~^ ERROR no method named `example`
//~| HELP use `(demo.example)(...)`
//~| NOTE `example` is a field storing a function, not a method
// (demo.example)(1); // (demo.example)(1);
} }

View file

@ -35,12 +35,15 @@ fn main() {
let o = Obj { fn_ptr: empty, closure: || 42 }; let o = Obj { fn_ptr: empty, closure: || 42 };
let p = &o; let p = &o;
p.closure(); //~ ERROR no method named `closure` found p.closure(); //~ ERROR no method named `closure` found
//~^ NOTE use `(p.closure)(...)` if you meant to call the function stored in the `closure` field //~^ HELP use `(p.closure)(...)` if you meant to call the function stored in the `closure` field
//~| NOTE `closure` is a field storing a function, not a method
let q = &p; let q = &p;
q.fn_ptr(); //~ ERROR no method named `fn_ptr` found q.fn_ptr(); //~ ERROR no method named `fn_ptr` found
//~^ NOTE use `(q.fn_ptr)(...)` if you meant to call the function stored in the `fn_ptr` field //~^ HELP use `(q.fn_ptr)(...)` if you meant to call the function stored in the `fn_ptr` field
//~| NOTE `fn_ptr` is a field storing a function, not a method
let r = D(C { c_fn_ptr: empty }); let r = D(C { c_fn_ptr: empty });
let s = &r; let s = &r;
s.c_fn_ptr(); //~ ERROR no method named `c_fn_ptr` found s.c_fn_ptr(); //~ ERROR no method named `c_fn_ptr` found
//~^ NOTE use `(s.c_fn_ptr)(...)` if you meant to call the function stored in the `c_fn_ptr` //~^ HELP use `(s.c_fn_ptr)(...)` if you meant to call the function stored in the `c_fn_ptr`
//~| NOTE `c_fn_ptr` is a field storing a function, not a method
} }