lint #1674: lifetimed types exclusion
This commit is contained in:
@@ -54,6 +54,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UseSelf {
|
|||||||
if_let_chain!([
|
if_let_chain!([
|
||||||
let ItemImpl(.., ref item_type, ref refs) = item.node,
|
let ItemImpl(.., ref item_type, ref refs) = item.node,
|
||||||
let Ty_::TyPath(QPath::Resolved(_, ref item_path)) = item_type.node,
|
let Ty_::TyPath(QPath::Resolved(_, ref item_path)) = item_type.node,
|
||||||
|
let PathParameters::AngleBracketedParameters(ref angleBracketedParameterData)
|
||||||
|
= item_path.segments.last().unwrap().parameters,
|
||||||
|
angleBracketedParameterData.lifetimes.len() == 0,
|
||||||
], {
|
], {
|
||||||
let visitor = &mut UseSelfVisitor {
|
let visitor = &mut UseSelfVisitor {
|
||||||
item_path: item_path,
|
item_path: item_path,
|
||||||
@@ -76,12 +79,10 @@ impl<'a, 'tcx> Visitor<'tcx> for UseSelfVisitor<'a, 'tcx> {
|
|||||||
if self.item_path.def == path.def &&
|
if self.item_path.def == path.def &&
|
||||||
path.segments
|
path.segments
|
||||||
.last()
|
.last()
|
||||||
.expect("segments should be composed of at least 1 element")
|
.unwrap()
|
||||||
.name != SelfType.name() {
|
.name != SelfType.name() {
|
||||||
span_lint_and_then(self.cx, USE_SELF, path.span, "unnecessary structure name repetition", |db| {
|
span_lint_and_then(self.cx, USE_SELF, path.span, "unnecessary structure name repetition", |db| {
|
||||||
db.span_suggestion(path.span,
|
db.span_suggestion(path.span, "use the applicable keyword", "Self".to_owned());
|
||||||
"use the applicable keyword",
|
|
||||||
"Self".to_owned());
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#![plugin(clippy)]
|
#![plugin(clippy)]
|
||||||
#![warn(use_self)]
|
#![warn(use_self)]
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
#![allow(should_implement_trait)]
|
||||||
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
@@ -43,3 +44,25 @@ mod better {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//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}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,39 +1,39 @@
|
|||||||
error: unnecessary structure name repetition
|
error: unnecessary structure name repetition
|
||||||
--> $DIR/use_self.rs:13:21
|
--> $DIR/use_self.rs:14:21
|
||||||
|
|
|
|
||||||
13 | fn new() -> Foo {
|
14 | fn new() -> Foo {
|
||||||
| ^^^ help: use the applicable keyword: `Self`
|
| ^^^ help: use the applicable keyword: `Self`
|
||||||
|
|
|
|
||||||
= note: `-D use-self` implied by `-D warnings`
|
= note: `-D use-self` implied by `-D warnings`
|
||||||
|
|
||||||
error: unnecessary structure name repetition
|
error: unnecessary structure name repetition
|
||||||
--> $DIR/use_self.rs:14:13
|
--> $DIR/use_self.rs:15:13
|
||||||
|
|
|
|
||||||
14 | Foo {}
|
15 | Foo {}
|
||||||
| ^^^ help: use the applicable keyword: `Self`
|
| ^^^ help: use the applicable keyword: `Self`
|
||||||
|
|
||||||
error: unnecessary structure name repetition
|
error: unnecessary structure name repetition
|
||||||
--> $DIR/use_self.rs:16:22
|
--> $DIR/use_self.rs:17:22
|
||||||
|
|
|
|
||||||
16 | fn test() -> Foo {
|
17 | fn test() -> Foo {
|
||||||
| ^^^ help: use the applicable keyword: `Self`
|
| ^^^ help: use the applicable keyword: `Self`
|
||||||
|
|
||||||
error: unnecessary structure name repetition
|
error: unnecessary structure name repetition
|
||||||
--> $DIR/use_self.rs:17:13
|
--> $DIR/use_self.rs:18:13
|
||||||
|
|
|
|
||||||
17 | Foo::new()
|
18 | Foo::new()
|
||||||
| ^^^^^^^^ help: use the applicable keyword: `Self`
|
| ^^^^^^^^ help: use the applicable keyword: `Self`
|
||||||
|
|
||||||
error: unnecessary structure name repetition
|
error: unnecessary structure name repetition
|
||||||
--> $DIR/use_self.rs:22:25
|
--> $DIR/use_self.rs:23:25
|
||||||
|
|
|
|
||||||
22 | fn default() -> Foo {
|
23 | fn default() -> Foo {
|
||||||
| ^^^ help: use the applicable keyword: `Self`
|
| ^^^ help: use the applicable keyword: `Self`
|
||||||
|
|
||||||
error: unnecessary structure name repetition
|
error: unnecessary structure name repetition
|
||||||
--> $DIR/use_self.rs:23:13
|
--> $DIR/use_self.rs:24:13
|
||||||
|
|
|
|
||||||
23 | Foo::new()
|
24 | Foo::new()
|
||||||
| ^^^^^^^^ help: use the applicable keyword: `Self`
|
| ^^^^^^^^ help: use the applicable keyword: `Self`
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to 6 previous errors
|
||||||
|
|||||||
Reference in New Issue
Block a user