Auto merge of #120227 - nnethercote:further-improve-space_between, r=petrochenkov
Further improve `space_between` `space_between` is used by `print_tts` to decide when spaces should be put between tokens. This PR improves it in two ways: - avoid unnecessary spaces before semicolons, and - don't omit some necessary spaces before/after some punctuation symbols. r? `@petrochenkov`
This commit is contained in:
commit
80deabd098
28 changed files with 100 additions and 107 deletions
|
@ -160,6 +160,10 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
|
|||
use TokenTree::Delimited as Del;
|
||||
use TokenTree::Token as Tok;
|
||||
|
||||
fn is_punct(tt: &TokenTree) -> bool {
|
||||
matches!(tt, TokenTree::Token(tok, _) if tok.is_punct())
|
||||
}
|
||||
|
||||
// Each match arm has one or more examples in comments. The default is to
|
||||
// insert space between adjacent tokens, except for the cases listed in
|
||||
// this match.
|
||||
|
@ -167,24 +171,35 @@ fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
|
|||
// No space after line doc comments.
|
||||
(Tok(Token { kind: DocComment(CommentKind::Line, ..), .. }, _), _) => false,
|
||||
|
||||
// `.` + ANYTHING: `x.y`, `tup.0`
|
||||
// `$` + ANYTHING: `$e`
|
||||
(Tok(Token { kind: Dot | Dollar, .. }, _), _) => false,
|
||||
// `.` + NON-PUNCT: `x.y`, `tup.0`
|
||||
(Tok(Token { kind: Dot, .. }, _), tt2) if !is_punct(tt2) => false,
|
||||
|
||||
// ANYTHING + `,`: `foo,`
|
||||
// ANYTHING + `.`: `x.y`, `tup.0`
|
||||
// ANYTHING + `!`: `foo! { ... }`
|
||||
//
|
||||
// FIXME: Incorrect cases:
|
||||
// - Logical not: `x =! y`, `if! x { f(); }`
|
||||
// - Never type: `Fn() ->!`
|
||||
(_, Tok(Token { kind: Comma | Dot | Not, .. }, _)) => false,
|
||||
// `$` + IDENT: `$e`
|
||||
(Tok(Token { kind: Dollar, .. }, _), Tok(Token { kind: Ident(..), .. }, _)) => false,
|
||||
|
||||
// IDENT + `(`: `f(3)`
|
||||
//
|
||||
// FIXME: Incorrect cases:
|
||||
// - Let: `let(a, b) = (1, 2)`
|
||||
(Tok(Token { kind: Ident(..), .. }, _), Del(_, _, Parenthesis, _)) => false,
|
||||
// NON-PUNCT + `,`: `foo,`
|
||||
// NON-PUNCT + `;`: `x = 3;`, `[T; 3]`
|
||||
// NON-PUNCT + `.`: `x.y`, `tup.0`
|
||||
(tt1, Tok(Token { kind: Comma | Semi | Dot, .. }, _)) if !is_punct(tt1) => false,
|
||||
|
||||
// IDENT + `!`: `println!()`, but `if !x { ... }` needs a space after the `if`
|
||||
(Tok(Token { kind: Ident(sym, is_raw), span }, _), Tok(Token { kind: Not, .. }, _))
|
||||
if !Ident::new(*sym, *span).is_reserved() || *is_raw =>
|
||||
{
|
||||
false
|
||||
}
|
||||
|
||||
// IDENT|`fn`|`Self`|`pub` + `(`: `f(3)`, `fn(x: u8)`, `Self()`, `pub(crate)`,
|
||||
// but `let (a, b) = (1, 2)` needs a space after the `let`
|
||||
(Tok(Token { kind: Ident(sym, is_raw), span }, _), Del(_, _, Parenthesis, _))
|
||||
if !Ident::new(*sym, *span).is_reserved()
|
||||
|| *sym == kw::Fn
|
||||
|| *sym == kw::SelfUpper
|
||||
|| *sym == kw::Pub
|
||||
|| *is_raw =>
|
||||
{
|
||||
false
|
||||
}
|
||||
|
||||
// `#` + `[`: `#[attr]`
|
||||
(Tok(Token { kind: Pound, .. }, _), Del(_, _, Bracket, _)) => false,
|
||||
|
|
|
@ -107,9 +107,9 @@ fn test_expr() {
|
|||
c1!(expr, [ true || false ], "true || false");
|
||||
c1!(expr, [ true || false && false ], "true || false && false");
|
||||
c1!(expr, [ a < 1 && 2 < b && c > 3 && 4 > d ], "a < 1 && 2 < b && c > 3 && 4 > d");
|
||||
c2!(expr, [ a & b & !c ], "a & b & !c", "a & b &!c"); // FIXME
|
||||
c1!(expr, [ a & b & !c ], "a & b & !c");
|
||||
c1!(expr, [ a + b * c - d + -1 * -2 - -3], "a + b * c - d + -1 * -2 - -3");
|
||||
c2!(expr, [ x = !y ], "x = !y", "x =!y"); // FIXME
|
||||
c1!(expr, [ x = !y ], "x = !y");
|
||||
|
||||
// ExprKind::Unary
|
||||
c1!(expr, [ *expr ], "*expr");
|
||||
|
@ -141,15 +141,14 @@ fn test_expr() {
|
|||
"if let _ = (true && false) {}",
|
||||
"if let _ = true && false {}",
|
||||
);
|
||||
c2!(expr,
|
||||
c1!(expr,
|
||||
[ match () { _ if let _ = Struct {} => {} } ],
|
||||
"match () { _ if let _ = Struct {} => {} }",
|
||||
"match() { _ if let _ = Struct {} => {} }",
|
||||
"match () { _ if let _ = Struct {} => {} }"
|
||||
);
|
||||
|
||||
// ExprKind::If
|
||||
c1!(expr, [ if true {} ], "if true {}");
|
||||
c2!(expr, [ if !true {} ], "if !true {}", "if!true {}"); // FIXME
|
||||
c1!(expr, [ if !true {} ], "if !true {}");
|
||||
c1!(expr, [ if ::std::blah() { } else { } ], "if ::std::blah() {} else {}");
|
||||
c1!(expr, [ if let true = true {} else {} ], "if let true = true {} else {}");
|
||||
c1!(expr,
|
||||
|
@ -655,11 +654,11 @@ fn test_stmt() {
|
|||
c2!(stmt, [ let _ ], "let _;", "let _");
|
||||
c2!(stmt, [ let x = true ], "let x = true;", "let x = true");
|
||||
c2!(stmt, [ let x: bool = true ], "let x: bool = true;", "let x: bool = true");
|
||||
c2!(stmt, [ let (a, b) = (1, 2) ], "let (a, b) = (1, 2);", "let(a, b) = (1, 2)"); // FIXME
|
||||
c2!(stmt, [ let (a, b) = (1, 2) ], "let (a, b) = (1, 2);", "let (a, b) = (1, 2)");
|
||||
c2!(stmt,
|
||||
[ let (a, b): (u32, u32) = (1, 2) ],
|
||||
"let (a, b): (u32, u32) = (1, 2);",
|
||||
"let(a, b): (u32, u32) = (1, 2)" // FIXME
|
||||
"let (a, b): (u32, u32) = (1, 2)"
|
||||
);
|
||||
macro_rules! c2_let_expr_minus_one {
|
||||
([ $expr:expr ], $stmt_expected:expr, $tokens_expected:expr $(,)?) => {
|
||||
|
@ -776,8 +775,8 @@ fn test_ty() {
|
|||
c1!(ty, [ Ref<'a> ], "Ref<'a>");
|
||||
c1!(ty, [ PhantomData<T> ], "PhantomData<T>");
|
||||
c2!(ty, [ PhantomData::<T> ], "PhantomData<T>", "PhantomData::<T>");
|
||||
c2!(ty, [ Fn() -> ! ], "Fn() -> !", "Fn() ->!");
|
||||
c2!(ty, [ Fn(u8) -> ! ], "Fn(u8) -> !", "Fn(u8) ->!"); // FIXME
|
||||
c1!(ty, [ Fn() -> ! ], "Fn() -> !");
|
||||
c1!(ty, [ Fn(u8) -> ! ], "Fn(u8) -> !");
|
||||
c1!(ty, [ <Struct as Trait>::Type ], "<Struct as Trait>::Type");
|
||||
|
||||
// TyKind::TraitObject
|
||||
|
@ -857,16 +856,16 @@ fn test_punct() {
|
|||
// Otherwise, any old proc macro that parses pretty-printed code might glue
|
||||
// together tokens that shouldn't be glued.
|
||||
p!([ = = < < <= <= == == != != >= >= > > ], "= = < < <= <= == == != != >= >= > >");
|
||||
p!([ && && & & || || | | ! ! ], "&& && & & || || | |!!"); // FIXME
|
||||
p!([ && && & & || || | | ! ! ], "&& && & & || || | | ! !");
|
||||
p!([ ~ ~ @ @ # # ], "~ ~ @ @ # #");
|
||||
p!([ . . .. .. ... ... ..= ..=], ".... .. ... ... ..= ..="); // FIXME
|
||||
p!([ , , ; ; : : :: :: ], ",, ; ; : : :: ::"); // FIXME
|
||||
p!([ . . .. .. ... ... ..= ..=], ". . .. .. ... ... ..= ..=");
|
||||
p!([ , , ; ; : : :: :: ], ", , ; ; : : :: ::");
|
||||
p!([ -> -> <- <- => =>], "-> -> <- <- => =>");
|
||||
p!([ $ $ ? ? ' ' ], "$$? ? ' '"); // FIXME
|
||||
p!([ $ $ ? ? ' ' ], "$ $ ? ? ' '");
|
||||
p!([ + + += += - - -= -= * * *= *= / / /= /= ], "+ + += += - - -= -= * * *= *= / / /= /=");
|
||||
p!([ % % %= %= ^ ^ ^= ^= << << <<= <<= >> >> >>= >>= ],
|
||||
"% % %= %= ^ ^ ^= ^= << << <<= <<= >> >> >>= >>=");
|
||||
p!([ +! ?= |> >>@ --> <-- $$ =====> ], "+! ?= |> >>@ --> <-- $$ =====>");
|
||||
p!([ ,; ;, ** @@ $+$ >< <> ?? +== ], ",; ;, ** @@ $+$>< <> ?? +=="); // FIXME: `$ >` -> `$>`
|
||||
p!([ ,; ;, ** @@ $+$ >< <> ?? +== ], ",; ;, ** @@ $+$ >< <> ?? +==");
|
||||
p!([ :#!@|$=&*,+;*~? ], ":#!@|$=&*,+;*~?");
|
||||
}
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
PRINT-ATTR INPUT (DISPLAY): struct ItemWithSemi;
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): struct ItemWithSemi ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -47,7 +46,6 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): #[expect_let] let string = "Hello, world!";
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): #[expect_let] let string = "Hello, world!" ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Punct {
|
||||
ch: '#',
|
||||
|
@ -293,7 +291,6 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): #[rustc_dummy] struct NonBracedStruct;
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): #[rustc_dummy] struct NonBracedStruct ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Punct {
|
||||
ch: '#',
|
||||
|
|
|
@ -30,7 +30,6 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): #[expect_let] let string = "Hello, world!";
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): #[expect_let] let string = "Hello, world!" ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Punct {
|
||||
ch: '#',
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
PRINT-BANG INPUT (DISPLAY): struct M($crate :: S);
|
||||
PRINT-BANG RE-COLLECTED (DISPLAY): struct M($crate :: S) ;
|
||||
PRINT-BANG INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -40,7 +39,6 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): struct A($crate :: S);
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): struct A($crate :: S) ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
PRINT-ATTR INPUT (DISPLAY): struct A(identity! ($crate :: S));
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): struct A(identity! ($crate :: S)) ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -55,7 +54,6 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): struct B(identity! ($crate :: S));
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): struct B(identity! ($crate :: S)) ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
PRINT-BANG INPUT (DISPLAY): struct M($crate :: S);
|
||||
PRINT-BANG RE-COLLECTED (DISPLAY): struct M($crate :: S) ;
|
||||
PRINT-BANG INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -40,7 +39,6 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): struct A($crate :: S);
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): struct A($crate :: S) ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -81,7 +79,6 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-DERIVE INPUT (DISPLAY): struct D($crate :: S);
|
||||
PRINT-DERIVE RE-COLLECTED (DISPLAY): struct D($crate :: S) ;
|
||||
PRINT-DERIVE INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -122,7 +119,6 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-BANG INPUT (DISPLAY): struct M($crate :: S);
|
||||
PRINT-BANG RE-COLLECTED (DISPLAY): struct M($crate :: S) ;
|
||||
PRINT-BANG INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -163,7 +159,6 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): struct A($crate :: S);
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): struct A($crate :: S) ;
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -204,7 +199,6 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-DERIVE INPUT (DISPLAY): struct D($crate :: S);
|
||||
PRINT-DERIVE RE-COLLECTED (DISPLAY): struct D($crate :: S) ;
|
||||
PRINT-DERIVE INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
|
|
@ -203,7 +203,6 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-DERIVE INPUT (DISPLAY): enum E { V = { let _ = { {} }; 0 }, }
|
||||
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { {} } ; 0 }, }
|
||||
PRINT-DERIVE INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "enum",
|
||||
|
|
|
@ -581,10 +581,7 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
|||
PRINT-DERIVE INPUT (DISPLAY): struct MyDerivePrint
|
||||
{ field: [u8; { match true { _ => { #![rustc_dummy(third)] true } }; 0 }] }
|
||||
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): struct MyDerivePrint
|
||||
{
|
||||
field :
|
||||
[u8 ; { match true { _ => { #! [rustc_dummy(third)] true } } ; 0 }]
|
||||
}
|
||||
{ field : [u8; { match true { _ => { #! [rustc_dummy(third)] true } }; 0 }] }
|
||||
PRINT-DERIVE INPUT (DEBUG): TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
|
@ -718,7 +715,6 @@ PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): (3, 4, { #![cfg_attr(not(FALSE), rustc_dummy(innermost))] 5 });
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): (3, 4, { #![cfg_attr(not(FALSE), rustc_dummy(innermost))] 5 }) ;
|
||||
PRINT-ATTR DEEP-RE-COLLECTED (DISPLAY): (3, 4, { #! [cfg_attr(not(FALSE), rustc_dummy(innermost))] 5 });
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Group {
|
||||
|
@ -834,7 +830,6 @@ PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
|
|||
},
|
||||
]
|
||||
PRINT-ATTR INPUT (DISPLAY): (3, 4, { #![cfg_attr(not(FALSE), rustc_dummy(innermost))] 5 });
|
||||
PRINT-ATTR RE-COLLECTED (DISPLAY): (3, 4, { #![cfg_attr(not(FALSE), rustc_dummy(innermost))] 5 }) ;
|
||||
PRINT-ATTR DEEP-RE-COLLECTED (DISPLAY): (3, 4, { #! [cfg_attr(not(FALSE), rustc_dummy(innermost))] 5 });
|
||||
PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||
Group {
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
PRINT-BANG INPUT (DISPLAY): struct S;
|
||||
PRINT-BANG DEEP-RE-COLLECTED (DISPLAY): struct S ;
|
||||
PRINT-BANG INPUT (DEBUG): TokenStream [
|
||||
Group {
|
||||
delimiter: None,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue