1
Fork 0

Fix the JSON backend

This was simpler than expected.
This commit is contained in:
Joshua Nelson 2020-12-11 23:57:18 -05:00
parent 4fa95b3a07
commit 0e574fb39a
2 changed files with 25 additions and 23 deletions

View file

@ -6,14 +6,16 @@ use std::convert::From;
use rustc_ast::ast; use rustc_ast::ast;
use rustc_span::def_id::{DefId, CRATE_DEF_INDEX}; use rustc_span::def_id::{DefId, CRATE_DEF_INDEX};
use rustc_span::Pos;
use crate::clean; use crate::clean;
use crate::doctree; use crate::doctree;
use crate::formats::item_type::ItemType; use crate::formats::item_type::ItemType;
use crate::json::types::*; use crate::json::types::*;
use crate::json::JsonRenderer;
impl From<clean::Item> for Option<Item> { impl JsonRenderer {
fn from(item: clean::Item) -> Self { pub(super) fn convert_item(&self, item: clean::Item) -> Option<Item> {
let item_type = ItemType::from(&item); let item_type = ItemType::from(&item);
let clean::Item { let clean::Item {
source, source,
@ -32,7 +34,7 @@ impl From<clean::Item> for Option<Item> {
id: def_id.into(), id: def_id.into(),
crate_id: def_id.krate.as_u32(), crate_id: def_id.krate.as_u32(),
name, name,
source: source.into(), source: self.convert_span(source),
visibility: visibility.into(), visibility: visibility.into(),
docs: attrs.collapsed_doc_value().unwrap_or_default(), docs: attrs.collapsed_doc_value().unwrap_or_default(),
links: attrs links: attrs
@ -53,25 +55,23 @@ impl From<clean::Item> for Option<Item> {
}), }),
} }
} }
}
impl From<clean::Span> for Option<Span> { fn convert_span(&self, span: clean::Span) -> Option<Span> {
#[allow(unreachable_code)] match span.filename(&self.sess) {
fn from(span: clean::Span) -> Self { rustc_span::FileName::Real(name) => {
// TODO: this should actually work let hi = span.hi(&self.sess);
// Unfortunately this requires rethinking the whole framework, let lo = span.lo(&self.sess);
// since this now needs a context and not just .into(). Some(Span {
match span.filename(todo!()) {
rustc_span::FileName::Real(name) => Some(Span {
filename: match name { filename: match name {
rustc_span::RealFileName::Named(path) => path, rustc_span::RealFileName::Named(path) => path,
rustc_span::RealFileName::Devirtualized { local_path, virtual_name: _ } => { rustc_span::RealFileName::Devirtualized { local_path, virtual_name: _ } => {
local_path local_path
} }
}, },
begin: todo!(), begin: (lo.line, lo.col.to_usize()),
end: todo!(), end: (hi.line, hi.col.to_usize()),
}), })
}
_ => None, _ => None,
} }
} }

View file

@ -26,6 +26,7 @@ use crate::html::render::cache::ExternalLocation;
#[derive(Clone)] #[derive(Clone)]
crate struct JsonRenderer { crate struct JsonRenderer {
sess: Lrc<Session>,
/// A mapping of IDs that contains all local items for this crate which gets output as a top /// A mapping of IDs that contains all local items for this crate which gets output as a top
/// level field of the JSON blob. /// level field of the JSON blob.
index: Rc<RefCell<FxHashMap<types::Id, types::Item>>>, index: Rc<RefCell<FxHashMap<types::Id, types::Item>>>,
@ -126,11 +127,12 @@ impl FormatRenderer for JsonRenderer {
_render_info: RenderInfo, _render_info: RenderInfo,
_edition: Edition, _edition: Edition,
_cache: &mut Cache, _cache: &mut Cache,
_sess: Lrc<Session>, sess: Lrc<Session>,
) -> Result<(Self, clean::Crate), Error> { ) -> Result<(Self, clean::Crate), Error> {
debug!("Initializing json renderer"); debug!("Initializing json renderer");
Ok(( Ok((
JsonRenderer { JsonRenderer {
sess,
index: Rc::new(RefCell::new(FxHashMap::default())), index: Rc::new(RefCell::new(FxHashMap::default())),
out_path: options.output, 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()); item.kind.inner_items().for_each(|i| self.item(i.clone(), cache).unwrap());
let id = item.def_id; 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 { if let types::ItemEnum::TraitItem(ref mut t) = new_item.inner {
t.implementors = self.get_trait_implementors(id, cache) t.implementors = self.get_trait_implementors(id, cache)
} else if let types::ItemEnum::StructItem(ref mut s) = new_item.inner { } else if let types::ItemEnum::StructItem(ref mut s) = new_item.inner {