This commit is contained in:
Max Heller 2023-07-28 06:45:35 -04:00
parent 008b639ef5
commit 37a8493138
3 changed files with 46 additions and 12 deletions

View File

@ -16,7 +16,7 @@ pub(super) fn print_item_tree(db: &dyn ExpandDatabase, tree: &ItemTree) -> Strin
let mut p = Printer { db, tree, buf: String::new(), indent_level: 0, needs_indent: true }; let mut p = Printer { db, tree, buf: String::new(), indent_level: 0, needs_indent: true };
if let Some(attrs) = tree.attrs.get(&AttrOwner::TopLevel) { if let Some(attrs) = tree.attrs.get(&AttrOwner::TopLevel) {
p.print_attrs(attrs, true); p.print_attrs(attrs, true, "\n");
} }
p.blank(); p.blank();
@ -84,22 +84,23 @@ impl Printer<'_> {
} }
} }
fn print_attrs(&mut self, attrs: &RawAttrs, inner: bool) { fn print_attrs(&mut self, attrs: &RawAttrs, inner: bool, separated_by: &str) {
let inner = if inner { "!" } else { "" }; let inner = if inner { "!" } else { "" };
for attr in &**attrs { for attr in &**attrs {
wln!( w!(
self, self,
"#{}[{}{}]", "#{}[{}{}]{}",
inner, inner,
attr.path.display(self.db), attr.path.display(self.db),
attr.input.as_ref().map(|it| it.to_string()).unwrap_or_default(), attr.input.as_ref().map(|it| it.to_string()).unwrap_or_default(),
separated_by,
); );
} }
} }
fn print_attrs_of(&mut self, of: impl Into<AttrOwner>) { fn print_attrs_of(&mut self, of: impl Into<AttrOwner>, separated_by: &str) {
if let Some(attrs) = self.tree.attrs.get(&of.into()) { if let Some(attrs) = self.tree.attrs.get(&of.into()) {
self.print_attrs(attrs, false); self.print_attrs(attrs, false, separated_by);
} }
} }
@ -118,7 +119,7 @@ impl Printer<'_> {
self.indented(|this| { self.indented(|this| {
for field in fields.clone() { for field in fields.clone() {
let Field { visibility, name, type_ref, ast_id: _ } = &this.tree[field]; let Field { visibility, name, type_ref, ast_id: _ } = &this.tree[field];
this.print_attrs_of(field); this.print_attrs_of(field, "\n");
this.print_visibility(*visibility); this.print_visibility(*visibility);
w!(this, "{}: ", name.display(self.db)); w!(this, "{}: ", name.display(self.db));
this.print_type_ref(type_ref); this.print_type_ref(type_ref);
@ -132,7 +133,7 @@ impl Printer<'_> {
self.indented(|this| { self.indented(|this| {
for field in fields.clone() { for field in fields.clone() {
let Field { visibility, name, type_ref, ast_id: _ } = &this.tree[field]; let Field { visibility, name, type_ref, ast_id: _ } = &this.tree[field];
this.print_attrs_of(field); this.print_attrs_of(field, "\n");
this.print_visibility(*visibility); this.print_visibility(*visibility);
w!(this, "{}: ", name.display(self.db)); w!(this, "{}: ", name.display(self.db));
this.print_type_ref(type_ref); this.print_type_ref(type_ref);
@ -195,7 +196,7 @@ impl Printer<'_> {
} }
fn print_mod_item(&mut self, item: ModItem) { fn print_mod_item(&mut self, item: ModItem) {
self.print_attrs_of(item); self.print_attrs_of(item, "\n");
match item { match item {
ModItem::Import(it) => { ModItem::Import(it) => {
@ -261,7 +262,7 @@ impl Printer<'_> {
if !params.is_empty() { if !params.is_empty() {
self.indented(|this| { self.indented(|this| {
for param in params.clone() { for param in params.clone() {
this.print_attrs_of(param); this.print_attrs_of(param, "\n");
match &this.tree[param] { match &this.tree[param] {
Param::Normal(ty) => { Param::Normal(ty) => {
if flags.contains(FnFlags::HAS_SELF_PARAM) { if flags.contains(FnFlags::HAS_SELF_PARAM) {
@ -319,7 +320,7 @@ impl Printer<'_> {
self.indented(|this| { self.indented(|this| {
for variant in variants.clone() { for variant in variants.clone() {
let Variant { name, fields, ast_id: _ } = &this.tree[variant]; let Variant { name, fields, ast_id: _ } = &this.tree[variant];
this.print_attrs_of(variant); this.print_attrs_of(variant, "\n");
w!(this, "{}", name.display(self.db)); w!(this, "{}", name.display(self.db));
this.print_fields(fields); this.print_fields(fields);
wln!(this, ","); wln!(this, ",");
@ -484,11 +485,12 @@ impl Printer<'_> {
w!(self, "<"); w!(self, "<");
let mut first = true; let mut first = true;
for (_, lt) in params.lifetimes.iter() { for (idx, lt) in params.lifetimes.iter() {
if !first { if !first {
w!(self, ", "); w!(self, ", ");
} }
first = false; first = false;
self.print_attrs_of(idx, " ");
w!(self, "{}", lt.name.display(self.db)); w!(self, "{}", lt.name.display(self.db));
} }
for (idx, x) in params.type_or_consts.iter() { for (idx, x) in params.type_or_consts.iter() {
@ -496,6 +498,7 @@ impl Printer<'_> {
w!(self, ", "); w!(self, ", ");
} }
first = false; first = false;
self.print_attrs_of(idx, " ");
match x { match x {
TypeOrConstParamData::TypeParamData(ty) => match &ty.name { TypeOrConstParamData::TypeParamData(ty) => match &ty.name {
Some(name) => w!(self, "{}", name.display(self.db)), Some(name) => w!(self, "{}", name.display(self.db)),

View File

@ -358,3 +358,15 @@ trait Tr<'a, T: 'a>: Super where Self: for<'a> Tr<'a, T> {}
"#]], "#]],
) )
} }
#[test]
fn generics_with_attributes() {
check(
r#"
struct S<#[cfg(never)] T>;
"#,
expect![[r#"
pub(self) struct S<#[cfg(never)] T>;
"#]],
)
}

View File

@ -6451,3 +6451,22 @@ fn test() {
"#]], "#]],
); );
} }
#[test]
fn generic_params_disabled_by_cfg() {
check(
r#"
struct S<#[cfg(never)] T>;
fn test() {
let s$0: S = S;
}
"#,
expect![[r#"
*s*
```rust
let s: S // size = 0, align = 1
```
"#]],
);
}