提交 0e574fb3 编写于 作者: J Joshua Nelson

Fix the JSON backend

This was simpler than expected.
上级 4fa95b3a
......@@ -6,14 +6,16 @@
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 @@ fn from(item: clean::Item) -> Self {
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 @@ fn from(item: clean::Item) -> Self {
}),
}
}
}
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,
}
}
......
......@@ -26,6 +26,7 @@
#[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 @@ fn init(
_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 @@ fn item(&mut self, item: clean::Item, cache: &Cache) -> Result<(), Error> {
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 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册