]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
Auto merge of #28552 - apasel422:issue-28527, r=Manishearth
[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 mod unused;
64
65 use bad_style::*;
66 use builtin::*;
67 use unused::*;
68
69 /// Tell the `LintStore` about all the built-in lints (the ones
70 /// defined in this crate and the ones defined in
71 /// `rustc::lint::builtin`).
72 pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
73     macro_rules! add_builtin {
74         ($sess:ident, $($name:ident),*,) => (
75             {$(
76                 store.register_late_pass($sess, false, box $name);
77                 )*}
78             )
79     }
80
81     macro_rules! add_early_builtin {
82         ($sess:ident, $($name:ident),*,) => (
83             {$(
84                 store.register_early_pass($sess, false, box $name);
85                 )*}
86             )
87     }
88
89     macro_rules! add_builtin_with_new {
90         ($sess:ident, $($name:ident),*,) => (
91             {$(
92                 store.register_late_pass($sess, false, box $name::new());
93                 )*}
94             )
95     }
96
97     macro_rules! add_lint_group {
98         ($sess:ident, $name:expr, $($lint:ident),*) => (
99             store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
100             )
101     }
102
103     add_early_builtin!(sess,
104                        UnusedParens,
105                        );
106
107     add_builtin!(sess,
108                  HardwiredLints,
109                  WhileTrue,
110                  ImproperCTypes,
111                  BoxPointers,
112                  UnusedAttributes,
113                  PathStatements,
114                  UnusedResults,
115                  NonCamelCaseTypes,
116                  NonSnakeCase,
117                  NonUpperCaseGlobals,
118                  UnusedImportBraces,
119                  NonShorthandFieldPatterns,
120                  UnusedUnsafe,
121                  UnsafeCode,
122                  UnusedMut,
123                  UnusedAllocation,
124                  MissingCopyImplementations,
125                  UnstableFeatures,
126                  Stability,
127                  UnconditionalRecursion,
128                  InvalidNoMangleItems,
129                  PluginAsLibrary,
130                  DropWithReprExtern,
131                  MutableTransmutes,
132                  );
133
134     add_builtin_with_new!(sess,
135                           TypeLimits,
136                           RawPointerDerive,
137                           MissingDoc,
138                           MissingDebugImplementations,
139                           );
140
141     add_lint_group!(sess, "bad_style",
142                     NON_CAMEL_CASE_TYPES, NON_SNAKE_CASE, NON_UPPER_CASE_GLOBALS);
143
144     add_lint_group!(sess, "unused",
145                     UNUSED_IMPORTS, UNUSED_VARIABLES, UNUSED_ASSIGNMENTS, DEAD_CODE,
146                     UNUSED_MUT, UNREACHABLE_CODE, UNUSED_MUST_USE,
147                     UNUSED_UNSAFE, PATH_STATEMENTS);
148
149     // We have one lint pass defined specially
150     store.register_late_pass(sess, false, box lint::GatherNodeLevels);
151
152     // Insert temporary renamings for a one-time deprecation
153     store.register_renamed("raw_pointer_deriving", "raw_pointer_derive");
154
155     store.register_renamed("unknown_features", "unused_features");
156
157     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
158 }