Use multiline note for trait suggestion

This commit is contained in:
Esteban Küber 2017-06-02 10:15:13 -07:00
parent 4ed2edaafe
commit e935acfa5c
10 changed files with 401 additions and 167 deletions

View file

@ -0,0 +1,46 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
pub use reexport::Reexported;
pub struct Foo;
pub enum Bar { X }
pub mod foo {
pub trait PubPub {
fn method(&self) {}
fn method3(&self) {}
}
impl PubPub for u32 {}
impl PubPub for i32 {}
}
pub mod bar {
trait PubPriv {
fn method(&self);
}
}
mod qux {
pub trait PrivPub {
fn method(&self);
}
}
mod quz {
trait PrivPriv {
fn method(&self);
}
}
mod reexport {
pub trait Reexported {
fn method(&self);
}
}

View file

@ -0,0 +1,34 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
trait Foo<A> {
fn foo(&self, a: A) -> A {
a
}
}
trait NotRelevant<A> {
fn nr(&self, a: A) -> A {
a
}
}
struct Bar;
impl NotRelevant<usize> for Bar {}
fn main() {
let f1 = Bar;
f1.foo(1usize);
//~^ error: method named `foo` found for type `Bar` in the current scope
//~| help: items from traits can only be used if the trait is implemented and in scope
//~| help: candidate #1: `Foo`
}

View file

@ -0,0 +1,11 @@
error[E0599]: no method named `foo` found for type `Bar` in the current scope
--> $DIR/issue-21659-show-relevant-trait-impls-3.rs:30:8
|
30 | f1.foo(1usize);
| ^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `foo`, perhaps you need to implement it:
candidate #1: `Foo`
error: aborting due to previous error(s)

View file

@ -0,0 +1,25 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// issue #21405
// ignore-tidy-linelength
struct Foo;
fn foo<F>(f: F) where F: FnMut(Foo) {}
fn main() {
foo(|s| s.is_empty());
//~^ ERROR no method named `is_empty` found
//~^^ HELP #1: `std::iter::ExactSizeIterator`
//~^^^ HELP #2: `core::slice::SliceExt`
//~^^^^ HELP #3: `core::str::StrExt`
//~^^^^^ HELP items from traits can only be used if the trait is implemented and in scope; the following traits define an item `is_empty`, perhaps you need to implement one of them:
}

View file

@ -0,0 +1,13 @@
error[E0599]: no method named `is_empty` found for type `Foo` in the current scope
--> $DIR/method-suggestion-no-duplication.rs:19:15
|
19 | foo(|s| s.is_empty());
| ^^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `is_empty`, perhaps you need to implement one of them:
candidate #1: `std::iter::ExactSizeIterator`
candidate #2: `core::slice::SliceExt`
candidate #3: `core::str::StrExt`
error: aborting due to previous error(s)

View file

@ -0,0 +1,133 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// aux-build:no_method_suggested_traits.rs
extern crate no_method_suggested_traits;
struct Foo;
enum Bar { X }
mod foo {
pub trait Bar {
fn method(&self) {}
fn method2(&self) {}
}
impl Bar for u32 {}
impl Bar for char {}
}
fn main() {
// test the values themselves, and autoderef.
1u32.method();
//~^ HELP following traits are implemented but not in scope, perhaps add a `use` for one of them
//~| ERROR no method named
//~| HELP `use foo::Bar;`
//~| HELP `use no_method_suggested_traits::foo::PubPub;`
std::rc::Rc::new(&mut Box::new(&1u32)).method();
//~^ HELP following traits are implemented but not in scope, perhaps add a `use` for one of them
//~| ERROR no method named
//~| HELP `use foo::Bar;`
//~| HELP `use no_method_suggested_traits::foo::PubPub;`
'a'.method();
//~^ ERROR no method named
//~| HELP the following trait is implemented but not in scope, perhaps add a `use` for it:
//~| HELP `use foo::Bar;`
std::rc::Rc::new(&mut Box::new(&'a')).method();
//~^ ERROR no method named
//~| HELP the following trait is implemented but not in scope, perhaps add a `use` for it:
//~| HELP `use foo::Bar;`
1i32.method();
//~^ ERROR no method named
//~| HELP the following trait is implemented but not in scope, perhaps add a `use` for it:
//~| HELP `use no_method_suggested_traits::foo::PubPub;`
std::rc::Rc::new(&mut Box::new(&1i32)).method();
//~^ ERROR no method named
//~| HELP the following trait is implemented but not in scope, perhaps add a `use` for it:
//~| HELP `use no_method_suggested_traits::foo::PubPub;`
Foo.method();
//~^ ERROR no method named
//~| HELP following traits define an item `method`, perhaps you need to implement one of them
//~| HELP `foo::Bar`
//~| HELP `no_method_suggested_traits::foo::PubPub`
//~| HELP `no_method_suggested_traits::Reexported`
//~| HELP `no_method_suggested_traits::bar::PubPriv`
//~| HELP `no_method_suggested_traits::qux::PrivPub`
//~| HELP `no_method_suggested_traits::quz::PrivPriv`
std::rc::Rc::new(&mut Box::new(&Foo)).method();
//~^ ERROR no method named
//~| HELP following traits define an item `method`, perhaps you need to implement one of them
//~| HELP `foo::Bar`
//~| HELP `no_method_suggested_traits::foo::PubPub`
//~| HELP `no_method_suggested_traits::Reexported`
//~| HELP `no_method_suggested_traits::bar::PubPriv`
//~| HELP `no_method_suggested_traits::qux::PrivPub`
//~| HELP `no_method_suggested_traits::quz::PrivPriv`
1u64.method2();
//~^ ERROR no method named
//~| HELP the following trait defines an item `method2`, perhaps you need to implement it
//~| HELP `foo::Bar`
std::rc::Rc::new(&mut Box::new(&1u64)).method2();
//~^ ERROR no method named
//~| HELP the following trait defines an item `method2`, perhaps you need to implement it
//~| HELP `foo::Bar`
no_method_suggested_traits::Foo.method2();
//~^ ERROR no method named
//~| HELP following trait defines an item `method2`, perhaps you need to implement it
//~| HELP `foo::Bar`
std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method2();
//~^ ERROR no method named
//~| HELP following trait defines an item `method2`, perhaps you need to implement it
//~| HELP `foo::Bar`
no_method_suggested_traits::Bar::X.method2();
//~^ ERROR no method named
//~| HELP following trait defines an item `method2`, perhaps you need to implement it
//~| HELP `foo::Bar`
std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method2();
//~^ ERROR no method named
//~| HELP following trait defines an item `method2`, perhaps you need to implement it
//~| HELP `foo::Bar`
Foo.method3();
//~^ ERROR no method named
//~| HELP following trait defines an item `method3`, perhaps you need to implement it
//~| HELP `no_method_suggested_traits::foo::PubPub`
std::rc::Rc::new(&mut Box::new(&Foo)).method3();
//~^ ERROR no method named
//~| HELP following trait defines an item `method3`, perhaps you need to implement it
//~| HELP `no_method_suggested_traits::foo::PubPub`
Bar::X.method3();
//~^ ERROR no method named
//~| HELP following trait defines an item `method3`, perhaps you need to implement it
//~| HELP `no_method_suggested_traits::foo::PubPub`
std::rc::Rc::new(&mut Box::new(&Bar::X)).method3();
//~^ ERROR no method named
//~| HELP following trait defines an item `method3`, perhaps you need to implement it
//~| HELP `no_method_suggested_traits::foo::PubPub`
// should have no help:
1_usize.method3(); //~ ERROR no method named
std::rc::Rc::new(&mut Box::new(&1_usize)).method3(); //~ ERROR no method named
no_method_suggested_traits::Foo.method3(); //~ ERROR no method named
std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method3();
//~^ ERROR no method named
no_method_suggested_traits::Bar::X.method3(); //~ ERROR no method named
std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method3();
//~^ ERROR no method named
}

View file

@ -0,0 +1,212 @@
error[E0599]: no method named `method` found for type `u32` in the current scope
--> $DIR/no-method-suggested-traits.rs:33:10
|
33 | 1u32.method();
| ^^^^^^
|
= help: items from traits can only be used if the trait is in scope; the following traits are implemented but not in scope, perhaps add a `use` for one of them:
candidate #1: `use foo::Bar;`
candidate #2: `use no_method_suggested_traits::foo::PubPub;`
error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&u32>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:38:44
|
38 | std::rc::Rc::new(&mut Box::new(&1u32)).method();
| ^^^^^^
|
= help: items from traits can only be used if the trait is in scope; the following traits are implemented but not in scope, perhaps add a `use` for one of them:
candidate #1: `use foo::Bar;`
candidate #2: `use no_method_suggested_traits::foo::PubPub;`
error[E0599]: no method named `method` found for type `char` in the current scope
--> $DIR/no-method-suggested-traits.rs:44:9
|
44 | 'a'.method();
| ^^^^^^
|
= help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it:
candidate #1: `use foo::Bar;`
error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&char>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:48:43
|
48 | std::rc::Rc::new(&mut Box::new(&'a')).method();
| ^^^^^^
|
= help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it:
candidate #1: `use foo::Bar;`
error[E0599]: no method named `method` found for type `i32` in the current scope
--> $DIR/no-method-suggested-traits.rs:53:10
|
53 | 1i32.method();
| ^^^^^^
|
= help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it:
candidate #1: `use no_method_suggested_traits::foo::PubPub;`
error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&i32>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:57:44
|
57 | std::rc::Rc::new(&mut Box::new(&1i32)).method();
| ^^^^^^
|
= help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it:
candidate #1: `use no_method_suggested_traits::foo::PubPub;`
error[E0599]: no method named `method` found for type `Foo` in the current scope
--> $DIR/no-method-suggested-traits.rs:62:9
|
62 | Foo.method();
| ^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `method`, perhaps you need to implement one of them:
candidate #1: `foo::Bar`
candidate #2: `no_method_suggested_traits::foo::PubPub`
candidate #3: `no_method_suggested_traits::bar::PubPriv`
candidate #4: `no_method_suggested_traits::qux::PrivPub`
candidate #5: `no_method_suggested_traits::quz::PrivPriv`
candidate #6: `no_method_suggested_traits::Reexported`
error[E0599]: no method named `method` found for type `std::rc::Rc<&mut std::boxed::Box<&Foo>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:71:43
|
71 | std::rc::Rc::new(&mut Box::new(&Foo)).method();
| ^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `method`, perhaps you need to implement one of them:
candidate #1: `foo::Bar`
candidate #2: `no_method_suggested_traits::foo::PubPub`
candidate #3: `no_method_suggested_traits::bar::PubPriv`
candidate #4: `no_method_suggested_traits::qux::PrivPub`
candidate #5: `no_method_suggested_traits::quz::PrivPriv`
candidate #6: `no_method_suggested_traits::Reexported`
error[E0599]: no method named `method2` found for type `u64` in the current scope
--> $DIR/no-method-suggested-traits.rs:81:10
|
81 | 1u64.method2();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it:
candidate #1: `foo::Bar`
error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&u64>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:85:44
|
85 | std::rc::Rc::new(&mut Box::new(&1u64)).method2();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it:
candidate #1: `foo::Bar`
error[E0599]: no method named `method2` found for type `no_method_suggested_traits::Foo` in the current scope
--> $DIR/no-method-suggested-traits.rs:90:37
|
90 | no_method_suggested_traits::Foo.method2();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it:
candidate #1: `foo::Bar`
error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:94:71
|
94 | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method2();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it:
candidate #1: `foo::Bar`
error[E0599]: no method named `method2` found for type `no_method_suggested_traits::Bar` in the current scope
--> $DIR/no-method-suggested-traits.rs:98:40
|
98 | no_method_suggested_traits::Bar::X.method2();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it:
candidate #1: `foo::Bar`
error[E0599]: no method named `method2` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Bar>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:102:74
|
102 | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method2();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method2`, perhaps you need to implement it:
candidate #1: `foo::Bar`
error[E0599]: no method named `method3` found for type `Foo` in the current scope
--> $DIR/no-method-suggested-traits.rs:107:9
|
107 | Foo.method3();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method3`, perhaps you need to implement it:
candidate #1: `no_method_suggested_traits::foo::PubPub`
error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&Foo>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:111:43
|
111 | std::rc::Rc::new(&mut Box::new(&Foo)).method3();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method3`, perhaps you need to implement it:
candidate #1: `no_method_suggested_traits::foo::PubPub`
error[E0599]: no method named `method3` found for type `Bar` in the current scope
--> $DIR/no-method-suggested-traits.rs:115:12
|
115 | Bar::X.method3();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method3`, perhaps you need to implement it:
candidate #1: `no_method_suggested_traits::foo::PubPub`
error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&Bar>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:119:46
|
119 | std::rc::Rc::new(&mut Box::new(&Bar::X)).method3();
| ^^^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `method3`, perhaps you need to implement it:
candidate #1: `no_method_suggested_traits::foo::PubPub`
error[E0599]: no method named `method3` found for type `usize` in the current scope
--> $DIR/no-method-suggested-traits.rs:125:13
|
125 | 1_usize.method3(); //~ ERROR no method named
| ^^^^^^^
error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&usize>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:126:47
|
126 | std::rc::Rc::new(&mut Box::new(&1_usize)).method3(); //~ ERROR no method named
| ^^^^^^^
error[E0599]: no method named `method3` found for type `no_method_suggested_traits::Foo` in the current scope
--> $DIR/no-method-suggested-traits.rs:127:37
|
127 | no_method_suggested_traits::Foo.method3(); //~ ERROR no method named
| ^^^^^^^
error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Foo>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:128:71
|
128 | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method3();
| ^^^^^^^
error[E0599]: no method named `method3` found for type `no_method_suggested_traits::Bar` in the current scope
--> $DIR/no-method-suggested-traits.rs:130:40
|
130 | no_method_suggested_traits::Bar::X.method3(); //~ ERROR no method named
| ^^^^^^^
error[E0599]: no method named `method3` found for type `std::rc::Rc<&mut std::boxed::Box<&no_method_suggested_traits::Bar>>` in the current scope
--> $DIR/no-method-suggested-traits.rs:131:74
|
131 | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method3();
| ^^^^^^^
error: aborting due to previous error(s)

View file

@ -24,9 +24,9 @@ note: candidate #3 is defined in the trait `UnusedTrait`
| ^^^^^^^^^^^^^^^^^^^^^^
= help: to disambiguate the method call, write `UnusedTrait::f9(u, 342)` instead
= help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `f9`, perhaps you need to implement one of them:
= help: candidate #1: `CtxtFn`
= help: candidate #2: `OtherTrait`
= help: candidate #3: `UnusedTrait`
candidate #1: `CtxtFn`
candidate #2: `OtherTrait`
candidate #3: `UnusedTrait`
error[E0599]: no method named `fff` found for type `Myisize` in the current scope
--> $DIR/issue-7575.rs:74:30
@ -59,7 +59,7 @@ note: candidate #1 is defined in the trait `ManyImplTrait`
| |_____^
= help: to disambiguate the method call, write `ManyImplTrait::is_str(t)` instead
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `is_str`, perhaps you need to implement it:
= help: candidate #1: `ManyImplTrait`
candidate #1: `ManyImplTrait`
error: aborting due to previous error(s)