1
Fork 0

Teach rustfmt to handle postfix yield

This involved fixing the span when parsing .yield
This commit is contained in:
Eric Holk 2025-03-17 17:32:11 -07:00
parent c5093ac122
commit 9b0e7f6264
No known key found for this signature in database
GPG key ID: F1A772BB658A63E1
5 changed files with 23 additions and 24 deletions

View file

@ -1315,9 +1315,8 @@ impl<'a> Parser<'a> {
if self.eat_keyword(exp!(Yield)) { if self.eat_keyword(exp!(Yield)) {
let yield_span = self.prev_token.span; let yield_span = self.prev_token.span;
self.psess.gated_spans.gate(sym::yield_expr, yield_span); self.psess.gated_spans.gate(sym::yield_expr, yield_span);
return Ok( return Ok(self
self.mk_expr(yield_span, ExprKind::Yield(Some(self_arg), YieldKind::Postfix)) .mk_expr(lo.to(yield_span), ExprKind::Yield(Some(self_arg), YieldKind::Postfix)));
);
} }
let fn_span_lo = self.token.span; let fn_span_lo = self.token.span;

View file

@ -192,6 +192,7 @@ enum ChainItemKind {
StructField(symbol::Ident), StructField(symbol::Ident),
TupleField(symbol::Ident, bool), TupleField(symbol::Ident, bool),
Await, Await,
Yield,
Comment(String, CommentPosition), Comment(String, CommentPosition),
} }
@ -203,6 +204,7 @@ impl ChainItemKind {
| ChainItemKind::StructField(..) | ChainItemKind::StructField(..)
| ChainItemKind::TupleField(..) | ChainItemKind::TupleField(..)
| ChainItemKind::Await | ChainItemKind::Await
| ChainItemKind::Yield
| ChainItemKind::Comment(..) => false, | ChainItemKind::Comment(..) => false,
} }
} }
@ -257,6 +259,10 @@ impl ChainItemKind {
let span = mk_sp(nested.span.hi(), expr.span.hi()); let span = mk_sp(nested.span.hi(), expr.span.hi());
(ChainItemKind::Await, span) (ChainItemKind::Await, span)
} }
ast::ExprKind::Yield(Some(ref nested), ast::YieldKind::Postfix) => {
let span = mk_sp(nested.span.hi(), expr.span.hi());
(ChainItemKind::Yield, span)
}
_ => { _ => {
return ( return (
ChainItemKind::Parent { ChainItemKind::Parent {
@ -306,6 +312,7 @@ impl Rewrite for ChainItem {
rewrite_ident(context, ident) rewrite_ident(context, ident)
), ),
ChainItemKind::Await => ".await".to_owned(), ChainItemKind::Await => ".await".to_owned(),
ChainItemKind::Yield => ".yield".to_owned(),
ChainItemKind::Comment(ref comment, _) => { ChainItemKind::Comment(ref comment, _) => {
rewrite_comment(comment, false, shape, context.config)? rewrite_comment(comment, false, shape, context.config)?
} }
@ -508,7 +515,8 @@ impl Chain {
}), }),
ast::ExprKind::Field(ref subexpr, _) ast::ExprKind::Field(ref subexpr, _)
| ast::ExprKind::Try(ref subexpr) | ast::ExprKind::Try(ref subexpr)
| ast::ExprKind::Await(ref subexpr, _) => Some(SubExpr { | ast::ExprKind::Await(ref subexpr, _)
| ast::ExprKind::Yield(Some(ref subexpr), ast::YieldKind::Postfix) => Some(SubExpr {
expr: Self::convert_try(subexpr, context), expr: Self::convert_try(subexpr, context),
is_method_call_receiver: false, is_method_call_receiver: false,
}), }),

View file

@ -4,7 +4,7 @@ use rustc_ast::ast::{
self, Attribute, MetaItem, MetaItemInner, MetaItemKind, NodeId, Path, Visibility, self, Attribute, MetaItem, MetaItemInner, MetaItemKind, NodeId, Path, Visibility,
VisibilityKind, VisibilityKind,
}; };
use rustc_ast::ptr; use rustc_ast::{YieldKind, ptr};
use rustc_ast_pretty::pprust; use rustc_ast_pretty::pprust;
use rustc_span::{BytePos, LocalExpnId, Span, Symbol, SyntaxContext, sym, symbol}; use rustc_span::{BytePos, LocalExpnId, Span, Symbol, SyntaxContext, sym, symbol};
use unicode_width::UnicodeWidthStr; use unicode_width::UnicodeWidthStr;
@ -485,7 +485,9 @@ pub(crate) fn is_block_expr(context: &RewriteContext<'_>, expr: &ast::Expr, repr
| ast::ExprKind::Index(_, ref expr, _) | ast::ExprKind::Index(_, ref expr, _)
| ast::ExprKind::Unary(_, ref expr) | ast::ExprKind::Unary(_, ref expr)
| ast::ExprKind::Try(ref expr) | ast::ExprKind::Try(ref expr)
| ast::ExprKind::Yield(Some(ref expr), _) => is_block_expr(context, expr, repr), | ast::ExprKind::Yield(Some(ref expr), YieldKind::Prefix) => {
is_block_expr(context, expr, repr)
}
ast::ExprKind::Closure(ref closure) => is_block_expr(context, &closure.body, repr), ast::ExprKind::Closure(ref closure) => is_block_expr(context, &closure.body, repr),
// This can only be a string lit // This can only be a string lit
ast::ExprKind::Lit(_) => { ast::ExprKind::Lit(_) => {
@ -515,7 +517,7 @@ pub(crate) fn is_block_expr(context: &RewriteContext<'_>, expr: &ast::Expr, repr
| ast::ExprKind::Tup(..) | ast::ExprKind::Tup(..)
| ast::ExprKind::Use(..) | ast::ExprKind::Use(..)
| ast::ExprKind::Type(..) | ast::ExprKind::Type(..)
| ast::ExprKind::Yield(None, _) | ast::ExprKind::Yield(_, _)
| ast::ExprKind::Underscore => false, | ast::ExprKind::Underscore => false,
} }
} }

View file

@ -1,15 +0,0 @@
// This demonstrates a proposed alternate or additional option of having yield in postfix position.
//@ edition: 2024
#![feature(gen_blocks, coroutines, coroutine_trait, yield_expr)]
use std::ops::{Coroutine, CoroutineState};
use std::pin::pin;
fn main() {
let mut coro =
pin!(#[coroutine] |_: i32| { let x = 1.yield;
(x + 2).yield; });
}

View file

@ -7,6 +7,11 @@ use std::ops::{Coroutine, CoroutineState};
use std::pin::pin; use std::pin::pin;
fn main() { fn main() {
let mut coro = let mut coro = pin!(
pin!(#[coroutine] |_: i32| { let x = 1.yield; (x + 2).yield; }); #[coroutine]
|_: i32| {
let x = 1.yield;
(x + 2).await;
}
);
} }