Rollup merge of #110983 - GuillaumeGomez:foreign-repr, r=notriddle
rustdoc: Get `repr` information through `AdtDef` for foreign items As suggested by `@notriddle,` this approach works too. The only downside is that the display of the original attribute isn't kept, but I think it's an acceptable downside. r? `@notriddle`
This commit is contained in:
commit
549b3a13a1
8 changed files with 136 additions and 54 deletions
|
@ -48,7 +48,6 @@ use std::str;
|
|||
use std::string::ToString;
|
||||
|
||||
use askama::Template;
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_attr::{ConstStability, Deprecation, StabilityLevel};
|
||||
use rustc_data_structures::captures::Captures;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
|
@ -849,10 +848,10 @@ fn assoc_method(
|
|||
let (indent, indent_str, end_newline) = if parent == ItemType::Trait {
|
||||
header_len += 4;
|
||||
let indent_str = " ";
|
||||
write!(w, "{}", render_attributes_in_pre(meth, indent_str));
|
||||
write!(w, "{}", render_attributes_in_pre(meth, indent_str, tcx));
|
||||
(4, indent_str, Ending::NoNewline)
|
||||
} else {
|
||||
render_attributes_in_code(w, meth);
|
||||
render_attributes_in_code(w, meth, tcx);
|
||||
(0, "", Ending::Newline)
|
||||
};
|
||||
w.reserve(header_len + "<a href=\"\" class=\"fn\">{".len() + "</a>".len());
|
||||
|
@ -1021,36 +1020,15 @@ fn render_assoc_item(
|
|||
}
|
||||
}
|
||||
|
||||
const ALLOWED_ATTRIBUTES: &[Symbol] =
|
||||
&[sym::export_name, sym::link_section, sym::no_mangle, sym::repr, sym::non_exhaustive];
|
||||
|
||||
fn attributes(it: &clean::Item) -> Vec<String> {
|
||||
it.attrs
|
||||
.other_attrs
|
||||
.iter()
|
||||
.filter_map(|attr| {
|
||||
if ALLOWED_ATTRIBUTES.contains(&attr.name_or_empty()) {
|
||||
Some(
|
||||
pprust::attribute_to_string(attr)
|
||||
.replace("\\\n", "")
|
||||
.replace('\n', "")
|
||||
.replace(" ", " "),
|
||||
)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
// When an attribute is rendered inside a `<pre>` tag, it is formatted using
|
||||
// a whitespace prefix and newline.
|
||||
fn render_attributes_in_pre<'a>(
|
||||
fn render_attributes_in_pre<'a, 'b: 'a>(
|
||||
it: &'a clean::Item,
|
||||
prefix: &'a str,
|
||||
) -> impl fmt::Display + Captures<'a> {
|
||||
tcx: TyCtxt<'b>,
|
||||
) -> impl fmt::Display + Captures<'a> + Captures<'b> {
|
||||
crate::html::format::display_fn(move |f| {
|
||||
for a in attributes(it) {
|
||||
for a in it.attributes(tcx, false) {
|
||||
writeln!(f, "{}{}", prefix, a)?;
|
||||
}
|
||||
Ok(())
|
||||
|
@ -1059,8 +1037,8 @@ fn render_attributes_in_pre<'a>(
|
|||
|
||||
// When an attribute is rendered inside a <code> tag, it is formatted using
|
||||
// a div to produce a newline after it.
|
||||
fn render_attributes_in_code(w: &mut Buffer, it: &clean::Item) {
|
||||
for a in attributes(it) {
|
||||
fn render_attributes_in_code(w: &mut Buffer, it: &clean::Item, tcx: TyCtxt<'_>) {
|
||||
for a in it.attributes(tcx, false) {
|
||||
write!(w, "<div class=\"code-attribute\">{}</div>", a);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue