Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 57 additions & 1 deletion compiler/rustc_hir/src/attrs/data_structures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ pub struct CfgHideShow {
pub values: ThinVec<CfgInfo>,
}

#[derive(Clone, Debug, Default, HashStable_Generic, Encodable, Decodable, PrintAttribute)]
#[derive(Clone, Debug, Default, HashStable_Generic, Decodable, PrintAttribute)]
pub struct DocAttribute {
pub aliases: FxIndexMap<Symbol, Span>,
pub hidden: Option<Span>,
Expand Down Expand Up @@ -566,6 +566,62 @@ pub struct DocAttribute {
pub no_crate_inject: Option<Span>,
}

impl<E: rustc_span::SpanEncoder> rustc_serialize::Encodable<E> for DocAttribute {
fn encode(&self, encoder: &mut E) {
let DocAttribute {
aliases,
hidden,
inline,
cfg,
auto_cfg,
auto_cfg_change,
fake_variadic,
keyword,
attribute,
masked,
notable_trait,
search_unbox,
html_favicon_url,
html_logo_url,
html_playground_url,
html_root_url,
html_no_source,
issue_tracker_base_url,
rust_logo,
test_attrs,
no_crate_inject,
} = self;
rustc_serialize::Encodable::<E>::encode(aliases, encoder);
rustc_serialize::Encodable::<E>::encode(hidden, encoder);

// FIXME: The `doc(inline)` attribute is never encoded, but is it actually the right thing
// to do? I suspect the condition was broken, should maybe instead not encode anything if we
// have `doc(no_inline)`.
let inline: ThinVec<_> =
inline.iter().filter(|(i, _)| *i != DocInline::Inline).cloned().collect();
rustc_serialize::Encodable::<E>::encode(&inline, encoder);

rustc_serialize::Encodable::<E>::encode(cfg, encoder);
rustc_serialize::Encodable::<E>::encode(auto_cfg, encoder);
rustc_serialize::Encodable::<E>::encode(auto_cfg_change, encoder);
rustc_serialize::Encodable::<E>::encode(fake_variadic, encoder);
rustc_serialize::Encodable::<E>::encode(keyword, encoder);
rustc_serialize::Encodable::<E>::encode(attribute, encoder);
rustc_serialize::Encodable::<E>::encode(masked, encoder);
rustc_serialize::Encodable::<E>::encode(notable_trait, encoder);
rustc_serialize::Encodable::<E>::encode(search_unbox, encoder);
rustc_serialize::Encodable::<E>::encode(html_favicon_url, encoder);
rustc_serialize::Encodable::<E>::encode(html_logo_url, encoder);
rustc_serialize::Encodable::<E>::encode(html_playground_url, encoder);
rustc_serialize::Encodable::<E>::encode(html_root_url, encoder);
rustc_serialize::Encodable::<E>::encode(html_no_source, encoder);
rustc_serialize::Encodable::<E>::encode(issue_tracker_base_url, encoder);
rustc_serialize::Encodable::<E>::encode(rust_logo, encoder);
rustc_serialize::Encodable::<E>::encode(test_attrs, encoder);
rustc_serialize::Encodable::<E>::encode(no_crate_inject, encoder);
}
}

/// Represents parsed *built-in* inert attributes.
///
/// ## Overview
Expand Down
10 changes: 3 additions & 7 deletions compiler/rustc_metadata/src/rmeta/encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -879,13 +879,9 @@ fn analyze_attr(attr: &hir::Attribute, state: &mut AnalyzeAttrState<'_>) -> bool
should_encode = true;
}
} else if let hir::Attribute::Parsed(AttributeKind::Doc(d)) = attr {
// If this is a `doc` attribute that doesn't have anything except maybe `inline` (as in
// `#[doc(inline)]`), then we can remove it. It won't be inlinable in downstream crates.
if d.inline.is_empty() {
should_encode = true;
if d.hidden.is_some() {
state.is_doc_hidden = true;
}
should_encode = true;
if d.hidden.is_some() {
state.is_doc_hidden = true;
}
} else if let &[sym::diagnostic, seg] = &*attr.path() {
should_encode = rustc_feature::is_stable_diagnostic_attribute(seg, state.features);
Expand Down
Loading