@@ -159,9 +159,7 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
159159 use TokenTree :: Delimited as Del ;
160160 use TokenTree :: Token as Tok ;
161161
162- // Each match arm has one or more examples in comments. The default is to
163- // insert space between adjacent tokens, except for the cases listed in
164- // this match.
162+ // Each match arm has one or more examples in comments.
165163 match ( tt1, tt2) {
166164 // No space after line doc comments.
167165 ( Tok ( Token { kind : DocComment ( CommentKind :: Line , ..) , .. } , _) , _) => false ,
@@ -173,10 +171,24 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
173171 // ANYTHING + `,`: `foo,`
174172 // ANYTHING + `;`: `x = 3;`, `[T; 3]`
175173 // ANYTHING + `.`: `x.y`, `tup.0`
176- ( _, Tok ( Token { kind : Comma | Semi | Dot , .. } , _) ) => false ,
174+ // ANYTHING + `:`: `'a: loop { ... }`, `x: u8`, `where T: U`,
175+ // `<Self as T>::x`, `Trait<'a>: Sized`, `X<Y<Z>>: Send`,
176+ // `let (a, b): (u32, u32);`
177+ ( _, Tok ( Token { kind : Comma | Semi | Dot | Colon , .. } , _) ) => false ,
178+
179+ // ANYTHING-BUT-`,`|`:`|`mut`|`<` + `[`: `<expr>[1]`, `vec![]`, `#[attr]`,
180+ // `#![attr]`, but not `data: [T; 0]`, `f(a, [])`, `&mut [T]`,
181+ // `NonNull< [T] >`
182+ ( Tok ( Token { kind : Comma | Colon | Lt , .. } , _) , Del ( _, Bracket , _) ) => true ,
183+ ( Tok ( Token { kind : Ident ( sym, is_raw) , .. } , _) , Del ( _, Bracket , _) )
184+ if * sym == kw:: Mut && !is_raw =>
185+ {
186+ true
187+ }
188+ ( Tok ( _, _) , Del ( _, Bracket , _) ) => false ,
177189
178190 // IDENT|`fn`|`Self`|`pub` + `(`: `f(3)`, `fn(x: u8)`, `Self()`, `pub(crate)`,
179- // but `let (a, b) = (1, 2)` needs a space after the `let`
191+ // but `let (a, b) = (1, 2)` needs a space after the `let`
180192 ( Tok ( Token { kind : Ident ( sym, is_raw) , span } , _) , Del ( _, Parenthesis , _) )
181193 if !Ident :: new ( * sym, * span) . is_reserved ( )
182194 || * sym == kw:: Fn
@@ -187,8 +199,45 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
187199 false
188200 }
189201
190- // `#` + `[`: `#[attr]`
191- ( Tok ( Token { kind : Pound , .. } , _) , Del ( _, Bracket , _) ) => false ,
202+ // IDENT|`self`|`Self`|`$crate`|`crate`|`super` + `::`: `x::y`,
203+ // `Self::a`, `$crate::x`, `crate::x`, `super::x`, but
204+ // `if ::a::b() { ... }` needs a space after the `if`.
205+ ( Tok ( Token { kind : Ident ( sym, is_raw) , span } , _) , Tok ( Token { kind : ModSep , .. } , _) )
206+ if !Ident :: new ( * sym, * span) . is_reserved ( )
207+ || * sym == kw:: SelfLower
208+ || * sym == kw:: SelfUpper
209+ || * sym == kw:: DollarCrate
210+ || * sym == kw:: Crate
211+ || * sym == kw:: Super
212+ || * is_raw =>
213+ {
214+ false
215+ }
216+
217+ // `>` + `::`: `<S as T>::x`
218+ // `>>` + `::`: `<S as T<'a>>::x`
219+ ( Tok ( Token { kind : Gt | BinOp ( Shr ) , .. } , _) , Tok ( Token { kind : ModSep , .. } , _) ) => false ,
220+
221+ // `::` + IDENT: `foo::bar`
222+ // `::` + `<`: `T::<u8>`
223+ // `::` + `*`: `use a::*`
224+ // `::` + `{`: `use a::{b, c}`
225+ (
226+ Tok ( Token { kind : ModSep , .. } , _) ,
227+ Tok ( Token { kind : Ident ( ..) | Lt | BinOp ( Star ) , .. } , _) | Del ( _, Brace , _) ,
228+ ) => false ,
229+
230+ // `impl` + `<`: `impl<T> Foo<T> { ... }`
231+ // `for` + `<`: `for<'a> fn()`
232+ ( Tok ( Token { kind : Ident ( sym, is_raw) , .. } , _) , Tok ( Token { kind : Lt , .. } , _) )
233+ if ( * sym == kw:: Impl || * sym == kw:: For ) && !is_raw =>
234+ {
235+ false
236+ }
237+
238+ // `>` + `(`: `f::<u8>()`
239+ // `>>` + `(`: `collect::<Vec<_>>()`
240+ ( Tok ( Token { kind : Gt | BinOp ( Shr ) , .. } , _) , Del ( _, Parenthesis , _) ) => false ,
192241
193242 // `#` + `!`: `#![attr]`
194243 ( Tok ( Token { kind : Pound , .. } , _) , Tok ( Token { kind : Not , .. } , _) ) => false ,
@@ -200,6 +249,20 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
200249 false
201250 }
202251
252+ // `~` + `const`: `impl ~const Clone`
253+ ( Tok ( Token { kind : Tilde , .. } , _) , Tok ( Token { kind : Ident ( sym, is_raw) , .. } , _) )
254+ if * sym == kw:: Const && !is_raw =>
255+ {
256+ false
257+ }
258+
259+ // `?` + `Sized`: `dyn ?Sized`
260+ ( Tok ( Token { kind : Question , .. } , _) , Tok ( Token { kind : Ident ( sym, is_raw) , .. } , _) )
261+ if * sym == sym:: Sized && !is_raw =>
262+ {
263+ false
264+ }
265+
203266 _ => true ,
204267 }
205268}
0 commit comments