Skip to content

Commit

Permalink
Fix the JSON backend
Browse files Browse the repository at this point in the history
This was simpler than expected.
  • Loading branch information
jyn514 committed Dec 12, 2020
1 parent 4fa95b3 commit 0e574fb
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 23 deletions.
42 changes: 21 additions & 21 deletions src/librustdoc/json/conversions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -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,
}
}
Expand Down
6 changes: 4 additions & 2 deletions src/librustdoc/json/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>>>,
Expand Down Expand Up @@ -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,
},
Expand All @@ -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 {
Expand Down

0 comments on commit 0e574fb

Please sign in to comment.