1mod bare_urls;
5mod check_code_block_syntax;
6mod footnotes;
7mod html_tags;
8mod redundant_explicit_links;
9mod unescaped_backticks;
10
11use super::Pass;
12use crate::clean::*;
13use crate::core::DocContext;
14use crate::visit::DocVisitor;
15
16pub(crate) const RUN_LINTS: Pass =
17 Pass { name: "run-lints", run: Some(run_lints), description: "runs some of rustdoc's lints" };
18
19struct Linter<'a, 'tcx> {
20 cx: &'a mut DocContext<'tcx>,
21}
22
23pub(crate) fn run_lints(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
24 Linter { cx }.visit_crate(&krate);
25 krate
26}
27
28impl DocVisitor<'_> for Linter<'_, '_> {
29 fn visit_item(&mut self, item: &Item) {
30 let Some(hir_id) = DocContext::as_local_hir_id(self.cx.tcx, item.item_id) else {
31 return;
33 };
34 let dox = item.doc_value();
35 if !dox.is_empty() {
36 let may_have_link = dox.contains(&[':', '['][..]);
37 let may_have_block_comment_or_html = dox.contains(['<', '>']);
38 let may_have_code = dox.contains(&['~', '`', '\t'][..]) || dox.contains(" ");
42 if may_have_link {
43 bare_urls::visit_item(self.cx, item, hir_id, &dox);
44 redundant_explicit_links::visit_item(self.cx, item, hir_id);
45 footnotes::visit_item(self.cx, item, hir_id, &dox);
46 }
47 if may_have_code {
48 check_code_block_syntax::visit_item(self.cx, item, &dox);
49 unescaped_backticks::visit_item(self.cx, item, hir_id, &dox);
50 }
51 if may_have_block_comment_or_html {
52 html_tags::visit_item(self.cx, item, hir_id, &dox);
53 }
54 }
55
56 self.visit_item_recur(item)
57 }
58}