diff --git a/src/librustdoc/clean/auto_trait.rs b/src/librustdoc/clean/auto_trait.rs index d0e058c7dda75..9052e5954200f 100644 --- a/src/librustdoc/clean/auto_trait.rs +++ b/src/librustdoc/clean/auto_trait.rs @@ -110,7 +110,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { }; Some(Item { - source: Span::dummy(), + span: Span::dummy(), name: None, attrs: Default::default(), visibility: Inherited, diff --git a/src/librustdoc/clean/blanket_impl.rs b/src/librustdoc/clean/blanket_impl.rs index 4e4e1e5cbce2f..6e7164457ceb6 100644 --- a/src/librustdoc/clean/blanket_impl.rs +++ b/src/librustdoc/clean/blanket_impl.rs @@ -102,7 +102,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> { .collect(); impls.push(Item { - source: self.cx.tcx.def_span(impl_def_id).clean(self.cx), + span: self.cx.tcx.def_span(impl_def_id).clean(self.cx), name: None, attrs: Default::default(), visibility: Inherited, diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 47a74238a7a3d..0d32c14c3be9b 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -459,7 +459,7 @@ fn build_module( items.push(clean::Item { name: None, attrs: box clean::Attributes::default(), - source: clean::Span::dummy(), + span: clean::Span::dummy(), def_id: DefId::local(CRATE_DEF_INDEX), visibility: clean::Public, kind: box clean::ImportItem(clean::Import::new_simple( diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 17a961a5f6655..e5fe1159928d5 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -235,7 +235,7 @@ impl Clean for doctree::Module<'_> { ModuleItem(Module { is_crate: self.is_crate, items }), cx, ); - Item { source: span.clean(cx), ..what_rustc_thinks } + Item { span: span.clean(cx), ..what_rustc_thinks } } } @@ -2132,7 +2132,7 @@ fn clean_extern_crate( vec![Item { name: Some(name), attrs: box attrs.clean(cx), - source: krate.span.clean(cx), + span: krate.span.clean(cx), def_id: crate_def_id, visibility: krate.vis.clean(cx), kind: box ExternCrateItem { src: orig_name }, diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 840a42c2b8aab..3dd27933471be 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -81,12 +81,14 @@ crate struct ExternalCrate { /// directly to the AST's concept of an item; it's a strict superset. #[derive(Clone)] crate struct Item { - /// Stringified span - crate source: Span, - /// Not everything has a name. E.g., impls + crate span: Span, + /// The name of this item. + /// Optional because not every item has a name, e.g. impls. crate name: Option, crate attrs: Box, crate visibility: Visibility, + /// Information about this item that is specific to what kind of item it is. + /// E.g., struct vs enum vs function. crate kind: Box, crate def_id: DefId, } @@ -100,7 +102,7 @@ impl fmt::Debug for Item { let def_id: &dyn fmt::Debug = if self.is_fake() { &"**FAKE**" } else { &self.def_id }; fmt.debug_struct("Item") - .field("source", &self.source) + .field("source", &self.span) .field("name", &self.name) .field("attrs", &self.attrs) .field("kind", &self.kind) @@ -165,7 +167,7 @@ impl Item { debug!("name={:?}, def_id={:?}", name, def_id); // `span_if_local()` lies about functions and only gives the span of the function signature - let source = def_id.as_local().map_or_else( + let span = def_id.as_local().map_or_else( || cx.tcx.def_span(def_id), |local| { let hir = cx.tcx.hir(); @@ -177,7 +179,7 @@ impl Item { def_id, kind: box kind, name, - source: source.clean(cx), + span: span.clean(cx), attrs, visibility: cx.tcx.visibility(def_id).clean(cx), } @@ -559,6 +561,8 @@ impl<'a> FromIterator<&'a DocFragment> for String { } } +/// The attributes on an [`Item`], including attributes like `#[derive(...)]` and `#[inline]`, +/// as well as doc comments. #[derive(Clone, Debug, Default)] crate struct Attributes { crate doc_strings: Vec, @@ -1798,8 +1802,13 @@ impl From for PrimitiveType { #[derive(Copy, Clone, Debug)] crate enum Visibility { + /// `pub` Public, + /// Visibility inherited from parent. + /// + /// For example, this is the visibility of private items and of enum variants. Inherited, + /// `pub(crate)`, `pub(super)`, or `pub(in path::to::somewhere)` Restricted(DefId), } @@ -1848,7 +1857,8 @@ crate enum Variant { Struct(VariantStruct), } -/// Small wrapper around `rustc_span::Span` that adds helper methods and enforces calling `source_callsite`. +/// Small wrapper around [`rustc_span::Span]` that adds helper methods +/// and enforces calling [`rustc_span::Span::source_callsite()`]. #[derive(Clone, Debug)] crate struct Span(rustc_span::Span); @@ -1860,12 +1870,12 @@ impl Span { Self(sp.source_callsite()) } - crate fn dummy() -> Self { - Self(rustc_span::DUMMY_SP) + crate fn inner(&self) -> rustc_span::Span { + self.0 } - crate fn span(&self) -> rustc_span::Span { - self.0 + crate fn dummy() -> Self { + Self(rustc_span::DUMMY_SP) } crate fn is_dummy(&self) -> bool { diff --git a/src/librustdoc/html/render/context.rs b/src/librustdoc/html/render/context.rs index 864fbccbcc451..05993d8df6036 100644 --- a/src/librustdoc/html/render/context.rs +++ b/src/librustdoc/html/render/context.rs @@ -228,15 +228,15 @@ impl<'tcx> Context<'tcx> { /// may happen, for example, with externally inlined items where the source /// of their crate documentation isn't known. pub(super) fn src_href(&self, item: &clean::Item) -> Option { - if item.source.is_dummy() { + if item.span.is_dummy() { return None; } let mut root = self.root_path(); let mut path = String::new(); - let cnum = item.source.cnum(self.sess()); + let cnum = item.span.cnum(self.sess()); // We can safely ignore synthetic `SourceFile`s. - let file = match item.source.filename(self.sess()) { + let file = match item.span.filename(self.sess()) { FileName::Real(ref path) => path.local_path().to_path_buf(), _ => return None, }; @@ -270,8 +270,8 @@ impl<'tcx> Context<'tcx> { (&*symbol, &path) }; - let loline = item.source.lo(self.sess()).line; - let hiline = item.source.hi(self.sess()).line; + let loline = item.span.lo(self.sess()).line; + let hiline = item.span.hi(self.sess()).line; let lines = if loline == hiline { loline.to_string() } else { format!("{}-{}", loline, hiline) }; Some(format!( diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index 6cdd3838023e6..c3c4c4952b3b4 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -937,7 +937,7 @@ fn item_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Mac Some("macro"), None, None, - it.source.span().edition(), + it.span.inner().edition(), ); }); document(w, cx, it, None) diff --git a/src/librustdoc/html/sources.rs b/src/librustdoc/html/sources.rs index 689cda76cc094..1b6a82fed1170 100644 --- a/src/librustdoc/html/sources.rs +++ b/src/librustdoc/html/sources.rs @@ -41,11 +41,11 @@ impl DocFolder for SourceCollector<'_, '_> { // then we need to render it out to the filesystem. if self.scx.include_sources // skip all synthetic "files" - && item.source.filename(self.sess()).is_real() + && item.span.filename(self.sess()).is_real() // skip non-local files - && item.source.cnum(self.sess()) == LOCAL_CRATE + && item.span.cnum(self.sess()) == LOCAL_CRATE { - let filename = item.source.filename(self.sess()); + let filename = item.span.filename(self.sess()); // If it turns out that we couldn't read this file, then we probably // can't read any of the files (generating html output from json or // something like that), so just don't include sources for the diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index 063d8aab1ec3e..073209c2468a0 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -24,7 +24,7 @@ use std::collections::HashSet; impl JsonRenderer<'_> { pub(super) fn convert_item(&self, item: clean::Item) -> Option { let deprecation = item.deprecation(self.tcx); - let clean::Item { source, name, attrs, kind, visibility, def_id } = item; + let clean::Item { span, name, attrs, kind, visibility, def_id } = item; let inner = match *kind { clean::StrippedItem(_) => return None, x => from_clean_item_kind(x, self.tcx, &name), @@ -33,7 +33,7 @@ impl JsonRenderer<'_> { id: from_def_id(def_id), crate_id: def_id.krate.as_u32(), name: name.map(|sym| sym.to_string()), - source: self.convert_span(source), + span: self.convert_span(span), visibility: self.convert_visibility(visibility), docs: attrs.collapsed_doc_value(), links: attrs @@ -503,13 +503,13 @@ impl From for Import { use clean::ImportKind::*; match import.kind { Simple(s) => Import { - span: import.source.path.whole_name(), + source: import.source.path.whole_name(), name: s.to_string(), id: import.source.did.map(from_def_id), glob: false, }, Glob => Import { - span: import.source.path.whole_name(), + source: import.source.path.whole_name(), name: import.source.path.last_name().to_string(), id: import.source.did.map(from_def_id), glob: true, diff --git a/src/librustdoc/json/mod.rs b/src/librustdoc/json/mod.rs index b762fd7e18bd7..c1dbb5dd33a96 100644 --- a/src/librustdoc/json/mod.rs +++ b/src/librustdoc/json/mod.rs @@ -109,7 +109,7 @@ impl JsonRenderer<'tcx> { .map(Clone::clone), visibility: types::Visibility::Public, inner: types::ItemEnum::Trait(trait_item.clone().into()), - source: None, + span: None, docs: Default::default(), links: Default::default(), attrs: Default::default(), @@ -246,7 +246,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { ) }) .collect(), - format_version: 4, + format_version: 5, }; let mut p = self.out_path.clone(); p.push(output.index.get(&output.root).unwrap().name.clone().unwrap()); diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs index 0e975128628ac..a2f8eb3772efd 100644 --- a/src/librustdoc/passes/calculate_doc_coverage.rs +++ b/src/librustdoc/passes/calculate_doc_coverage.rs @@ -212,7 +212,7 @@ impl<'a, 'b> fold::DocFolder for CoverageCalculator<'a, 'b> { return Some(i); } clean::ImplItem(ref impl_) => { - let filename = i.source.filename(self.ctx.sess()); + let filename = i.span.filename(self.ctx.sess()); if let Some(ref tr) = impl_.trait_ { debug!( "impl {:#} for {:#} in {}", @@ -243,7 +243,7 @@ impl<'a, 'b> fold::DocFolder for CoverageCalculator<'a, 'b> { None, ); - let filename = i.source.filename(self.ctx.sess()); + let filename = i.span.filename(self.ctx.sess()); let has_doc_example = tests.found_tests != 0; let hir_id = self.ctx.tcx.hir().local_def_id_to_hir_id(i.def_id.expect_local()); let (level, source) = self.ctx.tcx.lint_level_at_node(MISSING_DOCS, hir_id); diff --git a/src/librustdoc/passes/check_code_block_syntax.rs b/src/librustdoc/passes/check_code_block_syntax.rs index 98886139f3088..f98f524ca4072 100644 --- a/src/librustdoc/passes/check_code_block_syntax.rs +++ b/src/librustdoc/passes/check_code_block_syntax.rs @@ -86,7 +86,7 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> { // We couldn't calculate the span of the markdown block that had the error, so our // diagnostics are going to be a bit lacking. let mut diag = self.cx.sess().struct_span_warn( - super::span_of_attrs(&item.attrs).unwrap_or(item.source.span()), + super::span_of_attrs(&item.attrs).unwrap_or(item.span.inner()), "doc comment contains an invalid Rust code block", ); @@ -110,7 +110,7 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> { impl<'a, 'tcx> DocFolder for SyntaxChecker<'a, 'tcx> { fn fold_item(&mut self, item: clean::Item) -> Option { if let Some(dox) = &item.attrs.collapsed_doc_value() { - let sp = span_of_attrs(&item.attrs).unwrap_or(item.source.span()); + let sp = span_of_attrs(&item.attrs).unwrap_or(item.span.inner()); let extra = crate::html::markdown::ExtraInfo::new_did(self.cx.tcx, item.def_id, sp); for code_block in markdown::rust_code_blocks(&dox, &extra) { self.check_rust_syntax(&item, &dox, code_block); diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index ec5994b762b8a..499931f7e9631 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -1226,9 +1226,7 @@ impl LinkCollector<'_, '_> { &ori_link.range, &item.attrs, ) - .unwrap_or_else(|| { - span_of_attrs(&item.attrs).unwrap_or(item.source.span()) - }); + .unwrap_or_else(|| span_of_attrs(&item.attrs).unwrap_or(item.span.inner())); rustc_session::parse::feature_err( &self.cx.tcx.sess.parse_sess, @@ -1693,7 +1691,7 @@ fn report_diagnostic( }; let attrs = &item.attrs; - let sp = span_of_attrs(attrs).unwrap_or(item.source.span()); + let sp = span_of_attrs(attrs).unwrap_or(item.span.inner()); tcx.struct_span_lint_hir(lint, hir_id, sp, |lint| { let mut diag = lint.build(msg); diff --git a/src/librustdoc/passes/doc_test_lints.rs b/src/librustdoc/passes/doc_test_lints.rs index 951258db9e2a2..b36358489900e 100644 --- a/src/librustdoc/passes/doc_test_lints.rs +++ b/src/librustdoc/passes/doc_test_lints.rs @@ -97,7 +97,7 @@ crate fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) { if tests.found_tests == 0 && cx.tcx.sess.is_nightly_build() { if should_have_doc_example(cx, &item) { debug!("reporting error for {:?} (hir_id={:?})", item, hir_id); - let sp = span_of_attrs(&item.attrs).unwrap_or(item.source.span()); + let sp = span_of_attrs(&item.attrs).unwrap_or(item.span.inner()); cx.tcx.struct_span_lint_hir( crate::lint::MISSING_DOC_CODE_EXAMPLES, hir_id, @@ -109,7 +109,7 @@ crate fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) { cx.tcx.struct_span_lint_hir( crate::lint::PRIVATE_DOC_TESTS, hir_id, - span_of_attrs(&item.attrs).unwrap_or(item.source.span()), + span_of_attrs(&item.attrs).unwrap_or(item.span.inner()), |lint| lint.build("documentation test in private item").emit(), ); } diff --git a/src/librustdoc/passes/html_tags.rs b/src/librustdoc/passes/html_tags.rs index 23364b6fec9d1..881feb0d87a47 100644 --- a/src/librustdoc/passes/html_tags.rs +++ b/src/librustdoc/passes/html_tags.rs @@ -181,7 +181,7 @@ impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> { let sp = match super::source_span_for_markdown_range(tcx, &dox, range, &item.attrs) { Some(sp) => sp, - None => span_of_attrs(&item.attrs).unwrap_or(item.source.span()), + None => span_of_attrs(&item.attrs).unwrap_or(item.span.inner()), }; tcx.struct_span_lint_hir(crate::lint::INVALID_HTML_TAGS, hir_id, sp, |lint| { lint.build(msg).emit() diff --git a/src/librustdoc/passes/non_autolinks.rs b/src/librustdoc/passes/non_autolinks.rs index 16ad940c62717..9761a78577dea 100644 --- a/src/librustdoc/passes/non_autolinks.rs +++ b/src/librustdoc/passes/non_autolinks.rs @@ -72,7 +72,7 @@ impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> { let report_diag = |cx: &DocContext<'_>, msg: &str, url: &str, range: Range| { let sp = super::source_span_for_markdown_range(cx.tcx, &dox, &range, &item.attrs) .or_else(|| span_of_attrs(&item.attrs)) - .unwrap_or(item.source.span()); + .unwrap_or(item.span.inner()); cx.tcx.struct_span_lint_hir(crate::lint::NON_AUTOLINKS, hir_id, sp, |lint| { lint.build(msg) .span_suggestion( diff --git a/src/rustdoc-json-types/lib.rs b/src/rustdoc-json-types/lib.rs index 4e7794fe61064..72a4d9a183011 100644 --- a/src/rustdoc-json-types/lib.rs +++ b/src/rustdoc-json-types/lib.rs @@ -64,7 +64,7 @@ pub struct Item { pub name: Option, /// The source location of this item (absent if it came from a macro expansion or inline /// assembly). - pub source: Option, + pub span: Option, /// By default all documented items are public, but you can tell rustdoc to output private items /// so this field is needed to differentiate. pub visibility: Visibility, @@ -461,7 +461,7 @@ pub struct Impl { #[serde(rename_all = "snake_case")] pub struct Import { /// The full path being imported. - pub span: String, + pub source: String, /// May be different from the last segment of `source` when renaming imports: /// `use source as name;` pub name: String, diff --git a/src/test/rustdoc-json/nested.rs b/src/test/rustdoc-json/nested.rs index 5bb66f7f6fd7c..b0e717d8a86ba 100644 --- a/src/test/rustdoc-json/nested.rs +++ b/src/test/rustdoc-json/nested.rs @@ -24,7 +24,7 @@ pub mod l1 { // @has - "$.index[*][?(@.name=='l3')].inner.items[*]" $l4_id pub struct L4; } - // @is nested.json "$.index[*][?(@.inner.span=='l3::L4')].kind" \"import\" - // @is - "$.index[*][?(@.inner.span=='l3::L4')].inner.glob" false + // @is nested.json "$.index[*][?(@.inner.source=='l3::L4')].kind" \"import\" + // @is - "$.index[*][?(@.inner.source=='l3::L4')].inner.glob" false pub use l3::L4; } diff --git a/src/test/rustdoc-json/reexport/rename_public.rs b/src/test/rustdoc-json/reexport/rename_public.rs index 8c2d7200d0c01..2dd438d223058 100644 --- a/src/test/rustdoc-json/reexport/rename_public.rs +++ b/src/test/rustdoc-json/reexport/rename_public.rs @@ -13,5 +13,5 @@ pub mod inner { // @set import_id = - "$.index[*][?(@.inner.name=='NewName')].id" // @!has - "$.index[*][?(@.inner.name=='Public')]" // @has - "$.index[*][?(@.name=='rename_public')].inner.items[*]" $import_id -// @is - "$.index[*][?(@.inner.name=='NewName')].inner.span" \"inner::Public\" +// @is - "$.index[*][?(@.inner.name=='NewName')].inner.source" \"inner::Public\" pub use inner::Public as NewName; diff --git a/src/test/rustdoc-json/reexport/simple_public.rs b/src/test/rustdoc-json/reexport/simple_public.rs index 0c97a2e7b40a2..2e4de301f6f11 100644 --- a/src/test/rustdoc-json/reexport/simple_public.rs +++ b/src/test/rustdoc-json/reexport/simple_public.rs @@ -14,5 +14,5 @@ pub mod inner { // @set import_id = - "$.index[*][?(@.inner.name=='Public')].id" // @has - "$.index[*][?(@.name=='simple_public')].inner.items[*]" $import_id -// @is - "$.index[*][?(@.inner.name=='Public')].inner.span" \"inner::Public\" +// @is - "$.index[*][?(@.inner.name=='Public')].inner.source" \"inner::Public\" pub use inner::Public;