Don't require a DocContext
for report_diagnostic
This is needed for the next commit, which needs access to the `cx` from within the `decorate` closure. - Change `as_local_hir_id` to an associated function, since it only needs a `TyCtxt` - Change `source_span_for_markdown_range` to only take a `TyCtxt`
This commit is contained in:
parent
ec7f258d54
commit
b3c4e25e17
7 changed files with 29 additions and 25 deletions
|
@ -169,13 +169,13 @@ impl<'tcx> DocContext<'tcx> {
|
||||||
|
|
||||||
/// Like `hir().local_def_id_to_hir_id()`, but skips calling it on fake DefIds.
|
/// Like `hir().local_def_id_to_hir_id()`, but skips calling it on fake DefIds.
|
||||||
/// (This avoids a slice-index-out-of-bounds panic.)
|
/// (This avoids a slice-index-out-of-bounds panic.)
|
||||||
crate fn as_local_hir_id(&self, def_id: DefId) -> Option<HirId> {
|
crate fn as_local_hir_id(tcx: TyCtxt<'_>, def_id: DefId) -> Option<HirId> {
|
||||||
if MAX_DEF_IDX.with(|m| {
|
if MAX_DEF_IDX.with(|m| {
|
||||||
m.borrow().get(&def_id.krate).map(|&idx| idx <= def_id.index).unwrap_or(false)
|
m.borrow().get(&def_id.krate).map(|&idx| idx <= def_id.index).unwrap_or(false)
|
||||||
}) {
|
}) {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
def_id.as_local().map(|def_id| self.tcx.hir().local_def_id_to_hir_id(def_id))
|
def_id.as_local().map(|def_id| tcx.hir().local_def_id_to_hir_id(def_id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -479,7 +479,7 @@ crate fn run_global_ctxt(
|
||||||
https://doc.rust-lang.org/nightly/rustdoc/how-to-write-documentation.html";
|
https://doc.rust-lang.org/nightly/rustdoc/how-to-write-documentation.html";
|
||||||
tcx.struct_lint_node(
|
tcx.struct_lint_node(
|
||||||
crate::lint::MISSING_CRATE_LEVEL_DOCS,
|
crate::lint::MISSING_CRATE_LEVEL_DOCS,
|
||||||
ctxt.as_local_hir_id(m.def_id).unwrap(),
|
DocContext::as_local_hir_id(tcx, m.def_id).unwrap(),
|
||||||
|lint| {
|
|lint| {
|
||||||
let mut diag =
|
let mut diag =
|
||||||
lint.build("no documentation found for this crate's top-level module");
|
lint.build("no documentation found for this crate's top-level module");
|
||||||
|
|
|
@ -48,9 +48,12 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
|
||||||
let buffer = buffer.borrow();
|
let buffer = buffer.borrow();
|
||||||
|
|
||||||
if buffer.has_errors || is_empty {
|
if buffer.has_errors || is_empty {
|
||||||
let mut diag = if let Some(sp) =
|
let mut diag = if let Some(sp) = super::source_span_for_markdown_range(
|
||||||
super::source_span_for_markdown_range(self.cx, &dox, &code_block.range, &item.attrs)
|
self.cx.tcx,
|
||||||
{
|
&dox,
|
||||||
|
&code_block.range,
|
||||||
|
&item.attrs,
|
||||||
|
) {
|
||||||
let (warning_message, suggest_using_text) = if buffer.has_errors {
|
let (warning_message, suggest_using_text) = if buffer.has_errors {
|
||||||
("could not parse code block as Rust code", true)
|
("could not parse code block as Rust code", true)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1146,7 +1146,7 @@ impl LinkCollector<'_, '_> {
|
||||||
suggest_disambiguator(resolved, diag, path_str, dox, sp, &ori_link.range);
|
suggest_disambiguator(resolved, diag, path_str, dox, sp, &ori_link.range);
|
||||||
};
|
};
|
||||||
report_diagnostic(
|
report_diagnostic(
|
||||||
self.cx,
|
self.cx.tcx,
|
||||||
BROKEN_INTRA_DOC_LINKS,
|
BROKEN_INTRA_DOC_LINKS,
|
||||||
&msg,
|
&msg,
|
||||||
&item,
|
&item,
|
||||||
|
@ -1220,7 +1220,7 @@ impl LinkCollector<'_, '_> {
|
||||||
&& !self.cx.tcx.features().intra_doc_pointers
|
&& !self.cx.tcx.features().intra_doc_pointers
|
||||||
{
|
{
|
||||||
let span = super::source_span_for_markdown_range(
|
let span = super::source_span_for_markdown_range(
|
||||||
self.cx,
|
self.cx.tcx,
|
||||||
dox,
|
dox,
|
||||||
&ori_link.range,
|
&ori_link.range,
|
||||||
&item.attrs,
|
&item.attrs,
|
||||||
|
@ -1674,7 +1674,7 @@ impl Suggestion {
|
||||||
/// parameter of the callback will contain it, and the primary span of the diagnostic will be set
|
/// parameter of the callback will contain it, and the primary span of the diagnostic will be set
|
||||||
/// to it.
|
/// to it.
|
||||||
fn report_diagnostic(
|
fn report_diagnostic(
|
||||||
cx: &DocContext<'_>,
|
tcx: TyCtxt<'_>,
|
||||||
lint: &'static Lint,
|
lint: &'static Lint,
|
||||||
msg: &str,
|
msg: &str,
|
||||||
item: &Item,
|
item: &Item,
|
||||||
|
@ -1682,7 +1682,7 @@ fn report_diagnostic(
|
||||||
link_range: &Range<usize>,
|
link_range: &Range<usize>,
|
||||||
decorate: impl FnOnce(&mut DiagnosticBuilder<'_>, Option<rustc_span::Span>),
|
decorate: impl FnOnce(&mut DiagnosticBuilder<'_>, Option<rustc_span::Span>),
|
||||||
) {
|
) {
|
||||||
let hir_id = match cx.as_local_hir_id(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.
|
||||||
|
@ -1694,10 +1694,10 @@ fn report_diagnostic(
|
||||||
let attrs = &item.attrs;
|
let attrs = &item.attrs;
|
||||||
let sp = span_of_attrs(attrs).unwrap_or(item.source.span());
|
let sp = span_of_attrs(attrs).unwrap_or(item.source.span());
|
||||||
|
|
||||||
cx.tcx.struct_span_lint_hir(lint, hir_id, sp, |lint| {
|
tcx.struct_span_lint_hir(lint, hir_id, sp, |lint| {
|
||||||
let mut diag = lint.build(msg);
|
let mut diag = lint.build(msg);
|
||||||
|
|
||||||
let span = super::source_span_for_markdown_range(cx, dox, link_range, attrs);
|
let span = super::source_span_for_markdown_range(tcx, dox, link_range, attrs);
|
||||||
|
|
||||||
if let Some(sp) = span {
|
if let Some(sp) = span {
|
||||||
diag.set_span(sp);
|
diag.set_span(sp);
|
||||||
|
@ -1742,7 +1742,7 @@ fn resolution_failure(
|
||||||
) {
|
) {
|
||||||
let tcx = collector.cx.tcx;
|
let tcx = collector.cx.tcx;
|
||||||
report_diagnostic(
|
report_diagnostic(
|
||||||
collector.cx,
|
tcx,
|
||||||
BROKEN_INTRA_DOC_LINKS,
|
BROKEN_INTRA_DOC_LINKS,
|
||||||
&format!("unresolved link to `{}`", path_str),
|
&format!("unresolved link to `{}`", path_str),
|
||||||
item,
|
item,
|
||||||
|
@ -1973,7 +1973,7 @@ fn anchor_failure(
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
report_diagnostic(cx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| {
|
report_diagnostic(cx.tcx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| {
|
||||||
if let Some(sp) = sp {
|
if let Some(sp) = sp {
|
||||||
diag.span_label(sp, "contains invalid anchor");
|
diag.span_label(sp, "contains invalid anchor");
|
||||||
}
|
}
|
||||||
|
@ -2013,7 +2013,7 @@ fn ambiguity_error(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
report_diagnostic(cx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| {
|
report_diagnostic(cx.tcx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| {
|
||||||
if let Some(sp) = sp {
|
if let Some(sp) = sp {
|
||||||
diag.span_label(sp, "ambiguous link");
|
diag.span_label(sp, "ambiguous link");
|
||||||
} else {
|
} else {
|
||||||
|
@ -2066,7 +2066,7 @@ fn privacy_error(cx: &DocContext<'_>, item: &Item, path_str: &str, dox: &str, li
|
||||||
let msg =
|
let msg =
|
||||||
format!("public documentation for `{}` links to private item `{}`", item_name, path_str);
|
format!("public documentation for `{}` links to private item `{}`", item_name, path_str);
|
||||||
|
|
||||||
report_diagnostic(cx, PRIVATE_INTRA_DOC_LINKS, &msg, item, dox, &link.range, |diag, sp| {
|
report_diagnostic(cx.tcx, PRIVATE_INTRA_DOC_LINKS, &msg, item, dox, &link.range, |diag, sp| {
|
||||||
if let Some(sp) = sp {
|
if let Some(sp) = sp {
|
||||||
diag.span_label(sp, "this item is private");
|
diag.span_label(sp, "this item is private");
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ crate fn should_have_doc_example(cx: &DocContext<'_>, item: &clean::Item) -> boo
|
||||||
}
|
}
|
||||||
|
|
||||||
crate fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) {
|
crate fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) {
|
||||||
let hir_id = match cx.as_local_hir_id(item.def_id) {
|
let hir_id = match DocContext::as_local_hir_id(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.
|
||||||
|
|
|
@ -167,7 +167,8 @@ fn extract_tags(
|
||||||
|
|
||||||
impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
|
impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
|
||||||
fn fold_item(&mut self, item: Item) -> Option<Item> {
|
fn fold_item(&mut self, item: Item) -> Option<Item> {
|
||||||
let hir_id = match self.cx.as_local_hir_id(item.def_id) {
|
let tcx = self.cx.tcx;
|
||||||
|
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.
|
||||||
|
@ -176,13 +177,12 @@ impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
|
||||||
};
|
};
|
||||||
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
|
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
|
||||||
if !dox.is_empty() {
|
if !dox.is_empty() {
|
||||||
let cx = &self.cx;
|
|
||||||
let report_diag = |msg: &str, range: &Range<usize>| {
|
let report_diag = |msg: &str, range: &Range<usize>| {
|
||||||
let sp = match super::source_span_for_markdown_range(cx, &dox, range, &item.attrs) {
|
let sp = match super::source_span_for_markdown_range(tcx, &dox, range, &item.attrs) {
|
||||||
Some(sp) => sp,
|
Some(sp) => sp,
|
||||||
None => span_of_attrs(&item.attrs).unwrap_or(item.source.span()),
|
None => span_of_attrs(&item.attrs).unwrap_or(item.source.span()),
|
||||||
};
|
};
|
||||||
cx.tcx.struct_span_lint_hir(crate::lint::INVALID_HTML_TAGS, hir_id, sp, |lint| {
|
tcx.struct_span_lint_hir(crate::lint::INVALID_HTML_TAGS, hir_id, sp, |lint| {
|
||||||
lint.build(msg).emit()
|
lint.build(msg).emit()
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
//! Contains information about "passes", used to modify crate information during the documentation
|
//! Contains information about "passes", used to modify crate information during the documentation
|
||||||
//! process.
|
//! process.
|
||||||
|
|
||||||
|
use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_span::{InnerSpan, Span, DUMMY_SP};
|
use rustc_span::{InnerSpan, Span, DUMMY_SP};
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
|
||||||
|
@ -167,7 +168,7 @@ crate fn span_of_attrs(attrs: &clean::Attributes) -> Option<Span> {
|
||||||
/// attributes are not all sugared doc comments. It's difficult to calculate the correct span in
|
/// attributes are not all sugared doc comments. It's difficult to calculate the correct span in
|
||||||
/// that case due to escaping and other source features.
|
/// that case due to escaping and other source features.
|
||||||
crate fn source_span_for_markdown_range(
|
crate fn source_span_for_markdown_range(
|
||||||
cx: &DocContext<'_>,
|
tcx: TyCtxt<'_>,
|
||||||
markdown: &str,
|
markdown: &str,
|
||||||
md_range: &Range<usize>,
|
md_range: &Range<usize>,
|
||||||
attrs: &clean::Attributes,
|
attrs: &clean::Attributes,
|
||||||
|
@ -179,7 +180,7 @@ crate fn source_span_for_markdown_range(
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let snippet = cx.sess().source_map().span_to_snippet(span_of_attrs(attrs)?).ok()?;
|
let snippet = tcx.sess.source_map().span_to_snippet(span_of_attrs(attrs)?).ok()?;
|
||||||
|
|
||||||
let starting_line = markdown[..md_range.start].matches('\n').count();
|
let starting_line = markdown[..md_range.start].matches('\n').count();
|
||||||
let ending_line = starting_line + markdown[md_range.start..md_range.end].matches('\n').count();
|
let ending_line = starting_line + markdown[md_range.start..md_range.end].matches('\n').count();
|
||||||
|
|
|
@ -60,7 +60,7 @@ crate fn check_non_autolinks(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
|
||||||
|
|
||||||
impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> {
|
impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> {
|
||||||
fn fold_item(&mut self, item: Item) -> Option<Item> {
|
fn fold_item(&mut self, item: Item) -> Option<Item> {
|
||||||
let hir_id = match self.cx.as_local_hir_id(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.
|
||||||
|
@ -70,7 +70,7 @@ impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> {
|
||||||
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
|
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
|
||||||
if !dox.is_empty() {
|
if !dox.is_empty() {
|
||||||
let report_diag = |cx: &DocContext<'_>, msg: &str, url: &str, range: Range<usize>| {
|
let report_diag = |cx: &DocContext<'_>, msg: &str, url: &str, range: Range<usize>| {
|
||||||
let sp = super::source_span_for_markdown_range(cx, &dox, &range, &item.attrs)
|
let sp = super::source_span_for_markdown_range(cx.tcx, &dox, &range, &item.attrs)
|
||||||
.or_else(|| span_of_attrs(&item.attrs))
|
.or_else(|| span_of_attrs(&item.attrs))
|
||||||
.unwrap_or(item.source.span());
|
.unwrap_or(item.source.span());
|
||||||
cx.tcx.struct_span_lint_hir(crate::lint::NON_AUTOLINKS, hir_id, sp, |lint| {
|
cx.tcx.struct_span_lint_hir(crate::lint::NON_AUTOLINKS, hir_id, sp, |lint| {
|
||||||
|
|
Loading…
Add table
Reference in a new issue