@@ -159,9 +159,7 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
159
159
use TokenTree :: Delimited as Del ;
160
160
use TokenTree :: Token as Tok ;
161
161
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.
165
163
match ( tt1, tt2) {
166
164
// No space after line doc comments.
167
165
( Tok ( Token { kind : DocComment ( CommentKind :: Line , ..) , .. } , _) , _) => false ,
@@ -173,10 +171,24 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
173
171
// ANYTHING + `,`: `foo,`
174
172
// ANYTHING + `;`: `x = 3;`, `[T; 3]`
175
173
// 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 ,
177
189
178
190
// 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`
180
192
( Tok ( Token { kind : Ident ( sym, is_raw) , span } , _) , Del ( _, Parenthesis , _) )
181
193
if !Ident :: new ( * sym, * span) . is_reserved ( )
182
194
|| * sym == kw:: Fn
@@ -187,8 +199,45 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
187
199
false
188
200
}
189
201
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 ,
192
241
193
242
// `#` + `!`: `#![attr]`
194
243
( Tok ( Token { kind : Pound , .. } , _) , Tok ( Token { kind : Not , .. } , _) ) => false ,
@@ -200,6 +249,20 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
200
249
false
201
250
}
202
251
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
+
203
266
_ => true ,
204
267
}
205
268
}
0 commit comments