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;
46 pub mod items_after_statements;
49 pub mod mut_reference;
52 pub mod collapsible_if;
53 pub mod block_in_if_condition;
66 pub mod zero_div_zero;
68 pub mod needless_features;
69 pub mod needless_update;
71 pub mod temporary_assignment;
73 pub mod cyclomatic_complexity;
77 pub mod array_indexing;
82 pub use syntax::ast::{Name, NodeId};
85 #[allow(unused_attributes)]
88 pub fn plugin_registrar(reg: &mut Registry) {
89 reg.register_late_lint_pass(box types::TypePass);
90 reg.register_late_lint_pass(box misc::TopLevelRefPass);
91 reg.register_late_lint_pass(box misc::CmpNan);
92 reg.register_late_lint_pass(box eq_op::EqOp);
93 reg.register_late_lint_pass(box bit_mask::BitMask);
94 reg.register_late_lint_pass(box ptr_arg::PtrArg);
95 reg.register_late_lint_pass(box needless_bool::NeedlessBool);
96 reg.register_late_lint_pass(box approx_const::ApproxConstant);
97 reg.register_late_lint_pass(box misc::FloatCmp);
98 reg.register_early_lint_pass(box precedence::Precedence);
99 reg.register_late_lint_pass(box eta_reduction::EtaPass);
100 reg.register_late_lint_pass(box identity_op::IdentityOp);
101 reg.register_early_lint_pass(box items_after_statements::ItemsAfterStatemets);
102 reg.register_late_lint_pass(box mut_mut::MutMut);
103 reg.register_late_lint_pass(box mut_reference::UnnecessaryMutPassed);
104 reg.register_late_lint_pass(box len_zero::LenZero);
105 reg.register_late_lint_pass(box misc::CmpOwned);
106 reg.register_late_lint_pass(box attrs::AttrPass);
107 reg.register_late_lint_pass(box collapsible_if::CollapsibleIf);
108 reg.register_late_lint_pass(box block_in_if_condition::BlockInIfCondition);
109 reg.register_late_lint_pass(box misc::ModuloOne);
110 reg.register_late_lint_pass(box unicode::Unicode);
111 reg.register_late_lint_pass(box strings::StringAdd);
112 reg.register_early_lint_pass(box returns::ReturnPass);
113 reg.register_late_lint_pass(box methods::MethodsPass);
114 reg.register_late_lint_pass(box shadow::ShadowPass);
115 reg.register_late_lint_pass(box types::LetPass);
116 reg.register_late_lint_pass(box types::UnitCmp);
117 reg.register_late_lint_pass(box loops::LoopsPass);
118 reg.register_late_lint_pass(box lifetimes::LifetimePass);
119 reg.register_late_lint_pass(box entry::HashMapLint);
120 reg.register_late_lint_pass(box ranges::StepByZero);
121 reg.register_late_lint_pass(box types::CastPass);
122 reg.register_late_lint_pass(box types::TypeComplexityPass);
123 reg.register_late_lint_pass(box matches::MatchPass);
124 reg.register_late_lint_pass(box misc::PatternPass);
125 reg.register_late_lint_pass(box minmax::MinMaxPass);
126 reg.register_late_lint_pass(box open_options::NonSensicalOpenOptions);
127 reg.register_late_lint_pass(box zero_div_zero::ZeroDivZeroPass);
128 reg.register_late_lint_pass(box mutex_atomic::MutexAtomic);
129 reg.register_late_lint_pass(box needless_features::NeedlessFeaturesPass);
130 reg.register_late_lint_pass(box needless_update::NeedlessUpdatePass);
131 reg.register_late_lint_pass(box no_effect::NoEffectPass);
132 reg.register_late_lint_pass(box map_clone::MapClonePass);
133 reg.register_late_lint_pass(box temporary_assignment::TemporaryAssignmentPass);
134 reg.register_late_lint_pass(box transmute::UselessTransmute);
135 reg.register_late_lint_pass(box cyclomatic_complexity::CyclomaticComplexity::new(25));
136 reg.register_late_lint_pass(box escape::EscapePass);
137 reg.register_early_lint_pass(box misc_early::MiscEarly);
138 reg.register_late_lint_pass(box misc::UsedUnderscoreBinding);
139 reg.register_late_lint_pass(box array_indexing::ArrayIndexing);
140 reg.register_late_lint_pass(box panic::PanicPass);
141 reg.register_late_lint_pass(box strings::StringLitAsBytes);
142 reg.register_late_lint_pass(box derive::Derive);
143 reg.register_late_lint_pass(box types::CharLitAsU8);
146 reg.register_lint_group("clippy_pedantic", vec![
147 methods::OPTION_UNWRAP_USED,
148 methods::RESULT_UNWRAP_USED,
149 methods::WRONG_PUB_SELF_CONVENTION,
151 mutex_atomic::MUTEX_INTEGER,
152 shadow::SHADOW_REUSE,
154 shadow::SHADOW_UNRELATED,
156 strings::STRING_ADD_ASSIGN,
157 types::CAST_POSSIBLE_TRUNCATION,
158 types::CAST_POSSIBLE_WRAP,
159 types::CAST_PRECISION_LOSS,
160 types::CAST_SIGN_LOSS,
161 unicode::NON_ASCII_LITERAL,
162 unicode::UNICODE_NOT_NFC,
165 reg.register_lint_group("clippy", vec![
166 approx_const::APPROX_CONSTANT,
167 array_indexing::OUT_OF_BOUNDS_INDEXING,
168 attrs::DEPRECATED_SEMVER,
169 attrs::INLINE_ALWAYS,
170 bit_mask::BAD_BIT_MASK,
171 bit_mask::INEFFECTIVE_BIT_MASK,
172 block_in_if_condition::BLOCK_IN_IF_CONDITION_EXPR,
173 block_in_if_condition::BLOCK_IN_IF_CONDITION_STMT,
174 collapsible_if::COLLAPSIBLE_IF,
175 cyclomatic_complexity::CYCLOMATIC_COMPLEXITY,
176 derive::DERIVE_HASH_NOT_EQ,
177 derive::EXPL_IMPL_CLONE_ON_COPY,
181 eta_reduction::REDUNDANT_CLOSURE,
182 identity_op::IDENTITY_OP,
183 items_after_statements::ITEMS_AFTER_STATEMENTS,
184 len_zero::LEN_WITHOUT_IS_EMPTY,
186 lifetimes::NEEDLESS_LIFETIMES,
187 lifetimes::UNUSED_LIFETIMES,
189 loops::EXPLICIT_COUNTER_LOOP,
190 loops::EXPLICIT_ITER_LOOP,
191 loops::ITER_NEXT_LOOP,
192 loops::NEEDLESS_RANGE_LOOP,
193 loops::REVERSE_RANGE_LOOP,
194 loops::UNUSED_COLLECT,
195 loops::WHILE_LET_LOOP,
196 loops::WHILE_LET_ON_ITERATOR,
197 map_clone::MAP_CLONE,
199 matches::MATCH_OVERLAPPING_ARM,
200 matches::MATCH_REF_PATS,
201 matches::SINGLE_MATCH,
202 methods::CHARS_NEXT_CMP,
203 methods::FILTER_NEXT,
205 methods::OPTION_MAP_UNWRAP_OR,
206 methods::OPTION_MAP_UNWRAP_OR_ELSE,
207 methods::OR_FUN_CALL,
208 methods::SEARCH_IS_SOME,
209 methods::SHOULD_IMPLEMENT_TRAIT,
210 methods::STR_TO_STRING,
211 methods::STRING_TO_STRING,
212 methods::WRONG_SELF_CONVENTION,
218 misc::REDUNDANT_PATTERN,
219 misc::TOPLEVEL_REF_ARG,
220 misc::USED_UNDERSCORE_BINDING,
221 misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
222 misc_early::UNNEEDED_FIELD_PATTERN,
223 mut_reference::UNNECESSARY_MUT_PASSED,
224 mutex_atomic::MUTEX_ATOMIC,
225 needless_bool::NEEDLESS_BOOL,
226 needless_features::UNSTABLE_AS_MUT_SLICE,
227 needless_features::UNSTABLE_AS_SLICE,
228 needless_update::NEEDLESS_UPDATE,
229 no_effect::NO_EFFECT,
230 open_options::NONSENSICAL_OPEN_OPTIONS,
232 precedence::PRECEDENCE,
234 ranges::RANGE_STEP_BY_ZERO,
235 ranges::RANGE_ZIP_WITH_LEN,
236 returns::LET_AND_RETURN,
237 returns::NEEDLESS_RETURN,
238 strings::STRING_LIT_AS_BYTES,
239 temporary_assignment::TEMPORARY_ASSIGNMENT,
240 transmute::USELESS_TRANSMUTE,
242 types::LET_UNIT_VALUE,
244 types::TYPE_COMPLEXITY,
246 unicode::ZERO_WIDTH_SPACE,
247 zero_div_zero::ZERO_DIVIDED_BY_ZERO,