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