]>
Commit | Line | Data |
---|---|---|
f20569fa XL |
1 | #![feature(repr128, proc_macro_quote)] |
2 | #![allow(incomplete_features)] | |
3 | #![allow(clippy::field_reassign_with_default)] | |
4 | #![allow(clippy::eq_op)] | |
5 | ||
6 | extern crate proc_macro; | |
7 | ||
49aad941 | 8 | use proc_macro::{quote, Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree}; |
f20569fa XL |
9 | |
10 | #[proc_macro_derive(DeriveSomething)] | |
11 | pub fn derive(_: TokenStream) -> TokenStream { | |
04454e1e | 12 | // Should not trigger `used_underscore_binding` |
f20569fa XL |
13 | let _inside_derive = 1; |
14 | assert_eq!(_inside_derive, _inside_derive); | |
15 | ||
16 | let output = quote! { | |
17 | // Should not trigger `useless_attribute` | |
18 | #[allow(dead_code)] | |
19 | extern crate rustc_middle; | |
20 | }; | |
21 | output | |
22 | } | |
23 | ||
ed00b5ec FG |
24 | #[proc_macro_derive(ImplStructWithStdDisplay)] |
25 | pub fn derive_std(_: TokenStream) -> TokenStream { | |
26 | quote! { | |
27 | struct A {} | |
28 | impl ::std::fmt::Display for A { | |
29 | fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { | |
30 | write!(f, "A") | |
31 | } | |
32 | } | |
33 | } | |
34 | } | |
35 | ||
f20569fa XL |
36 | #[proc_macro_derive(FieldReassignWithDefault)] |
37 | pub fn derive_foo(_input: TokenStream) -> TokenStream { | |
38 | quote! { | |
39 | #[derive(Default)] | |
40 | struct A { | |
41 | pub i: i32, | |
42 | pub j: i64, | |
43 | } | |
44 | #[automatically_derived] | |
45 | fn lint() { | |
46 | let mut a: A = Default::default(); | |
47 | a.i = 42; | |
48 | a; | |
49 | } | |
50 | } | |
51 | } | |
52 | ||
53 | #[proc_macro_derive(StructAUseSelf)] | |
54 | pub fn derive_use_self(_input: TokenStream) -> proc_macro::TokenStream { | |
55 | quote! { | |
56 | struct A; | |
57 | impl A { | |
58 | fn new() -> A { | |
59 | A | |
60 | } | |
61 | } | |
62 | } | |
63 | } | |
17df50a5 XL |
64 | |
65 | #[proc_macro_derive(ClippyMiniMacroTest)] | |
66 | pub fn mini_macro(_: TokenStream) -> TokenStream { | |
67 | quote!( | |
68 | #[allow(unused)] | |
69 | fn needless_take_by_value(s: String) { | |
70 | println!("{}", s.len()); | |
71 | } | |
72 | #[allow(unused)] | |
73 | fn needless_loop(items: &[u8]) { | |
74 | for i in 0..items.len() { | |
75 | println!("{}", items[i]); | |
76 | } | |
77 | } | |
78 | fn line_wrapper() { | |
79 | println!("{}", line!()); | |
80 | } | |
81 | ) | |
82 | } | |
064997fb FG |
83 | |
84 | #[proc_macro_derive(ExtraLifetimeDerive)] | |
85 | #[allow(unused)] | |
86 | pub fn extra_lifetime(_input: TokenStream) -> TokenStream { | |
87 | quote!( | |
88 | pub struct ExtraLifetime; | |
89 | ||
90 | impl<'b> ExtraLifetime { | |
91 | pub fn something<'c>() -> Self { | |
92 | Self | |
93 | } | |
94 | } | |
95 | ) | |
96 | } | |
49aad941 FG |
97 | |
98 | #[allow(unused)] | |
99 | #[proc_macro_derive(ArithmeticDerive)] | |
100 | pub fn arithmetic_derive(_: TokenStream) -> TokenStream { | |
fe692bf9 FG |
101 | <TokenStream as FromIterator<TokenTree>>::from_iter([ |
102 | Ident::new("fn", Span::call_site()).into(), | |
103 | Ident::new("_foo", Span::call_site()).into(), | |
104 | Group::new(Delimiter::Parenthesis, TokenStream::new()).into(), | |
105 | Group::new( | |
106 | Delimiter::Brace, | |
107 | <TokenStream as FromIterator<TokenTree>>::from_iter([ | |
108 | Ident::new("let", Span::call_site()).into(), | |
109 | Ident::new("mut", Span::call_site()).into(), | |
110 | Ident::new("_n", Span::call_site()).into(), | |
111 | Punct::new('=', Spacing::Alone).into(), | |
112 | Literal::i32_unsuffixed(9).into(), | |
113 | Punct::new(';', Spacing::Alone).into(), | |
114 | Ident::new("_n", Span::call_site()).into(), | |
115 | Punct::new('=', Spacing::Alone).into(), | |
116 | Literal::i32_unsuffixed(9).into(), | |
117 | Punct::new('/', Spacing::Alone).into(), | |
118 | Literal::i32_unsuffixed(2).into(), | |
119 | Punct::new(';', Spacing::Alone).into(), | |
120 | Ident::new("_n", Span::call_site()).into(), | |
121 | Punct::new('=', Spacing::Alone).into(), | |
122 | Punct::new('-', Spacing::Alone).into(), | |
123 | Ident::new("_n", Span::call_site()).into(), | |
124 | Punct::new(';', Spacing::Alone).into(), | |
125 | ]), | |
126 | ) | |
127 | .into(), | |
128 | ]) | |
49aad941 FG |
129 | } |
130 | ||
131 | #[allow(unused)] | |
132 | #[proc_macro_derive(ShadowDerive)] | |
133 | pub fn shadow_derive(_: TokenStream) -> TokenStream { | |
fe692bf9 FG |
134 | <TokenStream as FromIterator<TokenTree>>::from_iter([ |
135 | Ident::new("fn", Span::call_site()).into(), | |
136 | Ident::new("_foo", Span::call_site()).into(), | |
137 | Group::new(Delimiter::Parenthesis, TokenStream::new()).into(), | |
138 | Group::new( | |
139 | Delimiter::Brace, | |
140 | <TokenStream as FromIterator<TokenTree>>::from_iter([ | |
141 | Ident::new("let", Span::call_site()).into(), | |
142 | Ident::new("_x", Span::call_site()).into(), | |
143 | Punct::new('=', Spacing::Alone).into(), | |
144 | Literal::i32_unsuffixed(2).into(), | |
145 | Punct::new(';', Spacing::Alone).into(), | |
146 | Ident::new("let", Span::call_site()).into(), | |
147 | Ident::new("_x", Span::call_site()).into(), | |
148 | Punct::new('=', Spacing::Alone).into(), | |
149 | Ident::new("_x", Span::call_site()).into(), | |
150 | Punct::new(';', Spacing::Alone).into(), | |
151 | ]), | |
152 | ) | |
153 | .into(), | |
154 | ]) | |
49aad941 | 155 | } |
ed00b5ec FG |
156 | |
157 | #[proc_macro_derive(StructIgnoredUnitPattern)] | |
158 | pub fn derive_ignored_unit_pattern(_: TokenStream) -> TokenStream { | |
159 | quote! { | |
160 | struct A; | |
161 | impl A { | |
162 | fn a(&self) -> Result<(), ()> { | |
163 | unimplemented!() | |
164 | } | |
165 | ||
166 | pub fn b(&self) { | |
167 | let _ = self.a().unwrap(); | |
168 | } | |
169 | } | |
170 | } | |
171 | } |