Convert many impls of DocFolder to DocVisitor
Many of `DocFolder`'s impls didn't actually transform the syntax tree, so they can be visitors instead.
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
use super::Pass;
|
use super::Pass;
|
||||||
use crate::clean::*;
|
use crate::clean::*;
|
||||||
use crate::core::DocContext;
|
use crate::core::DocContext;
|
||||||
use crate::fold::DocFolder;
|
|
||||||
use crate::html::markdown::main_body_opts;
|
use crate::html::markdown::main_body_opts;
|
||||||
|
use crate::visit::DocVisitor;
|
||||||
use core::ops::Range;
|
use core::ops::Range;
|
||||||
use pulldown_cmark::{Event, Parser, Tag};
|
use pulldown_cmark::{Event, Parser, Tag};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
@@ -53,16 +53,17 @@ impl<'a, 'tcx> BareUrlsLinter<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
crate fn check_bare_urls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
|
crate fn check_bare_urls(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
|
||||||
BareUrlsLinter { cx }.fold_crate(krate)
|
BareUrlsLinter { cx }.visit_crate(&krate);
|
||||||
|
krate
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> DocFolder for BareUrlsLinter<'a, 'tcx> {
|
impl<'a, 'tcx> DocVisitor for BareUrlsLinter<'a, 'tcx> {
|
||||||
fn fold_item(&mut self, item: Item) -> Option<Item> {
|
fn visit_item(&mut self, item: &Item) {
|
||||||
let hir_id = match DocContext::as_local_hir_id(self.cx.tcx, item.def_id) {
|
let hir_id = match DocContext::as_local_hir_id(self.cx.tcx, item.def_id) {
|
||||||
Some(hir_id) => hir_id,
|
Some(hir_id) => hir_id,
|
||||||
None => {
|
None => {
|
||||||
// If non-local, no need to check anything.
|
// If non-local, no need to check anything.
|
||||||
return Some(self.fold_item_recur(item));
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
|
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
|
||||||
@@ -106,6 +107,6 @@ impl<'a, 'tcx> DocFolder for BareUrlsLinter<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(self.fold_item_recur(item))
|
self.visit_item_recur(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
use crate::clean;
|
use crate::clean;
|
||||||
use crate::core::DocContext;
|
use crate::core::DocContext;
|
||||||
use crate::fold::{self, DocFolder};
|
|
||||||
use crate::html::markdown::{find_testable_code, ErrorCodes};
|
use crate::html::markdown::{find_testable_code, ErrorCodes};
|
||||||
use crate::passes::check_doc_test_visibility::{should_have_doc_example, Tests};
|
use crate::passes::check_doc_test_visibility::{should_have_doc_example, Tests};
|
||||||
use crate::passes::Pass;
|
use crate::passes::Pass;
|
||||||
|
use crate::visit::DocVisitor;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_lint::builtin::MISSING_DOCS;
|
use rustc_lint::builtin::MISSING_DOCS;
|
||||||
use rustc_middle::lint::LintLevelSource;
|
use rustc_middle::lint::LintLevelSource;
|
||||||
@@ -23,7 +23,7 @@ crate const CALCULATE_DOC_COVERAGE: Pass = Pass {
|
|||||||
|
|
||||||
fn calculate_doc_coverage(krate: clean::Crate, ctx: &mut DocContext<'_>) -> clean::Crate {
|
fn calculate_doc_coverage(krate: clean::Crate, ctx: &mut DocContext<'_>) -> clean::Crate {
|
||||||
let mut calc = CoverageCalculator { items: Default::default(), ctx };
|
let mut calc = CoverageCalculator { items: Default::default(), ctx };
|
||||||
let krate = calc.fold_crate(krate);
|
calc.visit_crate(&krate);
|
||||||
|
|
||||||
calc.print_results();
|
calc.print_results();
|
||||||
|
|
||||||
@@ -182,17 +182,18 @@ impl<'a, 'b> CoverageCalculator<'a, 'b> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'b> fold::DocFolder for CoverageCalculator<'a, 'b> {
|
impl<'a, 'b> DocVisitor for CoverageCalculator<'a, 'b> {
|
||||||
fn fold_item(&mut self, i: clean::Item) -> Option<clean::Item> {
|
fn visit_item(&mut self, i: &clean::Item) {
|
||||||
match *i.kind {
|
if !i.def_id.is_local() {
|
||||||
_ if !i.def_id.is_local() => {
|
|
||||||
// non-local items are skipped because they can be out of the users control,
|
// non-local items are skipped because they can be out of the users control,
|
||||||
// especially in the case of trait impls, which rustdoc eagerly inlines
|
// especially in the case of trait impls, which rustdoc eagerly inlines
|
||||||
return Some(i);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match *i.kind {
|
||||||
clean::StrippedItem(..) => {
|
clean::StrippedItem(..) => {
|
||||||
// don't count items in stripped modules
|
// don't count items in stripped modules
|
||||||
return Some(i);
|
return;
|
||||||
}
|
}
|
||||||
// docs on `use` and `extern crate` statements are not displayed, so they're not
|
// docs on `use` and `extern crate` statements are not displayed, so they're not
|
||||||
// worth counting
|
// worth counting
|
||||||
@@ -269,6 +270,6 @@ impl<'a, 'b> fold::DocFolder for CoverageCalculator<'a, 'b> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(self.fold_item_recur(i))
|
self.visit_item_recur(i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ use rustc_span::{hygiene::AstPass, ExpnData, ExpnKind, FileName, InnerSpan, DUMM
|
|||||||
|
|
||||||
use crate::clean;
|
use crate::clean;
|
||||||
use crate::core::DocContext;
|
use crate::core::DocContext;
|
||||||
use crate::fold::DocFolder;
|
|
||||||
use crate::html::markdown::{self, RustCodeBlock};
|
use crate::html::markdown::{self, RustCodeBlock};
|
||||||
use crate::passes::Pass;
|
use crate::passes::Pass;
|
||||||
|
use crate::visit::DocVisitor;
|
||||||
|
|
||||||
crate const CHECK_CODE_BLOCK_SYNTAX: Pass = Pass {
|
crate const CHECK_CODE_BLOCK_SYNTAX: Pass = Pass {
|
||||||
name: "check-code-block-syntax",
|
name: "check-code-block-syntax",
|
||||||
@@ -19,7 +19,8 @@ crate const CHECK_CODE_BLOCK_SYNTAX: Pass = Pass {
|
|||||||
};
|
};
|
||||||
|
|
||||||
crate fn check_code_block_syntax(krate: clean::Crate, cx: &mut DocContext<'_>) -> clean::Crate {
|
crate fn check_code_block_syntax(krate: clean::Crate, cx: &mut DocContext<'_>) -> clean::Crate {
|
||||||
SyntaxChecker { cx }.fold_crate(krate)
|
SyntaxChecker { cx }.visit_crate(&krate);
|
||||||
|
krate
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SyntaxChecker<'a, 'tcx> {
|
struct SyntaxChecker<'a, 'tcx> {
|
||||||
@@ -141,8 +142,8 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> DocFolder for SyntaxChecker<'a, 'tcx> {
|
impl<'a, 'tcx> DocVisitor for SyntaxChecker<'a, 'tcx> {
|
||||||
fn fold_item(&mut self, item: clean::Item) -> Option<clean::Item> {
|
fn visit_item(&mut self, item: &clean::Item) {
|
||||||
if let Some(dox) = &item.attrs.collapsed_doc_value() {
|
if let Some(dox) = &item.attrs.collapsed_doc_value() {
|
||||||
let sp = item.attr_span(self.cx.tcx);
|
let sp = item.attr_span(self.cx.tcx);
|
||||||
let extra = crate::html::markdown::ExtraInfo::new_did(
|
let extra = crate::html::markdown::ExtraInfo::new_did(
|
||||||
@@ -155,7 +156,7 @@ impl<'a, 'tcx> DocFolder for SyntaxChecker<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(self.fold_item_recur(item))
|
self.visit_item_recur(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ use super::Pass;
|
|||||||
use crate::clean;
|
use crate::clean;
|
||||||
use crate::clean::*;
|
use crate::clean::*;
|
||||||
use crate::core::DocContext;
|
use crate::core::DocContext;
|
||||||
use crate::fold::DocFolder;
|
|
||||||
use crate::html::markdown::{find_testable_code, ErrorCodes, Ignore, LangString};
|
use crate::html::markdown::{find_testable_code, ErrorCodes, Ignore, LangString};
|
||||||
|
use crate::visit::DocVisitor;
|
||||||
use crate::visit_ast::inherits_doc_hidden;
|
use crate::visit_ast::inherits_doc_hidden;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_middle::lint::LintLevelSource;
|
use rustc_middle::lint::LintLevelSource;
|
||||||
@@ -27,17 +27,17 @@ struct DocTestVisibilityLinter<'a, 'tcx> {
|
|||||||
|
|
||||||
crate fn check_doc_test_visibility(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
|
crate fn check_doc_test_visibility(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
|
||||||
let mut coll = DocTestVisibilityLinter { cx };
|
let mut coll = DocTestVisibilityLinter { cx };
|
||||||
|
coll.visit_crate(&krate);
|
||||||
coll.fold_crate(krate)
|
krate
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> DocFolder for DocTestVisibilityLinter<'a, 'tcx> {
|
impl<'a, 'tcx> DocVisitor for DocTestVisibilityLinter<'a, 'tcx> {
|
||||||
fn fold_item(&mut self, item: Item) -> Option<Item> {
|
fn visit_item(&mut self, item: &Item) {
|
||||||
let dox = item.attrs.collapsed_doc_value().unwrap_or_else(String::new);
|
let dox = item.attrs.collapsed_doc_value().unwrap_or_else(String::new);
|
||||||
|
|
||||||
look_for_tests(self.cx, &dox, &item);
|
look_for_tests(self.cx, &dox, &item);
|
||||||
|
|
||||||
Some(self.fold_item_recur(item))
|
self.visit_item_recur(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
use super::Pass;
|
use super::Pass;
|
||||||
use crate::clean::*;
|
use crate::clean::*;
|
||||||
use crate::core::DocContext;
|
use crate::core::DocContext;
|
||||||
use crate::fold::DocFolder;
|
|
||||||
use crate::html::markdown::main_body_opts;
|
use crate::html::markdown::main_body_opts;
|
||||||
|
use crate::visit::DocVisitor;
|
||||||
use core::ops::Range;
|
use core::ops::Range;
|
||||||
use pulldown_cmark::{Event, Parser, Tag};
|
use pulldown_cmark::{Event, Parser, Tag};
|
||||||
use std::iter::Peekable;
|
use std::iter::Peekable;
|
||||||
@@ -19,13 +19,11 @@ struct InvalidHtmlTagsLinter<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
crate fn check_invalid_html_tags(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
|
crate fn check_invalid_html_tags(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
|
||||||
if !cx.tcx.sess.is_nightly_build() {
|
if cx.tcx.sess.is_nightly_build() {
|
||||||
krate
|
|
||||||
} else {
|
|
||||||
let mut coll = InvalidHtmlTagsLinter { cx };
|
let mut coll = InvalidHtmlTagsLinter { cx };
|
||||||
|
coll.visit_crate(&krate);
|
||||||
coll.fold_crate(krate)
|
|
||||||
}
|
}
|
||||||
|
krate
|
||||||
}
|
}
|
||||||
|
|
||||||
const ALLOWED_UNCLOSED: &[&str] = &[
|
const ALLOWED_UNCLOSED: &[&str] = &[
|
||||||
@@ -165,14 +163,14 @@ fn extract_tags(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
|
impl<'a, 'tcx> DocVisitor for InvalidHtmlTagsLinter<'a, 'tcx> {
|
||||||
fn fold_item(&mut self, item: Item) -> Option<Item> {
|
fn visit_item(&mut self, item: &Item) {
|
||||||
let tcx = self.cx.tcx;
|
let tcx = self.cx.tcx;
|
||||||
let hir_id = match DocContext::as_local_hir_id(tcx, item.def_id) {
|
let hir_id = match DocContext::as_local_hir_id(tcx, item.def_id) {
|
||||||
Some(hir_id) => hir_id,
|
Some(hir_id) => hir_id,
|
||||||
None => {
|
None => {
|
||||||
// If non-local, no need to check anything.
|
// If non-local, no need to check anything.
|
||||||
return Some(self.fold_item_recur(item));
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
|
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
|
||||||
@@ -217,6 +215,6 @@ impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(self.fold_item_recur(item))
|
self.visit_item_recur(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user