Skip to content

Commit 06f558f

Browse files
committed
Use FromClean for Item, part 2.
1 parent 8972f38 commit 06f558f

File tree

2 files changed

+61
-58
lines changed

2 files changed

+61
-58
lines changed

src/librustdoc/json/conversions.rs

Lines changed: 60 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -22,61 +22,6 @@ use crate::json::JsonRenderer;
2222
use crate::passes::collect_intra_doc_links::UrlFragment;
2323

2424
impl JsonRenderer<'_> {
25-
pub(super) fn convert_item(&self, item: &clean::Item) -> Option<Item> {
26-
let deprecation = item.deprecation(self.tcx);
27-
let links = self
28-
.cache
29-
.intra_doc_links
30-
.get(&item.item_id)
31-
.into_iter()
32-
.flatten()
33-
.map(|clean::ItemLink { link, page_id, fragment, .. }| {
34-
let id = match fragment {
35-
Some(UrlFragment::Item(frag_id)) => *frag_id,
36-
// FIXME: Pass the `UserWritten` segment to JSON consumer.
37-
Some(UrlFragment::UserWritten(_)) | None => *page_id,
38-
};
39-
40-
(String::from(&**link), self.id_from_item_default(id.into()))
41-
})
42-
.collect();
43-
let docs = item.opt_doc_value();
44-
let attrs = item.attributes_and_repr(self.tcx, self.cache(), true);
45-
let span = item.span(self.tcx);
46-
let visibility = item.visibility(self.tcx);
47-
let clean::ItemInner { name, item_id, .. } = *item.inner;
48-
let id = self.id_from_item(&item);
49-
let inner = match item.kind {
50-
clean::KeywordItem => return None,
51-
clean::StrippedItem(ref inner) => {
52-
match &**inner {
53-
// We document stripped modules as with `Module::is_stripped` set to
54-
// `true`, to prevent contained items from being orphaned for downstream users,
55-
// as JSON does no inlining.
56-
clean::ModuleItem(_)
57-
if self.imported_items.contains(&item_id.expect_def_id()) =>
58-
{
59-
item.into_json(self)
60-
}
61-
_ => return None,
62-
}
63-
}
64-
_ => item.into_json(self),
65-
};
66-
Some(Item {
67-
id,
68-
crate_id: item_id.krate().as_u32(),
69-
name: name.map(|sym| sym.to_string()),
70-
span: span.and_then(|span| span.into_json(self)),
71-
visibility: visibility.into_json(self),
72-
docs,
73-
attrs,
74-
deprecation: deprecation.into_json(self),
75-
inner,
76-
links,
77-
})
78-
}
79-
8025
fn ids(&self, items: &[clean::Item]) -> Vec<Id> {
8126
items
8227
.iter()
@@ -146,6 +91,63 @@ where
14691
}
14792
}
14893

94+
impl FromClean<clean::Item> for Option<Item> {
95+
fn from_clean(item: &clean::Item, renderer: &JsonRenderer<'_>) -> Self {
96+
let deprecation = item.deprecation(renderer.tcx);
97+
let links = renderer
98+
.cache
99+
.intra_doc_links
100+
.get(&item.item_id)
101+
.into_iter()
102+
.flatten()
103+
.map(|clean::ItemLink { link, page_id, fragment, .. }| {
104+
let id = match fragment {
105+
Some(UrlFragment::Item(frag_id)) => *frag_id,
106+
// FIXME: Pass the `UserWritten` segment to JSON consumer.
107+
Some(UrlFragment::UserWritten(_)) | None => *page_id,
108+
};
109+
110+
(String::from(&**link), renderer.id_from_item_default(id.into()))
111+
})
112+
.collect();
113+
let docs = item.opt_doc_value();
114+
let attrs = item.attributes_and_repr(renderer.tcx, renderer.cache(), true);
115+
let span = item.span(renderer.tcx);
116+
let visibility = item.visibility(renderer.tcx);
117+
let clean::ItemInner { name, item_id, .. } = *item.inner;
118+
let id = renderer.id_from_item(&item);
119+
let inner = match item.kind {
120+
clean::KeywordItem => return None,
121+
clean::StrippedItem(ref inner) => {
122+
match &**inner {
123+
// We document stripped modules as with `Module::is_stripped` set to
124+
// `true`, to prevent contained items from being orphaned for downstream users,
125+
// as JSON does no inlining.
126+
clean::ModuleItem(_)
127+
if renderer.imported_items.contains(&item_id.expect_def_id()) =>
128+
{
129+
item.into_json(renderer)
130+
}
131+
_ => return None,
132+
}
133+
}
134+
_ => item.into_json(renderer),
135+
};
136+
Some(Item {
137+
id,
138+
crate_id: item_id.krate().as_u32(),
139+
name: name.map(|sym| sym.to_string()),
140+
span: span.and_then(|span| span.into_json(renderer)),
141+
visibility: visibility.into_json(renderer),
142+
docs,
143+
attrs,
144+
deprecation: deprecation.into_json(renderer),
145+
inner,
146+
links,
147+
})
148+
}
149+
}
150+
149151
impl FromClean<clean::Span> for Option<Span> {
150152
fn from_clean(span: &clean::Span, renderer: &JsonRenderer<'_>) -> Self {
151153
match span.filename(renderer.sess()) {
@@ -320,7 +322,7 @@ impl FromClean<clean::Item> for ItemEnum {
320322
bounds: b.into_json(renderer),
321323
type_: Some(t.item_type.as_ref().unwrap_or(&t.type_).into_json(renderer)),
322324
},
323-
// `convert_item` early returns `None` for stripped items and keywords.
325+
// `Option<Item>::into_json` early returns `None` for stripped items and keywords.
324326
KeywordItem => unreachable!(),
325327
StrippedItem(inner) => {
326328
match inner.as_ref() {
@@ -329,7 +331,8 @@ impl FromClean<clean::Item> for ItemEnum {
329331
items: renderer.ids(&m.items),
330332
is_stripped: true,
331333
}),
332-
// `convert_item` early returns `None` for stripped items we're not including
334+
// `Option<Item>::into_json` early returns `None` for stripped items we're not
335+
// including
333336
_ => unreachable!(),
334337
}
335338
}

src/librustdoc/json/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
234234
item.kind.inner_items().for_each(|i| self.item(i).unwrap());
235235

236236
let item_id = item.item_id;
237-
if let Some(mut new_item) = self.convert_item(item) {
237+
if let Some(mut new_item) = item.into_json(self) {
238238
let can_be_ignored = match new_item.inner {
239239
types::ItemEnum::Trait(ref mut t) => {
240240
t.implementations = self.get_trait_implementors(item_id.expect_def_id());

0 commit comments

Comments
 (0)