summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_ast_pretty/src
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_ast_pretty/src')
-rw-r--r--compiler/rustc_ast_pretty/src/lib.rs3
-rw-r--r--compiler/rustc_ast_pretty/src/pprust/state.rs74
-rw-r--r--compiler/rustc_ast_pretty/src/pprust/state/expr.rs10
3 files changed, 51 insertions, 36 deletions
diff --git a/compiler/rustc_ast_pretty/src/lib.rs b/compiler/rustc_ast_pretty/src/lib.rs
index bf094af5f..475bdb023 100644
--- a/compiler/rustc_ast_pretty/src/lib.rs
+++ b/compiler/rustc_ast_pretty/src/lib.rs
@@ -1,3 +1,6 @@
+#![cfg_attr(not(bootstrap), allow(internal_features))]
+#![cfg_attr(not(bootstrap), feature(rustdoc_internals))]
+#![cfg_attr(not(bootstrap), doc(rust_logo))]
#![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)]
#![feature(associated_type_bounds)]
diff --git a/compiler/rustc_ast_pretty/src/pprust/state.rs b/compiler/rustc_ast_pretty/src/pprust/state.rs
index 8b7e91882..48421ff71 100644
--- a/compiler/rustc_ast_pretty/src/pprust/state.rs
+++ b/compiler/rustc_ast_pretty/src/pprust/state.rs
@@ -146,37 +146,49 @@ pub fn print_crate<'a>(
s.s.eof()
}
-/// This makes printed token streams look slightly nicer,
-/// and also addresses some specific regressions described in #63896 and #73345.
-fn tt_prepend_space(tt: &TokenTree, prev: &TokenTree) -> bool {
- if let TokenTree::Token(token, _) = prev {
- // No space after these tokens, e.g. `x.y`, `$e`
- // (The carets point to `prev`.) ^ ^
- if matches!(token.kind, token::Dot | token::Dollar) {
- return false;
- }
- if let token::DocComment(comment_kind, ..) = token.kind {
- return comment_kind != CommentKind::Line;
- }
- }
- match tt {
- // No space before these tokens, e.g. `foo,`, `println!`, `x.y`
- // (The carets point to `token`.) ^ ^ ^
+/// Should two consecutive tokens be printed with a space between them?
+///
+/// Note: some old proc macros parse pretty-printed output, so changes here can
+/// break old code. For example:
+/// - #63896: `#[allow(unused,` must be printed rather than `#[allow(unused ,`
+/// - #73345: `#[allow(unused)] must be printed rather than `# [allow(unused)]
+///
+fn space_between(tt1: &TokenTree, tt2: &TokenTree) -> bool {
+ use token::*;
+ use Delimiter::*;
+ use TokenTree::Delimited as Del;
+ use TokenTree::Token as Tok;
+
+ // 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.
+ match (tt1, tt2) {
+ // 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,
+
+ // ANYTHING + `,`: `foo,`
+ // ANYTHING + `.`: `x.y`, `tup.0`
+ // ANYTHING + `!`: `foo! { ... }`
//
- // FIXME: having `Not` here works well for macro invocations like
- // `println!()`, but is bad when `!` means "logical not" or "the never
- // type", where the lack of space causes ugliness like this:
- // `Fn() ->!`, `x =! y`, `if! x { f(); }`.
- TokenTree::Token(token, _) => !matches!(token.kind, token::Comma | token::Not | token::Dot),
- // No space before parentheses if preceded by these tokens, e.g. `foo(...)`
- TokenTree::Delimited(_, Delimiter::Parenthesis, _) => {
- !matches!(prev, TokenTree::Token(Token { kind: token::Ident(..), .. }, _))
- }
- // No space before brackets if preceded by these tokens, e.g. `#[...]`
- TokenTree::Delimited(_, Delimiter::Bracket, _) => {
- !matches!(prev, TokenTree::Token(Token { kind: token::Pound, .. }, _))
- }
- TokenTree::Delimited(..) => true,
+ // FIXME: Incorrect cases:
+ // - Logical not: `x =! y`, `if! x { f(); }`
+ // - Never type: `Fn() ->!`
+ (_, Tok(Token { kind: Comma | Dot | Not, .. }, _)) => false,
+
+ // IDENT + `(`: `f(3)`
+ //
+ // FIXME: Incorrect cases:
+ // - Let: `let(a, b) = (1, 2)`
+ (Tok(Token { kind: Ident(..), .. }, _), Del(_, Parenthesis, _)) => false,
+
+ // `#` + `[`: `#[attr]`
+ (Tok(Token { kind: Pound, .. }, _), Del(_, Bracket, _)) => false,
+
+ _ => true,
}
}
@@ -575,7 +587,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
while let Some(tt) = iter.next() {
self.print_tt(tt, convert_dollar_crate);
if let Some(next) = iter.peek() {
- if tt_prepend_space(next, tt) {
+ if space_between(tt, next) {
self.space();
}
}
diff --git a/compiler/rustc_ast_pretty/src/pprust/state/expr.rs b/compiler/rustc_ast_pretty/src/pprust/state/expr.rs
index 1142d4921..edbc35003 100644
--- a/compiler/rustc_ast_pretty/src/pprust/state/expr.rs
+++ b/compiler/rustc_ast_pretty/src/pprust/state/expr.rs
@@ -445,8 +445,8 @@ impl<'a> State<'a> {
self.ibox(0);
self.print_block_with_attrs(blk, attrs);
}
- ast::ExprKind::Async(capture_clause, blk) => {
- self.word_nbsp("async");
+ ast::ExprKind::Gen(capture_clause, blk, kind) => {
+ self.word_nbsp(kind.modifier());
self.print_capture_clause(*capture_clause);
// cbox/ibox in analogy to the `ExprKind::Block` arm above
self.cbox(0);
@@ -673,7 +673,7 @@ impl<'a> State<'a> {
fn print_capture_clause(&mut self, capture_clause: ast::CaptureBy) {
match capture_clause {
- ast::CaptureBy::Value => self.word_space("move"),
+ ast::CaptureBy::Value { .. } => self.word_space("move"),
ast::CaptureBy::Ref => {}
}
}
@@ -684,8 +684,8 @@ pub fn reconstruct_format_args_template_string(pieces: &[FormatArgsPiece]) -> St
for piece in pieces {
match piece {
FormatArgsPiece::Literal(s) => {
- for c in s.as_str().escape_debug() {
- template.push(c);
+ for c in s.as_str().chars() {
+ template.extend(c.escape_debug());
if let '{' | '}' = c {
template.push(c);
}