make clean::Item::span return option instead of dummy span
This commit is contained in:
parent
569788e47e
commit
752b0e0672
7 changed files with 40 additions and 30 deletions
|
@ -415,29 +415,28 @@ impl Item {
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn span(&self, tcx: TyCtxt<'_>) -> Span {
|
pub(crate) fn span(&self, tcx: TyCtxt<'_>) -> Option<Span> {
|
||||||
let kind = match &*self.kind {
|
let kind = match &*self.kind {
|
||||||
ItemKind::StrippedItem(k) => k,
|
ItemKind::StrippedItem(k) => k,
|
||||||
_ => &*self.kind,
|
_ => &*self.kind,
|
||||||
};
|
};
|
||||||
match kind {
|
match kind {
|
||||||
ItemKind::ModuleItem(Module { span, .. }) => *span,
|
ItemKind::ModuleItem(Module { span, .. }) => Some(*span),
|
||||||
ItemKind::ImplItem(box Impl { kind: ImplKind::Auto, .. }) => Span::dummy(),
|
ItemKind::ImplItem(box Impl { kind: ImplKind::Auto, .. }) => None,
|
||||||
ItemKind::ImplItem(box Impl { kind: ImplKind::Blanket(_), .. }) => {
|
ItemKind::ImplItem(box Impl { kind: ImplKind::Blanket(_), .. }) => {
|
||||||
if let ItemId::Blanket { impl_id, .. } = self.item_id {
|
if let ItemId::Blanket { impl_id, .. } = self.item_id {
|
||||||
rustc_span(impl_id, tcx)
|
Some(rustc_span(impl_id, tcx))
|
||||||
} else {
|
} else {
|
||||||
panic!("blanket impl item has non-blanket ID")
|
panic!("blanket impl item has non-blanket ID")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => self.item_id.as_def_id().map(|did| rustc_span(did, tcx)),
|
||||||
self.item_id.as_def_id().map(|did| rustc_span(did, tcx)).unwrap_or_else(Span::dummy)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn attr_span(&self, tcx: TyCtxt<'_>) -> rustc_span::Span {
|
pub(crate) fn attr_span(&self, tcx: TyCtxt<'_>) -> rustc_span::Span {
|
||||||
crate::passes::span_of_attrs(&self.attrs).unwrap_or_else(|| self.span(tcx).inner())
|
crate::passes::span_of_attrs(&self.attrs)
|
||||||
|
.unwrap_or_else(|| self.span(tcx).map_or(rustc_span::DUMMY_SP, |span| span.inner()))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Finds the `doc` attribute as a NameValue and returns the corresponding
|
/// Finds the `doc` attribute as a NameValue and returns the corresponding
|
||||||
|
@ -2109,14 +2108,6 @@ impl Span {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn dummy() -> Self {
|
|
||||||
Self(rustc_span::DUMMY_SP)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn is_dummy(&self) -> bool {
|
|
||||||
self.0.is_dummy()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn filename(&self, sess: &Session) -> FileName {
|
pub(crate) fn filename(&self, sess: &Session) -> FileName {
|
||||||
sess.source_map().span_to_filename(self.0)
|
sess.source_map().span_to_filename(self.0)
|
||||||
}
|
}
|
||||||
|
|
|
@ -301,13 +301,10 @@ impl<'tcx> Context<'tcx> {
|
||||||
/// may happen, for example, with externally inlined items where the source
|
/// may happen, for example, with externally inlined items where the source
|
||||||
/// of their crate documentation isn't known.
|
/// of their crate documentation isn't known.
|
||||||
pub(super) fn src_href(&self, item: &clean::Item) -> Option<String> {
|
pub(super) fn src_href(&self, item: &clean::Item) -> Option<String> {
|
||||||
self.href_from_span(item.span(self.tcx()), true)
|
self.href_from_span(item.span(self.tcx())?, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn href_from_span(&self, span: clean::Span, with_lines: bool) -> Option<String> {
|
pub(crate) fn href_from_span(&self, span: clean::Span, with_lines: bool) -> Option<String> {
|
||||||
if span.is_dummy() {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
let mut root = self.root_path();
|
let mut root = self.root_path();
|
||||||
let mut path = String::new();
|
let mut path = String::new();
|
||||||
let cnum = span.cnum(self.sess());
|
let cnum = span.cnum(self.sess());
|
||||||
|
|
|
@ -2677,7 +2677,7 @@ fn render_call_locations(w: &mut Buffer, cx: &mut Context<'_>, item: &clean::Ite
|
||||||
let contents = match fs::read_to_string(&path) {
|
let contents = match fs::read_to_string(&path) {
|
||||||
Ok(contents) => contents,
|
Ok(contents) => contents,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let span = item.span(tcx).inner();
|
let span = item.span(tcx).map_or(rustc_span::DUMMY_SP, |span| span.inner());
|
||||||
tcx.sess
|
tcx.sess
|
||||||
.span_err(span, &format!("failed to read file {}: {}", path.display(), err));
|
.span_err(span, &format!("failed to read file {}: {}", path.display(), err));
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -53,6 +53,7 @@ impl LocalSourcesCollector<'_, '_> {
|
||||||
fn add_local_source(&mut self, item: &clean::Item) {
|
fn add_local_source(&mut self, item: &clean::Item) {
|
||||||
let sess = self.tcx.sess;
|
let sess = self.tcx.sess;
|
||||||
let span = item.span(self.tcx);
|
let span = item.span(self.tcx);
|
||||||
|
let Some(span) = span else { return };
|
||||||
// skip all synthetic "files"
|
// skip all synthetic "files"
|
||||||
if !is_real_and_local(span, sess) {
|
if !is_real_and_local(span, sess) {
|
||||||
return;
|
return;
|
||||||
|
@ -109,6 +110,7 @@ impl DocVisitor for SourceCollector<'_, '_> {
|
||||||
|
|
||||||
let tcx = self.cx.tcx();
|
let tcx = self.cx.tcx();
|
||||||
let span = item.span(tcx);
|
let span = item.span(tcx);
|
||||||
|
let Some(span) = span else { return };
|
||||||
let sess = tcx.sess;
|
let sess = tcx.sess;
|
||||||
|
|
||||||
// If we're not rendering sources, there's nothing to do.
|
// If we're not rendering sources, there's nothing to do.
|
||||||
|
|
|
@ -59,7 +59,7 @@ impl JsonRenderer<'_> {
|
||||||
id: from_item_id_with_name(item_id, self.tcx, name),
|
id: from_item_id_with_name(item_id, self.tcx, name),
|
||||||
crate_id: item_id.krate().as_u32(),
|
crate_id: item_id.krate().as_u32(),
|
||||||
name: name.map(|sym| sym.to_string()),
|
name: name.map(|sym| sym.to_string()),
|
||||||
span: self.convert_span(span),
|
span: span.and_then(|span| self.convert_span(span)),
|
||||||
visibility: self.convert_visibility(visibility),
|
visibility: self.convert_visibility(visibility),
|
||||||
docs,
|
docs,
|
||||||
attrs,
|
attrs,
|
||||||
|
|
|
@ -215,7 +215,6 @@ impl<'a, 'b> DocVisitor for CoverageCalculator<'a, 'b> {
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
|
|
||||||
let filename = i.span(self.ctx.tcx).filename(self.ctx.sess());
|
|
||||||
let has_doc_example = tests.found_tests != 0;
|
let has_doc_example = tests.found_tests != 0;
|
||||||
// The `expect_def_id()` should be okay because `local_def_id_to_hir_id`
|
// The `expect_def_id()` should be okay because `local_def_id_to_hir_id`
|
||||||
// would presumably panic if a fake `DefIndex` were passed.
|
// would presumably panic if a fake `DefIndex` were passed.
|
||||||
|
@ -261,6 +260,8 @@ impl<'a, 'b> DocVisitor for CoverageCalculator<'a, 'b> {
|
||||||
let should_have_docs = !should_be_ignored
|
let should_have_docs = !should_be_ignored
|
||||||
&& (level != lint::Level::Allow || matches!(source, LintLevelSource::Default));
|
&& (level != lint::Level::Allow || matches!(source, LintLevelSource::Default));
|
||||||
|
|
||||||
|
if let Some(span) = i.span(self.ctx.tcx) {
|
||||||
|
let filename = span.filename(self.ctx.sess());
|
||||||
debug!("counting {:?} {:?} in {:?}", i.type_(), i.name, filename);
|
debug!("counting {:?} {:?} in {:?}", i.type_(), i.name, filename);
|
||||||
self.items.entry(filename).or_default().count_item(
|
self.items.entry(filename).or_default().count_item(
|
||||||
has_docs,
|
has_docs,
|
||||||
|
@ -270,6 +271,7 @@ impl<'a, 'b> DocVisitor for CoverageCalculator<'a, 'b> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.visit_item_recur(i)
|
self.visit_item_recur(i)
|
||||||
}
|
}
|
||||||
|
|
18
src/test/rustdoc-json/impls/auto.rs
Normal file
18
src/test/rustdoc-json/impls/auto.rs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#![feature(no_core, auto_traits, lang_items)]
|
||||||
|
#![no_core]
|
||||||
|
|
||||||
|
#[lang = "sized"]
|
||||||
|
trait Sized {}
|
||||||
|
|
||||||
|
pub auto trait Bar {}
|
||||||
|
|
||||||
|
/// has span
|
||||||
|
impl Foo {
|
||||||
|
pub fn baz(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Testing spans, so all tests below code
|
||||||
|
// @is auto.json "$.index[*][?(@.kind=='impl' && @.inner.synthetic==true)].span" null
|
||||||
|
// @is - "$.index[*][?(@.docs=='has span')].span.begin" "[10, 0]"
|
||||||
|
// @is - "$.index[*][?(@.docs=='has span')].span.end" "[12, 1]"
|
||||||
|
pub struct Foo;
|
Loading…
Add table
Add a link
Reference in a new issue