Skip to content

Commit

Permalink
Handle dyn* syntax when rewriting ast::TyKind::TraitObject
Browse files Browse the repository at this point in the history
Resolves 5542

Prior to rust-lang/rust#101212 the `ast::TraitObjectSyntax` enum only
had two variants `Dyn` and `None`. The PR that introduced the `dyn*`
syntax added a new variant `DynStar`, but did not update the formatting
rules to account for the new variant.

Now the new `DynStar` variant is properly handled and is no longer
removed by rustfmt.
  • Loading branch information
ytmimi authored and calebcartwright committed Jul 28, 2023
1 parent a9ae746 commit cdfa2f8
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
14 changes: 6 additions & 8 deletions src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -683,21 +683,19 @@ impl Rewrite for ast::Ty {
match self.kind {
ast::TyKind::TraitObject(ref bounds, tobj_syntax) => {
// we have to consider 'dyn' keyword is used or not!!!
let is_dyn = tobj_syntax == ast::TraitObjectSyntax::Dyn;
// 4 is length of 'dyn '
let shape = if is_dyn { shape.offset_left(4)? } else { shape };
let (shape, prefix) = match tobj_syntax {
ast::TraitObjectSyntax::Dyn => (shape.offset_left(4)?, "dyn "),
ast::TraitObjectSyntax::DynStar => (shape.offset_left(5)?, "dyn* "),
ast::TraitObjectSyntax::None => (shape, ""),
};
let mut res = bounds.rewrite(context, shape)?;
// We may have falsely removed a trailing `+` inside macro call.
if context.inside_macro() && bounds.len() == 1 {
if context.snippet(self.span).ends_with('+') && !res.ends_with('+') {
res.push('+');
}
}
if is_dyn {
Some(format!("dyn {}", res))
} else {
Some(res)
}
Some(format!("{}{}", prefix, res))
}
ast::TyKind::Ptr(ref mt) => {
let prefix = match mt.mutbl {
Expand Down
10 changes: 10 additions & 0 deletions tests/target/issue_5542.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![feature(dyn_star)]
#![allow(incomplete_features)]

use core::fmt::Debug;

fn main() {
let i = 42;
let dyn_i = i as dyn* Debug;
dbg!(dyn_i);
}

0 comments on commit cdfa2f8

Please sign in to comment.