mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 22:54:42 +00:00
Format let-else with rustfmt nightly (#5461)
Support for `let…else` formatting was just merged to nightly (rust-lang/rust#113225). Rerun `cargo fmt` with Rust nightly 2023-07-02 to pick this up. Followup to #939. Signed-off-by: Anders Kaseorg <andersk@mit.edu>
This commit is contained in:
parent
c8b9a46e2b
commit
df13e69c3c
105 changed files with 782 additions and 362 deletions
|
@ -19,7 +19,9 @@ pub(crate) fn derive_message_formats(func: &ItemFn) -> TokenStream {
|
|||
}
|
||||
|
||||
fn parse_block(block: &Block, strings: &mut TokenStream) -> Result<(), TokenStream> {
|
||||
let Some(Stmt::Expr(last, _)) = block.stmts.last() else {panic!("expected last statement in block to be an expression")};
|
||||
let Some(Stmt::Expr(last, _)) = block.stmts.last() else {
|
||||
panic!("expected last statement in block to be an expression")
|
||||
};
|
||||
parse_expr(last, strings)?;
|
||||
Ok(())
|
||||
}
|
||||
|
@ -28,7 +30,9 @@ fn parse_expr(expr: &Expr, strings: &mut TokenStream) -> Result<(), TokenStream>
|
|||
match expr {
|
||||
Expr::Macro(mac) if mac.mac.path.is_ident("format") => {
|
||||
let Some(first_token) = mac.mac.tokens.to_token_stream().into_iter().next() else {
|
||||
return Err(quote_spanned!(expr.span() => compile_error!("expected format! to have an argument")))
|
||||
return Err(
|
||||
quote_spanned!(expr.span() => compile_error!("expected format! to have an argument")),
|
||||
);
|
||||
};
|
||||
strings.extend(quote! {#first_token,});
|
||||
Ok(())
|
||||
|
|
|
@ -31,14 +31,30 @@ struct Rule {
|
|||
|
||||
pub(crate) fn map_codes(func: &ItemFn) -> syn::Result<TokenStream> {
|
||||
let Some(last_stmt) = func.block.stmts.last() else {
|
||||
return Err(Error::new(func.block.span(), "expected body to end in an expression"));
|
||||
return Err(Error::new(
|
||||
func.block.span(),
|
||||
"expected body to end in an expression",
|
||||
));
|
||||
};
|
||||
let Stmt::Expr(Expr::Call(ExprCall { args: some_args, .. }), _) = last_stmt else {
|
||||
return Err(Error::new(last_stmt.span(), "expected last expression to be `Some(match (..) { .. })`"));
|
||||
let Stmt::Expr(
|
||||
Expr::Call(ExprCall {
|
||||
args: some_args, ..
|
||||
}),
|
||||
_,
|
||||
) = last_stmt
|
||||
else {
|
||||
return Err(Error::new(
|
||||
last_stmt.span(),
|
||||
"expected last expression to be `Some(match (..) { .. })`",
|
||||
));
|
||||
};
|
||||
let mut some_args = some_args.into_iter();
|
||||
let (Some(Expr::Match(ExprMatch { arms, .. })), None) = (some_args.next(), some_args.next()) else {
|
||||
return Err(Error::new(last_stmt.span(), "expected last expression to be `Some(match (..) { .. })`"));
|
||||
let (Some(Expr::Match(ExprMatch { arms, .. })), None) = (some_args.next(), some_args.next())
|
||||
else {
|
||||
return Err(Error::new(
|
||||
last_stmt.span(),
|
||||
"expected last expression to be `Some(match (..) { .. })`",
|
||||
));
|
||||
};
|
||||
|
||||
// Map from: linter (e.g., `Flake8Bugbear`) to rule code (e.g.,`"002"`) to rule data (e.g.,
|
||||
|
|
|
@ -6,10 +6,16 @@ use syn::spanned::Spanned;
|
|||
use syn::{Attribute, Data, DataEnum, DeriveInput, Error, ExprLit, Lit, Meta, MetaNameValue};
|
||||
|
||||
pub(crate) fn derive_impl(input: DeriveInput) -> syn::Result<proc_macro2::TokenStream> {
|
||||
let DeriveInput { ident, data: Data::Enum(DataEnum {
|
||||
variants, ..
|
||||
}), .. } = input else {
|
||||
return Err(Error::new(input.ident.span(), "only named fields are supported"));
|
||||
let DeriveInput {
|
||||
ident,
|
||||
data: Data::Enum(DataEnum { variants, .. }),
|
||||
..
|
||||
} = input
|
||||
else {
|
||||
return Err(Error::new(
|
||||
input.ident.span(),
|
||||
"only named fields are supported",
|
||||
));
|
||||
};
|
||||
|
||||
let mut parsed = Vec::new();
|
||||
|
@ -53,8 +59,12 @@ pub(crate) fn derive_impl(input: DeriveInput) -> syn::Result<proc_macro2::TokenS
|
|||
));
|
||||
}
|
||||
|
||||
let Some(doc_attr) = variant.attrs.iter().find(|attr| attr.path().is_ident("doc")) else {
|
||||
return Err(Error::new(variant.span(), r#"expected a doc comment"#))
|
||||
let Some(doc_attr) = variant
|
||||
.attrs
|
||||
.iter()
|
||||
.find(|attr| attr.path().is_ident("doc"))
|
||||
else {
|
||||
return Err(Error::new(variant.span(), r#"expected a doc comment"#));
|
||||
};
|
||||
|
||||
let variant_ident = variant.ident;
|
||||
|
@ -125,8 +135,19 @@ pub(crate) fn derive_impl(input: DeriveInput) -> syn::Result<proc_macro2::TokenS
|
|||
/// Parses an attribute in the form of `#[doc = " [name](https://example.com/)"]`
|
||||
/// into a tuple of link label and URL.
|
||||
fn parse_doc_attr(doc_attr: &Attribute) -> syn::Result<(String, String)> {
|
||||
let Meta::NameValue(MetaNameValue{value: syn::Expr::Lit(ExprLit { lit: Lit::Str(doc_lit), ..}), ..}) = &doc_attr.meta else {
|
||||
return Err(Error::new(doc_attr.span(), r#"expected doc attribute to be in the form of #[doc = "..."]"#))
|
||||
let Meta::NameValue(MetaNameValue {
|
||||
value:
|
||||
syn::Expr::Lit(ExprLit {
|
||||
lit: Lit::Str(doc_lit),
|
||||
..
|
||||
}),
|
||||
..
|
||||
}) = &doc_attr.meta
|
||||
else {
|
||||
return Err(Error::new(
|
||||
doc_attr.span(),
|
||||
r#"expected doc attribute to be in the form of #[doc = "..."]"#,
|
||||
));
|
||||
};
|
||||
parse_markdown_link(doc_lit.value().trim())
|
||||
.map(|(name, url)| (name.to_string(), url.to_string()))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue