From 94beec5aabae2f3093ae2814e998694263929b32 Mon Sep 17 00:00:00 2001 From: Yacin Tmimi Date: Fri, 30 Sep 2022 12:41:44 -0400 Subject: [PATCH] Handle `dyn*` syntax when rewriting `ast::TyKind::TraitObject` 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. --- src/types.rs | 14 ++++++-------- tests/target/issue_5542.rs | 10 ++++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 tests/target/issue_5542.rs diff --git a/src/types.rs b/src/types.rs index bb236a386e4..aef85598f06 100644 --- a/src/types.rs +++ b/src/types.rs @@ -683,9 +683,11 @@ 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 { @@ -693,11 +695,7 @@ impl Rewrite for ast::Ty { 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 { diff --git a/tests/target/issue_5542.rs b/tests/target/issue_5542.rs new file mode 100644 index 00000000000..730bb7b681a --- /dev/null +++ b/tests/target/issue_5542.rs @@ -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); +}