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