]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
Split out the bad_style lints into a new module
[rust.git] / src / librustc_lint / lib.rs
1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! Lints in the Rust compiler.
12 //!
13 //! This currently only contains the definitions and implementations
14 //! of most of the lints that `rustc` supports directly, it does not
15 //! contain the infrastructure for defining/registering lints. That is
16 //! available in `rustc::lint` and `rustc::plugin` respectively.
17 //!
18 //! # Note
19 //!
20 //! This API is completely unstable and subject to change.
21
22 // Do not remove on snapshot creation. Needed for bootstrap. (Issue #22364)
23 #![cfg_attr(stage0, feature(custom_attribute))]
24 #![crate_name = "rustc_lint"]
25 #![unstable(feature = "rustc_private", issue = "27812")]
26 #![staged_api]
27 #![crate_type = "dylib"]
28 #![crate_type = "rlib"]
29 #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
30       html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
31       html_root_url = "https://doc.rust-lang.org/nightly/")]
32
33 #![cfg_attr(test, feature(test))]
34 #![feature(box_patterns)]
35 #![feature(box_syntax)]
36 #![feature(num_bits_bytes)]
37 #![feature(quote)]
38 #![feature(ref_slice)]
39 #![feature(rustc_diagnostic_macros)]
40 #![feature(rustc_private)]
41 #![feature(slice_patterns)]
42 #![feature(staged_api)]
43 #![feature(str_char)]
44
45 extern crate syntax;
46 #[macro_use]
47 extern crate rustc;
48 #[macro_use]
49 extern crate log;
50 extern crate rustc_front;
51
52 pub use rustc::lint as lint;
53 pub use rustc::metadata as metadata;
54 pub use rustc::middle as middle;
55 pub use rustc::session as session;
56 pub use rustc::util as util;
57
58 use session::Session;
59 use lint::LintId;
60
61 mod bad_style;
62 mod builtin;
63
64 use bad_style::*;
65 use builtin::*;
66
67 /// Tell the `LintStore` about all the built-in lints (the ones
68 /// defined in this crate and the ones defined in
69 /// `rustc::lint::builtin`).
70 pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
71     macro_rules! add_builtin {
72         ($sess:ident, $($name:ident),*,) => (
73             {$(
74                 store.register_late_pass($sess, false, box $name);
75                 )*}
76             )
77     }
78
79     macro_rules! add_early_builtin {
80         ($sess:ident, $($name:ident),*,) => (
81             {$(
82                 store.register_early_pass($sess, false, box $name);
83                 )*}
84             )
85     }
86
87     macro_rules! add_builtin_with_new {
88         ($sess:ident, $($name:ident),*,) => (
89             {$(
90                 store.register_late_pass($sess, false, box $name::new());
91                 )*}
92             )
93     }
94
95     macro_rules! add_lint_group {
96         ($sess:ident, $name:expr, $($lint:ident),*) => (
97             store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
98             )
99     }
100
101     add_early_builtin!(sess,
102                        UnusedParens,
103                        );
104
105     add_builtin!(sess,
106                  HardwiredLints,
107                  WhileTrue,
108                  ImproperCTypes,
109                  BoxPointers,
110                  UnusedAttributes,
111                  PathStatements,
112                  UnusedResults,
113                  NonCamelCaseTypes,
114                  NonSnakeCase,
115                  NonUpperCaseGlobals,
116                  UnusedImportBraces,
117                  NonShorthandFieldPatterns,
118                  UnusedUnsafe,
119                  UnsafeCode,
120                  UnusedMut,
121                  UnusedAllocation,
122                  MissingCopyImplementations,
123                  UnstableFeatures,
124                  Stability,
125                  UnconditionalRecursion,
126                  InvalidNoMangleItems,
127                  PluginAsLibrary,
128                  DropWithReprExtern,
129                  MutableTransmutes,
130                  );
131
132     add_builtin_with_new!(sess,
133                           TypeLimits,
134                           RawPointerDerive,
135                           MissingDoc,
136                           MissingDebugImplementations,
137                           );
138
139     add_lint_group!(sess, "bad_style",
140                     NON_CAMEL_CASE_TYPES, NON_SNAKE_CASE, NON_UPPER_CASE_GLOBALS);
141
142     add_lint_group!(sess, "unused",
143                     UNUSED_IMPORTS, UNUSED_VARIABLES, UNUSED_ASSIGNMENTS, DEAD_CODE,
144                     UNUSED_MUT, UNREACHABLE_CODE, UNUSED_MUST_USE,
145                     UNUSED_UNSAFE, PATH_STATEMENTS);
146
147     // We have one lint pass defined specially
148     store.register_late_pass(sess, false, box lint::GatherNodeLevels);
149
150     // Insert temporary renamings for a one-time deprecation
151     store.register_renamed("raw_pointer_deriving", "raw_pointer_derive");
152
153     store.register_renamed("unknown_features", "unused_features");
154
155     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
156 }