about summary refs log tree commit diff
path: root/src/tools/clippy/tests/ui/unused_trait_names.fixed
blob: 6abbed01bb0233d60c19245753049cf83a41fc01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
//@aux-build:proc_macros.rs

#![allow(unused)]
#![warn(clippy::unused_trait_names)]
#![feature(decl_macro)]

extern crate proc_macros;

fn main() {}

fn bad() {
    use std::any::Any as _;
    //~^ unused_trait_names

    println!("{:?}", "foo".type_id());
}

fn good() {
    use std::any::Any as _;

    println!("{:?}", "foo".type_id());
}

fn used_good() {
    use std::any::Any;

    println!("{:?}", Any::type_id("foo"));
    println!("{:?}", "foo".type_id());
}

fn multi_bad() {
    use std::any::{self, Any as _, TypeId};
    //~^ unused_trait_names

    println!("{:?}", "foo".type_id());
}

fn multi_good() {
    use std::any::{self, Any as _, TypeId};

    println!("{:?}", "foo".type_id());
}

fn renamed_bad() {
    use std::any::Any as _;
    //~^ unused_trait_names

    println!("{:?}", "foo".type_id());
}

fn multi_renamed_bad() {
    use std::any::{Any as _, TypeId as MyTypeId};
    //~^ unused_trait_names

    println!("{:?}", "foo".type_id());
}

mod pub_good {
    pub use std::any::Any;

    fn foo() {
        println!("{:?}", "foo".type_id());
    }
}

mod used_mod_good {
    use std::any::Any;

    fn foo() {
        println!("{:?}", Any::type_id("foo"));
    }
}

mod mod_import_bad {
    fn mod_import_bad() {
        use std::any::Any as _;
        //~^ unused_trait_names

        println!("{:?}", "foo".type_id());
    }
}

mod nested_mod_used_good1 {
    use std::any::Any;

    mod foo {
        fn foo() {
            super::Any::type_id("foo");
        }
    }
}

mod nested_mod_used_good2 {
    use std::any::Any;

    mod foo {
        use super::Any;

        fn foo() {
            Any::type_id("foo");
        }
    }
}

mod nested_mod_used_good3 {
    use std::any::Any;

    mod foo {
        use crate::nested_mod_used_good3::Any;

        fn foo() {
            println!("{:?}", Any::type_id("foo"));
        }
    }
}

mod nested_mod_used_bad {
    use std::any::Any as _;
    //~^ unused_trait_names

    fn bar() {
        println!("{:?}", "foo".type_id());
    }

    mod foo {
        use std::any::Any;

        fn foo() {
            println!("{:?}", Any::type_id("foo"));
        }
    }
}

// More complex example where `use std::any::Any;` should be anonymised but `use std::any::Any as
// MyAny;` should not as it is used by a sub module. Even though if you removed `use std::any::Any;`
// the code would still compile.
mod nested_mod_used_bad1 {
    use std::any::Any as _;
    //~^ unused_trait_names

    use std::any::Any as MyAny;

    fn baz() {
        println!("{:?}", "baz".type_id());
    }

    mod foo {
        use crate::nested_mod_used_bad1::MyAny;

        fn foo() {
            println!("{:?}", MyAny::type_id("foo"));
        }
    }
}

// Example of nested import with an unused import to try and trick it
mod nested_mod_used_good5 {
    use std::any::Any;

    mod foo {
        use std::any::Any;

        fn baz() {
            println!("{:?}", "baz".type_id());
        }

        mod bar {
            use crate::nested_mod_used_good5::foo::Any;

            fn foo() {
                println!("{:?}", Any::type_id("foo"));
            }
        }
    }
}

mod simple_trait {
    pub trait MyTrait {
        fn do_things(&self);
    }

    pub struct MyStruct;

    impl MyTrait for MyStruct {
        fn do_things(&self) {}
    }
}

// Underscore imports were stabilized in 1.33
#[clippy::msrv = "1.32"]
fn msrv_1_32() {
    use simple_trait::{MyStruct, MyTrait};
    MyStruct.do_things();
}

#[clippy::msrv = "1.33"]
fn msrv_1_33() {
    use simple_trait::{MyStruct, MyTrait as _};
    //~^ unused_trait_names
    MyStruct.do_things();
}

// Linting inside macro expansion is no longer supported
mod lint_inside_macro_expansion_bad {
    macro_rules! foo {
        () => {
            use std::any::Any;
            fn bar() {
                "bar".type_id();
            }
        };
    }

    foo!();
}

mod macro_and_trait_same_name {
    pub macro Foo() {}
    pub trait Foo {
        fn bar(&self);
    }
    impl Foo for () {
        fn bar(&self) {}
    }
}

fn call_macro_and_trait_good() {
    // importing trait and macro but only using macro by path won't allow us to change this to
    // `use macro_and_trait_same_name::Foo as _;`
    use macro_and_trait_same_name::Foo;
    Foo!();
    ().bar();
}

proc_macros::external!(
    fn ignore_inside_external_proc_macro() {
        use std::any::Any;
        "foo".type_id();
    }
);

proc_macros::with_span!(
    span

    fn ignore_inside_with_span_proc_macro() {
        use std::any::Any;
        "foo".type_id();
    }
);

// This should warn the import is unused but should not trigger unused_trait_names
#[warn(unused)]
mod unused_import {
    
    //~^ ERROR: unused import
}

#[allow(clippy::unused_trait_names)]
fn allow_lint_fn() {
    use std::any::Any;

    "foo".type_id();
}

#[allow(clippy::unused_trait_names)]
mod allow_lint_mod {
    use std::any::Any;

    fn foo() {
        "foo".type_id();
    }
}

mod allow_lint_import {
    #[allow(clippy::unused_trait_names)]
    use std::any::Any;

    fn foo() {
        "foo".type_id();
    }
}

// Limitation: Suggests `use std::any::Any as _::{self};` which looks weird
// fn use_trait_self_good() {
//     use std::any::Any::{self};
//     "foo".type_id();
// }

// Limitation: Suggests `use std::any::{Any as _, Any as _};`
// mod repeated_renamed {
//     use std::any::{Any, Any as MyAny};

//     fn foo() {
//         "foo".type_id();
//     }
// }