1 #![feature(plugin_registrar, box_syntax)]
2 #![feature(rustc_private, collections)]
3 #![feature(iter_arith)]
4 #![feature(custom_attribute)]
5 #![allow(unknown_lints)]
7 // this only exists to allow the "dogfood" integration test to work
10 println!("What are you doing? Don't run clippy as an executable");
18 extern crate rustc_front;
20 // Only for the compile time checking of paths
22 extern crate collections;
24 // for unicode nfc normalization
25 extern crate unicode_normalization;
27 // for semver check in attrs.rs
30 extern crate rustc_plugin;
32 use rustc_plugin::Registry;
42 pub mod needless_bool;
44 pub mod eta_reduction;
48 pub mod mut_reference;
51 pub mod collapsible_if;
52 pub mod block_in_if_condition;
65 pub mod zero_div_zero;
67 pub mod needless_features;
68 pub mod needless_update;
70 pub mod temporary_assignment;
72 pub mod cyclomatic_complexity;
76 pub mod array_indexing;
81 pub use syntax::ast::{Name, NodeId};
84 #[allow(unused_attributes)]
87 pub fn plugin_registrar(reg: &mut Registry) {
88 reg.register_late_lint_pass(box types::TypePass);
89 reg.register_late_lint_pass(box misc::TopLevelRefPass);
90 reg.register_late_lint_pass(box misc::CmpNan);
91 reg.register_late_lint_pass(box eq_op::EqOp);
92 reg.register_late_lint_pass(box bit_mask::BitMask);
93 reg.register_late_lint_pass(box ptr_arg::PtrArg);
94 reg.register_late_lint_pass(box needless_bool::NeedlessBool);
95 reg.register_late_lint_pass(box approx_const::ApproxConstant);
96 reg.register_late_lint_pass(box misc::FloatCmp);
97 reg.register_early_lint_pass(box precedence::Precedence);
98 reg.register_late_lint_pass(box eta_reduction::EtaPass);
99 reg.register_late_lint_pass(box identity_op::IdentityOp);
100 reg.register_late_lint_pass(box mut_mut::MutMut);
101 reg.register_late_lint_pass(box mut_reference::UnnecessaryMutPassed);
102 reg.register_late_lint_pass(box len_zero::LenZero);
103 reg.register_late_lint_pass(box misc::CmpOwned);
104 reg.register_late_lint_pass(box attrs::AttrPass);
105 reg.register_late_lint_pass(box collapsible_if::CollapsibleIf);
106 reg.register_late_lint_pass(box block_in_if_condition::BlockInIfCondition);
107 reg.register_late_lint_pass(box misc::ModuloOne);
108 reg.register_late_lint_pass(box unicode::Unicode);
109 reg.register_late_lint_pass(box strings::StringAdd);
110 reg.register_early_lint_pass(box returns::ReturnPass);
111 reg.register_late_lint_pass(box methods::MethodsPass);
112 reg.register_late_lint_pass(box shadow::ShadowPass);
113 reg.register_late_lint_pass(box types::LetPass);
114 reg.register_late_lint_pass(box types::UnitCmp);
115 reg.register_late_lint_pass(box loops::LoopsPass);
116 reg.register_late_lint_pass(box lifetimes::LifetimePass);
117 reg.register_late_lint_pass(box entry::HashMapLint);
118 reg.register_late_lint_pass(box ranges::StepByZero);
119 reg.register_late_lint_pass(box types::CastPass);
120 reg.register_late_lint_pass(box types::TypeComplexityPass);
121 reg.register_late_lint_pass(box matches::MatchPass);
122 reg.register_late_lint_pass(box misc::PatternPass);
123 reg.register_late_lint_pass(box minmax::MinMaxPass);
124 reg.register_late_lint_pass(box open_options::NonSensicalOpenOptions);
125 reg.register_late_lint_pass(box zero_div_zero::ZeroDivZeroPass);
126 reg.register_late_lint_pass(box mutex_atomic::MutexAtomic);
127 reg.register_late_lint_pass(box needless_features::NeedlessFeaturesPass);
128 reg.register_late_lint_pass(box needless_update::NeedlessUpdatePass);
129 reg.register_late_lint_pass(box no_effect::NoEffectPass);
130 reg.register_late_lint_pass(box map_clone::MapClonePass);
131 reg.register_late_lint_pass(box temporary_assignment::TemporaryAssignmentPass);
132 reg.register_late_lint_pass(box transmute::UselessTransmute);
133 reg.register_late_lint_pass(box cyclomatic_complexity::CyclomaticComplexity::new(25));
134 reg.register_late_lint_pass(box escape::EscapePass);
135 reg.register_early_lint_pass(box misc_early::MiscEarly);
136 reg.register_late_lint_pass(box misc::UsedUnderscoreBinding);
137 reg.register_late_lint_pass(box array_indexing::ArrayIndexing);
138 reg.register_late_lint_pass(box panic::PanicPass);
139 reg.register_late_lint_pass(box strings::StringLitAsBytes);
140 reg.register_late_lint_pass(box derive::Derive);
143 reg.register_lint_group("clippy_pedantic", vec![
144 methods::OPTION_UNWRAP_USED,
145 methods::RESULT_UNWRAP_USED,
146 methods::WRONG_PUB_SELF_CONVENTION,
148 mutex_atomic::MUTEX_INTEGER,
149 shadow::SHADOW_REUSE,
151 shadow::SHADOW_UNRELATED,
153 strings::STRING_ADD_ASSIGN,
154 types::CAST_POSSIBLE_TRUNCATION,
155 types::CAST_POSSIBLE_WRAP,
156 types::CAST_PRECISION_LOSS,
157 types::CAST_SIGN_LOSS,
158 unicode::NON_ASCII_LITERAL,
159 unicode::UNICODE_NOT_NFC,
162 reg.register_lint_group("clippy", vec![
163 approx_const::APPROX_CONSTANT,
164 array_indexing::OUT_OF_BOUNDS_INDEXING,
165 attrs::DEPRECATED_SEMVER,
166 attrs::INLINE_ALWAYS,
167 bit_mask::BAD_BIT_MASK,
168 bit_mask::INEFFECTIVE_BIT_MASK,
169 block_in_if_condition::BLOCK_IN_IF_CONDITION_EXPR,
170 block_in_if_condition::BLOCK_IN_IF_CONDITION_STMT,
171 collapsible_if::COLLAPSIBLE_IF,
172 cyclomatic_complexity::CYCLOMATIC_COMPLEXITY,
173 derive::DERIVE_HASH_NOT_EQ,
177 eta_reduction::REDUNDANT_CLOSURE,
178 identity_op::IDENTITY_OP,
179 len_zero::LEN_WITHOUT_IS_EMPTY,
181 lifetimes::NEEDLESS_LIFETIMES,
182 lifetimes::UNUSED_LIFETIMES,
184 loops::EXPLICIT_COUNTER_LOOP,
185 loops::EXPLICIT_ITER_LOOP,
186 loops::ITER_NEXT_LOOP,
187 loops::NEEDLESS_RANGE_LOOP,
188 loops::REVERSE_RANGE_LOOP,
189 loops::UNUSED_COLLECT,
190 loops::WHILE_LET_LOOP,
191 loops::WHILE_LET_ON_ITERATOR,
192 map_clone::MAP_CLONE,
194 matches::MATCH_OVERLAPPING_ARM,
195 matches::MATCH_REF_PATS,
196 matches::SINGLE_MATCH,
197 methods::CHARS_NEXT_CMP,
198 methods::FILTER_NEXT,
200 methods::OPTION_MAP_UNWRAP_OR,
201 methods::OPTION_MAP_UNWRAP_OR_ELSE,
202 methods::OR_FUN_CALL,
203 methods::SEARCH_IS_SOME,
204 methods::SHOULD_IMPLEMENT_TRAIT,
205 methods::STR_TO_STRING,
206 methods::STRING_TO_STRING,
207 methods::WRONG_SELF_CONVENTION,
213 misc::REDUNDANT_PATTERN,
214 misc::TOPLEVEL_REF_ARG,
215 misc::USED_UNDERSCORE_BINDING,
216 misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
217 misc_early::UNNEEDED_FIELD_PATTERN,
218 mut_reference::UNNECESSARY_MUT_PASSED,
219 mutex_atomic::MUTEX_ATOMIC,
220 needless_bool::NEEDLESS_BOOL,
221 needless_features::UNSTABLE_AS_MUT_SLICE,
222 needless_features::UNSTABLE_AS_SLICE,
223 needless_update::NEEDLESS_UPDATE,
224 no_effect::NO_EFFECT,
225 open_options::NONSENSICAL_OPEN_OPTIONS,
227 precedence::PRECEDENCE,
229 ranges::RANGE_STEP_BY_ZERO,
230 ranges::RANGE_ZIP_WITH_LEN,
231 returns::LET_AND_RETURN,
232 returns::NEEDLESS_RETURN,
233 strings::STRING_LIT_AS_BYTES,
234 temporary_assignment::TEMPORARY_ASSIGNMENT,
235 transmute::USELESS_TRANSMUTE,
237 types::LET_UNIT_VALUE,
239 types::TYPE_COMPLEXITY,
241 unicode::ZERO_WIDTH_SPACE,
242 zero_div_zero::ZERO_DIVIDED_BY_ZERO,