| |
| |
| #![warn(use_self)] |
| #![allow(dead_code)] |
| #![allow(should_implement_trait)] |
| |
| |
| fn main() {} |
| |
| mod use_self { |
| struct Foo {} |
| |
| impl Foo { |
| fn new() -> Foo { |
| Foo {} |
| } |
| fn test() -> Foo { |
| Foo::new() |
| } |
| } |
| |
| impl Default for Foo { |
| fn default() -> Foo { |
| Foo::new() |
| } |
| } |
| } |
| |
| mod better { |
| struct Foo {} |
| |
| impl Foo { |
| fn new() -> Self { |
| Self {} |
| } |
| fn test() -> Self { |
| Self::new() |
| } |
| } |
| |
| impl Default for Foo { |
| fn default() -> Self { |
| Self::new() |
| } |
| } |
| } |
| |
| //todo the lint does not handle lifetimed struct |
| //the following module should trigger the lint on the third method only |
| mod lifetimes { |
| struct Foo<'a>{foo_str: &'a str} |
| |
| impl<'a> Foo<'a> { |
| // Cannot use `Self` as return type, because the function is actually `fn foo<'b>(s: &'b str) -> Foo<'b>` |
| fn foo(s: &str) -> Foo { |
| Foo { foo_str: s } |
| } |
| // cannot replace with `Self`, because that's `Foo<'a>` |
| fn bar() -> Foo<'static> { |
| Foo { foo_str: "foo"} |
| } |
| |
| // `Self` is applicable here |
| fn clone(&self) -> Foo<'a> { |
| Foo {foo_str: self.foo_str} |
| } |
| } |
| } |