Skip to content

Commit b3c4e25

Browse files
committed
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`
1 parent ec7f258 commit b3c4e25

File tree

7 files changed

+29
-25
lines changed

7 files changed

+29
-25
lines changed

src/librustdoc/core.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -169,13 +169,13 @@ impl<'tcx> DocContext<'tcx> {
169169

170170
/// Like `hir().local_def_id_to_hir_id()`, but skips calling it on fake DefIds.
171171
/// (This avoids a slice-index-out-of-bounds panic.)
172-
crate fn as_local_hir_id(&self, def_id: DefId) -> Option<HirId> {
172+
crate fn as_local_hir_id(tcx: TyCtxt<'_>, def_id: DefId) -> Option<HirId> {
173173
if MAX_DEF_IDX.with(|m| {
174174
m.borrow().get(&def_id.krate).map(|&idx| idx <= def_id.index).unwrap_or(false)
175175
}) {
176176
None
177177
} else {
178-
def_id.as_local().map(|def_id| self.tcx.hir().local_def_id_to_hir_id(def_id))
178+
def_id.as_local().map(|def_id| tcx.hir().local_def_id_to_hir_id(def_id))
179179
}
180180
}
181181
}
@@ -479,7 +479,7 @@ crate fn run_global_ctxt(
479479
https://doc.rust-lang.org/nightly/rustdoc/how-to-write-documentation.html";
480480
tcx.struct_lint_node(
481481
crate::lint::MISSING_CRATE_LEVEL_DOCS,
482-
ctxt.as_local_hir_id(m.def_id).unwrap(),
482+
DocContext::as_local_hir_id(tcx, m.def_id).unwrap(),
483483
|lint| {
484484
let mut diag =
485485
lint.build("no documentation found for this crate's top-level module");

src/librustdoc/passes/check_code_block_syntax.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,12 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
4848
let buffer = buffer.borrow();
4949

5050
if buffer.has_errors || is_empty {
51-
let mut diag = if let Some(sp) =
52-
super::source_span_for_markdown_range(self.cx, &dox, &code_block.range, &item.attrs)
53-
{
51+
let mut diag = if let Some(sp) = super::source_span_for_markdown_range(
52+
self.cx.tcx,
53+
&dox,
54+
&code_block.range,
55+
&item.attrs,
56+
) {
5457
let (warning_message, suggest_using_text) = if buffer.has_errors {
5558
("could not parse code block as Rust code", true)
5659
} else {

src/librustdoc/passes/collect_intra_doc_links.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -1146,7 +1146,7 @@ impl LinkCollector<'_, '_> {
11461146
suggest_disambiguator(resolved, diag, path_str, dox, sp, &ori_link.range);
11471147
};
11481148
report_diagnostic(
1149-
self.cx,
1149+
self.cx.tcx,
11501150
BROKEN_INTRA_DOC_LINKS,
11511151
&msg,
11521152
&item,
@@ -1220,7 +1220,7 @@ impl LinkCollector<'_, '_> {
12201220
&& !self.cx.tcx.features().intra_doc_pointers
12211221
{
12221222
let span = super::source_span_for_markdown_range(
1223-
self.cx,
1223+
self.cx.tcx,
12241224
dox,
12251225
&ori_link.range,
12261226
&item.attrs,
@@ -1674,15 +1674,15 @@ impl Suggestion {
16741674
/// parameter of the callback will contain it, and the primary span of the diagnostic will be set
16751675
/// to it.
16761676
fn report_diagnostic(
1677-
cx: &DocContext<'_>,
1677+
tcx: TyCtxt<'_>,
16781678
lint: &'static Lint,
16791679
msg: &str,
16801680
item: &Item,
16811681
dox: &str,
16821682
link_range: &Range<usize>,
16831683
decorate: impl FnOnce(&mut DiagnosticBuilder<'_>, Option<rustc_span::Span>),
16841684
) {
1685-
let hir_id = match cx.as_local_hir_id(item.def_id) {
1685+
let hir_id = match DocContext::as_local_hir_id(tcx, item.def_id) {
16861686
Some(hir_id) => hir_id,
16871687
None => {
16881688
// If non-local, no need to check anything.
@@ -1694,10 +1694,10 @@ fn report_diagnostic(
16941694
let attrs = &item.attrs;
16951695
let sp = span_of_attrs(attrs).unwrap_or(item.source.span());
16961696

1697-
cx.tcx.struct_span_lint_hir(lint, hir_id, sp, |lint| {
1697+
tcx.struct_span_lint_hir(lint, hir_id, sp, |lint| {
16981698
let mut diag = lint.build(msg);
16991699

1700-
let span = super::source_span_for_markdown_range(cx, dox, link_range, attrs);
1700+
let span = super::source_span_for_markdown_range(tcx, dox, link_range, attrs);
17011701

17021702
if let Some(sp) = span {
17031703
diag.set_span(sp);
@@ -1742,7 +1742,7 @@ fn resolution_failure(
17421742
) {
17431743
let tcx = collector.cx.tcx;
17441744
report_diagnostic(
1745-
collector.cx,
1745+
tcx,
17461746
BROKEN_INTRA_DOC_LINKS,
17471747
&format!("unresolved link to `{}`", path_str),
17481748
item,
@@ -1973,7 +1973,7 @@ fn anchor_failure(
19731973
),
19741974
};
19751975

1976-
report_diagnostic(cx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| {
1976+
report_diagnostic(cx.tcx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| {
19771977
if let Some(sp) = sp {
19781978
diag.span_label(sp, "contains invalid anchor");
19791979
}
@@ -2013,7 +2013,7 @@ fn ambiguity_error(
20132013
}
20142014
}
20152015

2016-
report_diagnostic(cx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| {
2016+
report_diagnostic(cx.tcx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| {
20172017
if let Some(sp) = sp {
20182018
diag.span_label(sp, "ambiguous link");
20192019
} else {
@@ -2066,7 +2066,7 @@ fn privacy_error(cx: &DocContext<'_>, item: &Item, path_str: &str, dox: &str, li
20662066
let msg =
20672067
format!("public documentation for `{}` links to private item `{}`", item_name, path_str);
20682068

2069-
report_diagnostic(cx, PRIVATE_INTRA_DOC_LINKS, &msg, item, dox, &link.range, |diag, sp| {
2069+
report_diagnostic(cx.tcx, PRIVATE_INTRA_DOC_LINKS, &msg, item, dox, &link.range, |diag, sp| {
20702070
if let Some(sp) = sp {
20712071
diag.span_label(sp, "this item is private");
20722072
}

src/librustdoc/passes/doc_test_lints.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ crate fn should_have_doc_example(cx: &DocContext<'_>, item: &clean::Item) -> boo
7373
}
7474

7575
crate fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) {
76-
let hir_id = match cx.as_local_hir_id(item.def_id) {
76+
let hir_id = match DocContext::as_local_hir_id(cx.tcx, item.def_id) {
7777
Some(hir_id) => hir_id,
7878
None => {
7979
// If non-local, no need to check anything.

src/librustdoc/passes/html_tags.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ fn extract_tags(
167167

168168
impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
169169
fn fold_item(&mut self, item: Item) -> Option<Item> {
170-
let hir_id = match self.cx.as_local_hir_id(item.def_id) {
170+
let tcx = self.cx.tcx;
171+
let hir_id = match DocContext::as_local_hir_id(tcx, item.def_id) {
171172
Some(hir_id) => hir_id,
172173
None => {
173174
// If non-local, no need to check anything.
@@ -176,13 +177,12 @@ impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
176177
};
177178
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
178179
if !dox.is_empty() {
179-
let cx = &self.cx;
180180
let report_diag = |msg: &str, range: &Range<usize>| {
181-
let sp = match super::source_span_for_markdown_range(cx, &dox, range, &item.attrs) {
181+
let sp = match super::source_span_for_markdown_range(tcx, &dox, range, &item.attrs) {
182182
Some(sp) => sp,
183183
None => span_of_attrs(&item.attrs).unwrap_or(item.source.span()),
184184
};
185-
cx.tcx.struct_span_lint_hir(crate::lint::INVALID_HTML_TAGS, hir_id, sp, |lint| {
185+
tcx.struct_span_lint_hir(crate::lint::INVALID_HTML_TAGS, hir_id, sp, |lint| {
186186
lint.build(msg).emit()
187187
});
188188
};

src/librustdoc/passes/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Contains information about "passes", used to modify crate information during the documentation
22
//! process.
33
4+
use rustc_middle::ty::TyCtxt;
45
use rustc_span::{InnerSpan, Span, DUMMY_SP};
56
use std::ops::Range;
67

@@ -167,7 +168,7 @@ crate fn span_of_attrs(attrs: &clean::Attributes) -> Option<Span> {
167168
/// attributes are not all sugared doc comments. It's difficult to calculate the correct span in
168169
/// that case due to escaping and other source features.
169170
crate fn source_span_for_markdown_range(
170-
cx: &DocContext<'_>,
171+
tcx: TyCtxt<'_>,
171172
markdown: &str,
172173
md_range: &Range<usize>,
173174
attrs: &clean::Attributes,
@@ -179,7 +180,7 @@ crate fn source_span_for_markdown_range(
179180
return None;
180181
}
181182

182-
let snippet = cx.sess().source_map().span_to_snippet(span_of_attrs(attrs)?).ok()?;
183+
let snippet = tcx.sess.source_map().span_to_snippet(span_of_attrs(attrs)?).ok()?;
183184

184185
let starting_line = markdown[..md_range.start].matches('\n').count();
185186
let ending_line = starting_line + markdown[md_range.start..md_range.end].matches('\n').count();

src/librustdoc/passes/non_autolinks.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ crate fn check_non_autolinks(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
6060

6161
impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> {
6262
fn fold_item(&mut self, item: Item) -> Option<Item> {
63-
let hir_id = match self.cx.as_local_hir_id(item.def_id) {
63+
let hir_id = match DocContext::as_local_hir_id(self.cx.tcx, item.def_id) {
6464
Some(hir_id) => hir_id,
6565
None => {
6666
// If non-local, no need to check anything.
@@ -70,7 +70,7 @@ impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> {
7070
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
7171
if !dox.is_empty() {
7272
let report_diag = |cx: &DocContext<'_>, msg: &str, url: &str, range: Range<usize>| {
73-
let sp = super::source_span_for_markdown_range(cx, &dox, &range, &item.attrs)
73+
let sp = super::source_span_for_markdown_range(cx.tcx, &dox, &range, &item.attrs)
7474
.or_else(|| span_of_attrs(&item.attrs))
7575
.unwrap_or(item.source.span());
7676
cx.tcx.struct_span_lint_hir(crate::lint::NON_AUTOLINKS, hir_id, sp, |lint| {

0 commit comments

Comments
 (0)