Skip to content

Commit 5c91a70

Browse files
Correctly encode doc attribute metadata
1 parent 52fda2e commit 5c91a70

File tree

2 files changed

+59
-8
lines changed

2 files changed

+59
-8
lines changed

compiler/rustc_hir/src/attrs/data_structures.rs

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ pub struct CfgHideShow {
530530
pub values: ThinVec<CfgInfo>,
531531
}
532532

533-
#[derive(Clone, Debug, Default, HashStable_Generic, Encodable, Decodable, PrintAttribute)]
533+
#[derive(Clone, Debug, Default, HashStable_Generic, Decodable, PrintAttribute)]
534534
pub struct DocAttribute {
535535
pub aliases: FxIndexMap<Symbol, Span>,
536536
pub hidden: Option<Span>,
@@ -566,6 +566,61 @@ pub struct DocAttribute {
566566
pub no_crate_inject: Option<Span>,
567567
}
568568

569+
impl<E: rustc_span::SpanEncoder> rustc_serialize::Encodable<E> for DocAttribute {
570+
fn encode(&self, encoder: &mut E) {
571+
let DocAttribute {
572+
aliases,
573+
hidden,
574+
inline,
575+
cfg,
576+
auto_cfg,
577+
auto_cfg_change,
578+
fake_variadic,
579+
keyword,
580+
attribute,
581+
masked,
582+
notable_trait,
583+
search_unbox,
584+
html_favicon_url,
585+
html_logo_url,
586+
html_playground_url,
587+
html_root_url,
588+
html_no_source,
589+
issue_tracker_base_url,
590+
rust_logo,
591+
test_attrs,
592+
no_crate_inject,
593+
} = self;
594+
rustc_serialize::Encodable::<E>::encode(aliases, encoder);
595+
rustc_serialize::Encodable::<E>::encode(hidden, encoder);
596+
597+
// FIXME: The `doc(inline)` attribute is never encoded, but is it actually the right thing
598+
// to do? I suspect the condition was broken, should maybe instead not encode anything if we
599+
// have `doc(no_inline)`.
600+
let inline = inline.iter().filter(|i| i != DocInline::Inline).cloned().collect();
601+
rustc_serialize::Encodable::<E>::encode(inline, encoder);
602+
603+
rustc_serialize::Encodable::<E>::encode(cfg, encoder);
604+
rustc_serialize::Encodable::<E>::encode(auto_cfg, encoder);
605+
rustc_serialize::Encodable::<E>::encode(auto_cfg_change, encoder);
606+
rustc_serialize::Encodable::<E>::encode(fake_variadic, encoder);
607+
rustc_serialize::Encodable::<E>::encode(keyword, encoder);
608+
rustc_serialize::Encodable::<E>::encode(attribute, encoder);
609+
rustc_serialize::Encodable::<E>::encode(masked, encoder);
610+
rustc_serialize::Encodable::<E>::encode(notable_trait, encoder);
611+
rustc_serialize::Encodable::<E>::encode(search_unbox, encoder);
612+
rustc_serialize::Encodable::<E>::encode(html_favicon_url, encoder);
613+
rustc_serialize::Encodable::<E>::encode(html_logo_url, encoder);
614+
rustc_serialize::Encodable::<E>::encode(html_playground_url, encoder);
615+
rustc_serialize::Encodable::<E>::encode(html_root_url, encoder);
616+
rustc_serialize::Encodable::<E>::encode(html_no_source, encoder);
617+
rustc_serialize::Encodable::<E>::encode(issue_tracker_base_url, encoder);
618+
rustc_serialize::Encodable::<E>::encode(rust_logo, encoder);
619+
rustc_serialize::Encodable::<E>::encode(test_attrs, encoder);
620+
rustc_serialize::Encodable::<E>::encode(no_crate_inject, encoder);
621+
}
622+
}
623+
569624
/// Represents parsed *built-in* inert attributes.
570625
///
571626
/// ## Overview

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -879,13 +879,9 @@ fn analyze_attr(attr: &hir::Attribute, state: &mut AnalyzeAttrState<'_>) -> bool
879879
should_encode = true;
880880
}
881881
} else if let hir::Attribute::Parsed(AttributeKind::Doc(d)) = attr {
882-
// If this is a `doc` attribute that doesn't have anything except maybe `inline` (as in
883-
// `#[doc(inline)]`), then we can remove it. It won't be inlinable in downstream crates.
884-
if d.inline.is_empty() {
885-
should_encode = true;
886-
if d.hidden.is_some() {
887-
state.is_doc_hidden = true;
888-
}
882+
should_encode = true;
883+
if d.hidden.is_some() {
884+
state.is_doc_hidden = true;
889885
}
890886
} else if let &[sym::diagnostic, seg] = &*attr.path() {
891887
should_encode = rustc_feature::is_stable_diagnostic_attribute(seg, state.features);

0 commit comments

Comments
 (0)