"Fossies" - the Fresh Open Source Software Archive 
Member "rustc-1.74.0-src/src/librustdoc/lint.rs" (13 Nov 2023, 8487 Bytes) of package /linux/misc/rustc-1.74.0-src.tar.xz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Rust source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
See also the last
Fossies "Diffs" side-by-side code changes report for "lint.rs":
1.72.1_vs_1.73.0.
1 use rustc_data_structures::fx::FxHashMap;
2 use rustc_lint::LintStore;
3 use rustc_lint_defs::{declare_tool_lint, Lint, LintId};
4 use rustc_session::{lint, Session};
5
6 use std::sync::LazyLock as Lazy;
7
8 /// This function is used to setup the lint initialization. By default, in rustdoc, everything
9 /// is "allowed". Depending if we run in test mode or not, we want some of them to be at their
10 /// default level. For example, the "INVALID_CODEBLOCK_ATTRIBUTES" lint is activated in both
11 /// modes.
12 ///
13 /// A little detail easy to forget is that there is a way to set the lint level for all lints
14 /// through the "WARNINGS" lint. To prevent this to happen, we set it back to its "normal" level
15 /// inside this function.
16 ///
17 /// It returns a tuple containing:
18 /// * Vector of tuples of lints' name and their associated "max" level
19 /// * HashMap of lint id with their associated "max" level
20 pub(crate) fn init_lints<F>(
21 mut allowed_lints: Vec<String>,
22 lint_opts: Vec<(String, lint::Level)>,
23 filter_call: F,
24 ) -> (Vec<(String, lint::Level)>, FxHashMap<lint::LintId, lint::Level>)
25 where
26 F: Fn(&lint::Lint) -> Option<(String, lint::Level)>,
27 {
28 let warnings_lint_name = lint::builtin::WARNINGS.name;
29
30 allowed_lints.push(warnings_lint_name.to_owned());
31 allowed_lints.extend(lint_opts.iter().map(|(lint, _)| lint).cloned());
32
33 let lints = || {
34 lint::builtin::HardwiredLints::get_lints()
35 .into_iter()
36 .chain(rustc_lint::SoftLints::get_lints().into_iter())
37 };
38
39 let lint_opts = lints()
40 .filter_map(|lint| {
41 // Permit feature-gated lints to avoid feature errors when trying to
42 // allow all lints.
43 if lint.feature_gate.is_some() || allowed_lints.iter().any(|l| lint.name == l) {
44 None
45 } else {
46 filter_call(lint)
47 }
48 })
49 .chain(lint_opts.into_iter())
50 .collect::<Vec<_>>();
51
52 let lint_caps = lints()
53 .filter_map(|lint| {
54 // We don't want to allow *all* lints so let's ignore
55 // those ones.
56 if allowed_lints.iter().any(|l| lint.name == l) {
57 None
58 } else {
59 Some((lint::LintId::of(lint), lint::Allow))
60 }
61 })
62 .collect();
63 (lint_opts, lint_caps)
64 }
65
66 macro_rules! declare_rustdoc_lint {
67 (
68 $(#[$attr:meta])* $name: ident, $level: ident, $descr: literal $(,)?
69 $(@feature_gate = $gate:expr;)?
70 ) => {
71 declare_tool_lint! {
72 $(#[$attr])* pub rustdoc::$name, $level, $descr
73 $(, @feature_gate = $gate;)?
74 }
75 }
76 }
77
78 declare_rustdoc_lint! {
79 /// The `broken_intra_doc_links` lint detects failures in resolving
80 /// intra-doc link targets. This is a `rustdoc` only lint, see the
81 /// documentation in the [rustdoc book].
82 ///
83 /// [rustdoc book]: ../../../rustdoc/lints.html#broken_intra_doc_links
84 BROKEN_INTRA_DOC_LINKS,
85 Warn,
86 "failures in resolving intra-doc link targets"
87 }
88
89 declare_rustdoc_lint! {
90 /// This is a subset of `broken_intra_doc_links` that warns when linking from
91 /// a public item to a private one. This is a `rustdoc` only lint, see the
92 /// documentation in the [rustdoc book].
93 ///
94 /// [rustdoc book]: ../../../rustdoc/lints.html#private_intra_doc_links
95 PRIVATE_INTRA_DOC_LINKS,
96 Warn,
97 "linking from a public item to a private one"
98 }
99
100 declare_rustdoc_lint! {
101 /// The `invalid_codeblock_attributes` lint detects code block attributes
102 /// in documentation examples that have potentially mis-typed values. This
103 /// is a `rustdoc` only lint, see the documentation in the [rustdoc book].
104 ///
105 /// [rustdoc book]: ../../../rustdoc/lints.html#invalid_codeblock_attributes
106 INVALID_CODEBLOCK_ATTRIBUTES,
107 Warn,
108 "codeblock attribute looks a lot like a known one"
109 }
110
111 declare_rustdoc_lint! {
112 /// The `missing_crate_level_docs` lint detects if documentation is
113 /// missing at the crate root. This is a `rustdoc` only lint, see the
114 /// documentation in the [rustdoc book].
115 ///
116 /// [rustdoc book]: ../../../rustdoc/lints.html#missing_crate_level_docs
117 MISSING_CRATE_LEVEL_DOCS,
118 Allow,
119 "detects crates with no crate-level documentation"
120 }
121
122 declare_rustdoc_lint! {
123 /// The `missing_doc_code_examples` lint detects publicly-exported items
124 /// without code samples in their documentation. This is a `rustdoc` only
125 /// lint, see the documentation in the [rustdoc book].
126 ///
127 /// [rustdoc book]: ../../../rustdoc/lints.html#missing_doc_code_examples
128 MISSING_DOC_CODE_EXAMPLES,
129 Allow,
130 "detects publicly-exported items without code samples in their documentation",
131 @feature_gate = rustc_span::symbol::sym::rustdoc_missing_doc_code_examples;
132 }
133
134 declare_rustdoc_lint! {
135 /// The `private_doc_tests` lint detects code samples in docs of private
136 /// items not documented by `rustdoc`. This is a `rustdoc` only lint, see
137 /// the documentation in the [rustdoc book].
138 ///
139 /// [rustdoc book]: ../../../rustdoc/lints.html#private_doc_tests
140 PRIVATE_DOC_TESTS,
141 Allow,
142 "detects code samples in docs of private items not documented by rustdoc"
143 }
144
145 declare_rustdoc_lint! {
146 /// The `invalid_html_tags` lint detects invalid HTML tags. This is a
147 /// `rustdoc` only lint, see the documentation in the [rustdoc book].
148 ///
149 /// [rustdoc book]: ../../../rustdoc/lints.html#invalid_html_tags
150 INVALID_HTML_TAGS,
151 Warn,
152 "detects invalid HTML tags in doc comments"
153 }
154
155 declare_rustdoc_lint! {
156 /// The `bare_urls` lint detects when a URL is not a hyperlink.
157 /// This is a `rustdoc` only lint, see the documentation in the [rustdoc book].
158 ///
159 /// [rustdoc book]: ../../../rustdoc/lints.html#bare_urls
160 BARE_URLS,
161 Warn,
162 "detects URLs that are not hyperlinks"
163 }
164
165 declare_rustdoc_lint! {
166 /// The `invalid_rust_codeblocks` lint detects Rust code blocks in
167 /// documentation examples that are invalid (e.g. empty, not parsable as
168 /// Rust code). This is a `rustdoc` only lint, see the documentation in the
169 /// [rustdoc book].
170 ///
171 /// [rustdoc book]: ../../../rustdoc/lints.html#invalid_rust_codeblocks
172 INVALID_RUST_CODEBLOCKS,
173 Warn,
174 "codeblock could not be parsed as valid Rust or is empty"
175 }
176
177 declare_rustdoc_lint! {
178 /// The `unescaped_backticks` lint detects unescaped backticks (\`), which usually
179 /// mean broken inline code. This is a `rustdoc` only lint, see the documentation
180 /// in the [rustdoc book].
181 ///
182 /// [rustdoc book]: ../../../rustdoc/lints.html#unescaped_backticks
183 UNESCAPED_BACKTICKS,
184 Allow,
185 "detects unescaped backticks in doc comments"
186 }
187
188 declare_rustdoc_lint! {
189 /// This lint is **warned by default**. It detects explicit links that are same
190 /// as computed automatic links. This usually means the explicit links is removeable.
191 /// This is a `rustdoc` only lint, see the documentation in the [rustdoc book].
192 ///
193 /// [rustdoc book]: ../../../rustdoc/lints.html#redundant_explicit_links
194 REDUNDANT_EXPLICIT_LINKS,
195 Warn,
196 "detects redundant explicit links in doc comments"
197 }
198
199 pub(crate) static RUSTDOC_LINTS: Lazy<Vec<&'static Lint>> = Lazy::new(|| {
200 vec![
201 BROKEN_INTRA_DOC_LINKS,
202 PRIVATE_INTRA_DOC_LINKS,
203 MISSING_DOC_CODE_EXAMPLES,
204 PRIVATE_DOC_TESTS,
205 INVALID_CODEBLOCK_ATTRIBUTES,
206 INVALID_RUST_CODEBLOCKS,
207 INVALID_HTML_TAGS,
208 BARE_URLS,
209 MISSING_CRATE_LEVEL_DOCS,
210 UNESCAPED_BACKTICKS,
211 REDUNDANT_EXPLICIT_LINKS,
212 ]
213 });
214
215 pub(crate) fn register_lints(_sess: &Session, lint_store: &mut LintStore) {
216 lint_store.register_lints(&**RUSTDOC_LINTS);
217 lint_store.register_group(
218 true,
219 "rustdoc::all",
220 Some("rustdoc"),
221 RUSTDOC_LINTS
222 .iter()
223 .filter(|lint| lint.feature_gate.is_none()) // only include stable lints
224 .map(|&lint| LintId::of(lint))
225 .collect(),
226 );
227 for lint in &*RUSTDOC_LINTS {
228 let name = lint.name_lower();
229 lint_store.register_renamed(&name.replace("rustdoc::", ""), &name);
230 }
231 lint_store
232 .register_renamed("intra_doc_link_resolution_failure", "rustdoc::broken_intra_doc_links");
233 lint_store.register_renamed("non_autolinks", "rustdoc::bare_urls");
234 lint_store.register_renamed("rustdoc::non_autolinks", "rustdoc::bare_urls");
235 }