Skip to content

Commit

Permalink
Revert #96682.
Browse files Browse the repository at this point in the history
The change was "Show invisible delimiters (within comments) when pretty
printing". It's useful to show these delimiters, but is a breaking
change for some proc macros.

Fixes #97608.
  • Loading branch information
nnethercote committed Jun 2, 2022
1 parent bef2b7c commit 77e1069
Show file tree
Hide file tree
Showing 17 changed files with 68 additions and 110 deletions.
5 changes: 2 additions & 3 deletions compiler/rustc_ast/src/token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,11 @@ pub enum Delimiter {
Brace,
/// `[ ... ]`
Bracket,
/// `/*«*/ ... /*»*/`
/// `Ø ... Ø`
/// An invisible delimiter, that may, for example, appear around tokens coming from a
/// "macro variable" `$var`. It is important to preserve operator priorities in cases like
/// `$var * 3` where `$var` is `1 + 2`.
/// Invisible delimiters are not directly writable in normal Rust code except as comments.
/// Therefore, they might not survive a roundtrip of a token stream through a string.
/// Invisible delimiters might not survive roundtrip of a token stream through a string.
Invisible,
}

Expand Down
23 changes: 5 additions & 18 deletions compiler/rustc_ast_pretty/src/pprust/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -590,28 +590,14 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
self.nbsp();
}
self.word("{");
let empty = tts.is_empty();
if !empty {
if !tts.is_empty() {
self.space();
}
self.ibox(0);
self.print_tts(tts, convert_dollar_crate);
self.end();
self.bclose(span, empty);
}
Some(Delimiter::Invisible) => {
self.word("/*«*/");
let empty = tts.is_empty();
if !empty {
self.space();
}
self.ibox(0);
self.print_tts(tts, convert_dollar_crate);
self.end();
if !empty {
self.space();
}
self.word("/*»*/");
self.bclose(span, empty);
}
Some(delim) => {
let token_str = self.token_kind_to_string(&token::OpenDelim(delim));
Expand Down Expand Up @@ -786,8 +772,9 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
token::CloseDelim(Delimiter::Bracket) => "]".into(),
token::OpenDelim(Delimiter::Brace) => "{".into(),
token::CloseDelim(Delimiter::Brace) => "}".into(),
token::OpenDelim(Delimiter::Invisible) => "/*«*/".into(),
token::CloseDelim(Delimiter::Invisible) => "/*»*/".into(),
token::OpenDelim(Delimiter::Invisible) | token::CloseDelim(Delimiter::Invisible) => {
"".into()
}
token::Pound => "#".into(),
token::Dollar => "$".into(),
token::Question => "?".into(),
Expand Down
5 changes: 2 additions & 3 deletions library/proc_macro/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -703,12 +703,11 @@ pub enum Delimiter {
/// `[ ... ]`
#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
Bracket,
/// `/*«*/ ... /*»*/`
/// `Ø ... Ø`
/// An invisible delimiter, that may, for example, appear around tokens coming from a
/// "macro variable" `$var`. It is important to preserve operator priorities in cases like
/// `$var * 3` where `$var` is `1 + 2`.
/// Invisible delimiters are not directly writable in normal Rust code except as comments.
/// Therefore, they might not survive a roundtrip of a token stream through a string.
/// Invisible delimiters might not survive roundtrip of a token stream through a string.
#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
None,
}
Expand Down
29 changes: 8 additions & 21 deletions src/test/ui/proc-macro/auxiliary/expand-expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,6 @@ use std::str::FromStr;

#[proc_macro]
pub fn expand_expr_is(input: TokenStream) -> TokenStream {
expand_expr_is_inner(input, false)
}

#[proc_macro]
pub fn expand_expr_is_trim(input: TokenStream) -> TokenStream {
expand_expr_is_inner(input, true)
}

fn expand_expr_is_inner(input: TokenStream, trim_invisible: bool) -> TokenStream {
let mut iter = input.into_iter();
let mut expected_tts = Vec::new();
loop {
Expand All @@ -31,18 +22,14 @@ fn expand_expr_is_inner(input: TokenStream, trim_invisible: bool) -> TokenStream
}
}

// If requested, trim the "invisible" delimiters at the start and end.
let expected = expected_tts.into_iter().collect::<TokenStream>().to_string();
let expected = if trim_invisible {
let len1 = "/*«*/ ".len();
let len2 = " /*»*/".len();
&expected[len1..expected.len() - len2]
} else {
&expected[..]
};
let expanded = iter.collect::<TokenStream>().expand_expr().unwrap().to_string();

assert_eq!(expected, expanded);
let expected = expected_tts.into_iter().collect::<TokenStream>();
let expanded = iter.collect::<TokenStream>().expand_expr().expect("expand_expr failed");
assert!(
expected.to_string() == expanded.to_string(),
"assert failed\nexpected: `{}`\nexpanded: `{}`",
expected.to_string(),
expanded.to_string()
);

TokenStream::new()
}
Expand Down
8 changes: 2 additions & 6 deletions src/test/ui/proc-macro/capture-macro-rules-invoke.stdout
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
PRINT-BANG INPUT (DISPLAY): self
PRINT-BANG RE-COLLECTED (DISPLAY): /*«*/ self /*»*/
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
Expand All @@ -14,10 +13,8 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
]
PRINT-BANG INPUT (DISPLAY): 1 + 1, { "a" }, let a = 1;, String, my_name, 'a, my_val = 30,
std::option::Option, pub(in some::path) , [a b c], -30
PRINT-BANG RE-COLLECTED (DISPLAY): /*«*/ 1 + 1 /*»*/, /*«*/ { "a" } /*»*/, /*«*/ let a = 1 /*»*/, /*«*/
String /*»*/, my_name, /*«*/ 'a /*»*/, /*«*/ my_val = 30 /*»*/, /*«*/
std :: option :: Option /*»*/, /*«*/ pub(in some :: path) /*»*/, [a b c],
/*«*/ - 30 /*»*/
PRINT-BANG RE-COLLECTED (DISPLAY): 1 + 1, { "a" }, let a = 1, String, my_name, 'a, my_val = 30,
std :: option :: Option, pub(in some :: path), [a b c], - 30
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
Expand Down Expand Up @@ -298,7 +295,6 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
},
]
PRINT-BANG INPUT (DISPLAY): (a, b)
PRINT-BANG RE-COLLECTED (DISPLAY): /*«*/ (a, b) /*»*/
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/proc-macro/capture-unglued-token.stdout
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
PRINT-BANG INPUT (DISPLAY): Vec<u8>
PRINT-BANG RE-COLLECTED (DISPLAY): /*«*/ Vec < u8 > /*»*/
PRINT-BANG RE-COLLECTED (DISPLAY): Vec < u8 >
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
Expand Down
24 changes: 12 additions & 12 deletions src/test/ui/proc-macro/expand-expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

extern crate expand_expr;

use expand_expr::{check_expand_expr_file, echo_pm, expand_expr_fail, expand_expr_is};
use expand_expr::{expand_expr_is_trim, recursive_expand};

use expand_expr::{
check_expand_expr_file, echo_pm, expand_expr_fail, expand_expr_is, recursive_expand,
};

// Check builtin macros can be expanded.

Expand Down Expand Up @@ -47,21 +47,21 @@ macro_rules! echo_expr {

macro_rules! simple_lit {
($l:literal) => {
expand_expr_is_trim!($l, $l);
expand_expr_is_trim!($l, echo_lit!($l));
expand_expr_is_trim!($l, echo_expr!($l));
expand_expr_is_trim!($l, echo_tts!($l));
expand_expr_is_trim!($l, echo_pm!($l));
expand_expr_is!($l, $l);
expand_expr_is!($l, echo_lit!($l));
expand_expr_is!($l, echo_expr!($l));
expand_expr_is!($l, echo_tts!($l));
expand_expr_is!($l, echo_pm!($l));
const _: () = {
macro_rules! mac {
() => {
$l
};
}
expand_expr_is_trim!($l, mac!());
expand_expr_is_trim!($l, echo_expr!(mac!()));
expand_expr_is_trim!($l, echo_tts!(mac!()));
expand_expr_is_trim!($l, echo_pm!(mac!()));
expand_expr_is!($l, mac!());
expand_expr_is!($l, echo_expr!(mac!()));
expand_expr_is!($l, echo_tts!(mac!()));
expand_expr_is!($l, echo_pm!(mac!()));
};
};
}
Expand Down
12 changes: 5 additions & 7 deletions src/test/ui/proc-macro/expr-stmt-nonterminal-tokens.stdout
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
PRINT-DERIVE INPUT (DISPLAY): enum E { V = { let _ = #[allow(warnings)] 0 ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E
{ V = { let _ = /*«*/ #[allow(warnings)] #[allow(warnings)] 0 /*»*/ ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = #[allow(warnings)] #[allow(warnings)] 0 ; 0 }, }
PRINT-DERIVE INPUT (DEBUG): TokenStream [
Ident {
ident: "enum",
Expand Down Expand Up @@ -124,7 +123,7 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [
},
]
PRINT-DERIVE INPUT (DISPLAY): enum E { V = { let _ = { 0; } ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { /*«*/ 0 /*»*/ } ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { 0 } ; 0 }, }
PRINT-DERIVE INPUT (DEBUG): TokenStream [
Ident {
ident: "enum",
Expand Down Expand Up @@ -204,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",
Expand Down Expand Up @@ -283,7 +281,7 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [
},
]
PRINT-DERIVE INPUT (DISPLAY): enum E { V = { let _ = { PATH; } ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { /*«*/ PATH /*»*/ } ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { PATH } ; 0 }, }
PRINT-DERIVE INPUT (DEBUG): TokenStream [
Ident {
ident: "enum",
Expand Down Expand Up @@ -361,7 +359,7 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [
},
]
PRINT-DERIVE INPUT (DISPLAY): enum E { V = { let _ = { 0 + 1; } ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { /*«*/ 0 + 1 /*»*/ } ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { 0 + 1 } ; 0 }, }
PRINT-DERIVE INPUT (DEBUG): TokenStream [
Ident {
ident: "enum",
Expand Down Expand Up @@ -452,7 +450,7 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [
},
]
PRINT-DERIVE INPUT (DISPLAY): enum E { V = { let _ = { PATH + 1; } ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { /*«*/ PATH + 1 /*»*/ } ; 0 }, }
PRINT-DERIVE DEEP-RE-COLLECTED (DISPLAY): enum E { V = { let _ = { PATH + 1 } ; 0 }, }
PRINT-DERIVE INPUT (DEBUG): TokenStream [
Ident {
ident: "enum",
Expand Down
1 change: 0 additions & 1 deletion src/test/ui/proc-macro/issue-75734-pp-paren.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
},
]
PRINT-BANG INPUT (DISPLAY): 1 + 1 * 2
PRINT-BANG RE-COLLECTED (DISPLAY): /*«*/ 1 + 1 /*»*/ * 2
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PRINT-BANG INPUT (DISPLAY): foo! { #[fake_attr] mod bar {
#![doc = r" Foo"]
} }
PRINT-BANG DEEP-RE-COLLECTED (DISPLAY): foo! { #[fake_attr] /*«*/ mod bar { #! [doc = r" Foo"] } /*»*/ }
PRINT-BANG DEEP-RE-COLLECTED (DISPLAY): foo! { #[fake_attr] mod bar { #! [doc = r" Foo"] } }
PRINT-BANG INPUT (DEBUG): TokenStream [
Ident {
ident: "foo",
Expand Down
1 change: 0 additions & 1 deletion src/test/ui/proc-macro/issue-80760-empty-stmt.stdout
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
PRINT-BANG INPUT (DISPLAY): ;
PRINT-BANG RE-COLLECTED (DISPLAY): /*«*/ ; /*»*/
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
Expand Down
2 changes: 0 additions & 2 deletions src/test/ui/proc-macro/nested-nonterminal-tokens.stdout
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
PRINT-BANG INPUT (DISPLAY): 0 + 1 + 2 + 3
PRINT-BANG RE-COLLECTED (DISPLAY): /*«*/ 0 + 1 + 2 /*»*/ + 3
PRINT-BANG DEEP-RE-COLLECTED (DISPLAY): /*«*/ /*«*/ /*«*/ 0 /*»*/ + 1 /*»*/ + 2 /*»*/ + 3
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
Expand Down
4 changes: 0 additions & 4 deletions src/test/ui/proc-macro/nodelim-groups.stdout
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
PRINT-BANG INPUT (DISPLAY): "hi" 1 + (25) + 1 (1 + 1)
PRINT-BANG RE-COLLECTED (DISPLAY): "hi" /*«*/ 1 + (25) + 1 /*»*/ (1 + 1)
PRINT-BANG INPUT (DEBUG): TokenStream [
Literal {
kind: Str,
Expand Down Expand Up @@ -72,9 +71,6 @@ PRINT-BANG INPUT (DEBUG): TokenStream [
},
]
PRINT-BANG INPUT (DISPLAY): "hi" "hello".len() + "world".len() (1 + 1)
PRINT-BANG RE-COLLECTED (DISPLAY): "hi" /*«*/ "hello".len() + "world".len() /*»*/ (1 + 1)
PRINT-BANG DEEP-RE-COLLECTED (DISPLAY): "hi" /*«*/ /*«*/ "hello".len() /*»*/ + /*«*/ "world".len() /*»*/ /*»*/
(1 + 1)
PRINT-BANG INPUT (DEBUG): TokenStream [
Literal {
kind: Str,
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/proc-macro/nonterminal-expansion.stdout
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
PRINT-ATTR_ARGS INPUT (DISPLAY): a, line!(), b
PRINT-ATTR_ARGS RE-COLLECTED (DISPLAY): a, /*«*/ line! () /*»*/, b
PRINT-ATTR_ARGS RE-COLLECTED (DISPLAY): a, line! (), b
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "a",
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/proc-macro/nonterminal-token-hygiene.stdout
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
PRINT-BANG INPUT (DISPLAY): struct S;
PRINT-BANG RE-COLLECTED (DISPLAY): /*«*/ struct S ; /*»*/
PRINT-BANG RE-COLLECTED (DISPLAY): struct S ;
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
Expand Down
28 changes: 14 additions & 14 deletions src/test/ui/proc-macro/parent-source-spans.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ use parent_source_spans::parent_source_spans;

macro one($a:expr, $b:expr) {
two!($a, $b);
//~^ ERROR first parent: /*«*/ "hello" /*»*/
//~| ERROR second parent: /*«*/ "world" /*»*/
//~^ ERROR first parent: "hello"
//~| ERROR second parent: "world"
}

macro two($a:expr, $b:expr) {
three!($a, $b);
//~^ ERROR first final: /*«*/ "hello" /*»*/
//~| ERROR second final: /*«*/ "world" /*»*/
//~| ERROR first final: /*«*/ "yay" /*»*/
//~| ERROR second final: /*«*/ "rust" /*»*/
//~^ ERROR first final: "hello"
//~| ERROR second final: "world"
//~| ERROR first final: "yay"
//~| ERROR second final: "rust"
}

// forwarding tokens directly doesn't create a new source chain
Expand All @@ -34,16 +34,16 @@ macro four($($tokens:tt)*) {

fn main() {
one!("hello", "world");
//~^ ERROR first grandparent: /*«*/ "hello" /*»*/
//~| ERROR second grandparent: /*«*/ "world" /*»*/
//~| ERROR first source: /*«*/ "hello" /*»*/
//~| ERROR second source: /*«*/ "world" /*»*/
//~^ ERROR first grandparent: "hello"
//~| ERROR second grandparent: "world"
//~| ERROR first source: "hello"
//~| ERROR second source: "world"

two!("yay", "rust");
//~^ ERROR first parent: /*«*/ "yay" /*»*/
//~| ERROR second parent: /*«*/ "rust" /*»*/
//~| ERROR first source: /*«*/ "yay" /*»*/
//~| ERROR second source: /*«*/ "rust" /*»*/
//~^ ERROR first parent: "yay"
//~| ERROR second parent: "rust"
//~| ERROR first source: "yay"
//~| ERROR second source: "rust"

three!("hip", "hop");
//~^ ERROR first final: "hip"
Expand Down
Loading

0 comments on commit 77e1069

Please sign in to comment.