Fix the JSON backend
This was simpler than expected.
This commit is contained in:
parent
4fa95b3a07
commit
0e574fb39a
2 changed files with 25 additions and 23 deletions
|
@ -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 {
|
||||
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: todo!(),
|
||||
end: todo!(),
|
||||
}),
|
||||
begin: (lo.line, lo.col.to_usize()),
|
||||
end: (hi.line, hi.col.to_usize()),
|
||||
})
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue