diff options
| author | Joshua Nelson <jyn514@gmail.com> | 2020-12-11 23:57:18 -0500 |
|---|---|---|
| committer | Joshua Nelson <jyn514@gmail.com> | 2020-12-12 00:01:25 -0500 |
| commit | 0e574fb39ad99a7ffbfd7f2d52603d890dfa2084 (patch) | |
| tree | 820a946f9ef690da8c77a0181506482301337a47 /src | |
| parent | 4fa95b3a078f261267293f3308dd62889167c0bd (diff) | |
| download | rust-0e574fb39ad99a7ffbfd7f2d52603d890dfa2084.tar.gz rust-0e574fb39ad99a7ffbfd7f2d52603d890dfa2084.zip | |
Fix the JSON backend
This was simpler than expected.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustdoc/json/conversions.rs | 42 | ||||
| -rw-r--r-- | src/librustdoc/json/mod.rs | 6 |
2 files changed, 25 insertions, 23 deletions
diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index 9ae0a16ac35..c463481db86 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -6,14 +6,16 @@ use std::convert::From; use rustc_ast::ast; use rustc_span::def_id::{DefId, CRATE_DEF_INDEX}; +use rustc_span::Pos; use crate::clean; use crate::doctree; use crate::formats::item_type::ItemType; use crate::json::types::*; +use crate::json::JsonRenderer; -impl From<clean::Item> for Option<Item> { - fn from(item: clean::Item) -> Self { +impl JsonRenderer { + pub(super) fn convert_item(&self, item: clean::Item) -> Option<Item> { let item_type = ItemType::from(&item); let clean::Item { source, @@ -32,7 +34,7 @@ impl From<clean::Item> for Option<Item> { id: def_id.into(), crate_id: def_id.krate.as_u32(), name, - source: source.into(), + source: self.convert_span(source), visibility: visibility.into(), docs: attrs.collapsed_doc_value().unwrap_or_default(), links: attrs @@ -53,25 +55,23 @@ impl From<clean::Item> for Option<Item> { }), } } -} -impl From<clean::Span> for Option<Span> { - #[allow(unreachable_code)] - fn from(span: clean::Span) -> Self { - // TODO: this should actually work - // Unfortunately this requires rethinking the whole framework, - // since this now needs a context and not just .into(). - match span.filename(todo!()) { - rustc_span::FileName::Real(name) => Some(Span { - filename: match name { - rustc_span::RealFileName::Named(path) => path, - rustc_span::RealFileName::Devirtualized { local_path, virtual_name: _ } => { - local_path - } - }, - begin: todo!(), - end: todo!(), - }), + fn convert_span(&self, span: clean::Span) -> Option<Span> { + match span.filename(&self.sess) { + rustc_span::FileName::Real(name) => { + let hi = span.hi(&self.sess); + let lo = span.lo(&self.sess); + Some(Span { + filename: match name { + rustc_span::RealFileName::Named(path) => path, + rustc_span::RealFileName::Devirtualized { local_path, virtual_name: _ } => { + local_path + } + }, + begin: (lo.line, lo.col.to_usize()), + end: (hi.line, hi.col.to_usize()), + }) + } _ => None, } } diff --git a/src/librustdoc/json/mod.rs b/src/librustdoc/json/mod.rs index 884c4c72533..5c5239d1b6a 100644 --- a/src/librustdoc/json/mod.rs +++ b/src/librustdoc/json/mod.rs @@ -26,6 +26,7 @@ use crate::html::render::cache::ExternalLocation; #[derive(Clone)] crate struct JsonRenderer { + sess: Lrc<Session>, /// A mapping of IDs that contains all local items for this crate which gets output as a top /// level field of the JSON blob. index: Rc<RefCell<FxHashMap<types::Id, types::Item>>>, @@ -126,11 +127,12 @@ impl FormatRenderer for JsonRenderer { _render_info: RenderInfo, _edition: Edition, _cache: &mut Cache, - _sess: Lrc<Session>, + sess: Lrc<Session>, ) -> Result<(Self, clean::Crate), Error> { debug!("Initializing json renderer"); Ok(( JsonRenderer { + sess, index: Rc::new(RefCell::new(FxHashMap::default())), out_path: options.output, }, @@ -146,7 +148,7 @@ impl FormatRenderer for JsonRenderer { item.kind.inner_items().for_each(|i| self.item(i.clone(), cache).unwrap()); let id = item.def_id; - if let Some(mut new_item) = item.into(): Option<types::Item> { + if let Some(mut new_item) = self.convert_item(item) { if let types::ItemEnum::TraitItem(ref mut t) = new_item.inner { t.implementors = self.get_trait_implementors(id, cache) } else if let types::ItemEnum::StructItem(ref mut s) = new_item.inner { |
