Skip to content

Commit 6cf42c1

Browse files
committed
Update to syn 3
1 parent b9daaba commit 6cf42c1

3 files changed

Lines changed: 48 additions & 36 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ proc-macro = true
1818
[dependencies]
1919
proc-macro2 = "1.0.74"
2020
quote = "1.0.35"
21-
syn = { version = "2.0.46", default-features = false, features = ["clone-impls", "full", "parsing", "printing", "proc-macro", "visit-mut"] }
21+
syn = { version = "3", default-features = false, features = ["clone-impls", "full", "parsing", "printing", "proc-macro", "visit-mut"] }
2222

2323
[dev-dependencies]
2424
futures = "0.3.30"

src/expand.rs

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use syn::visit_mut::{self, VisitMut};
1212
use syn::{
1313
parse_quote, parse_quote_spanned, Attribute, Block, FnArg, GenericArgument, GenericParam,
1414
Generics, Ident, ImplItem, Lifetime, LifetimeParam, Pat, PatIdent, PathArguments, Receiver,
15-
ReturnType, Signature, Token, TraitItem, Type, TypeInfer, TypePath, WhereClause,
15+
ReceiverKind, ReturnType, Signature, Token, TraitItem, Type, TypeInfer, TypePath, WhereClause,
1616
};
1717

1818
impl ToTokens for Item {
@@ -248,30 +248,37 @@ fn transform_sig(
248248
let bounds: &[InferredBound] = if is_local {
249249
&[]
250250
} else if let Some(receiver) = sig.receiver() {
251-
match receiver.ty.as_ref() {
252-
// self: &Self
253-
Type::Reference(ty) if ty.mutability.is_none() => &[InferredBound::Sync],
254-
// self: Arc<Self>
255-
Type::Path(ty)
256-
if {
257-
let segment = ty.path.segments.last().unwrap();
258-
segment.ident == "Arc"
259-
&& match &segment.arguments {
260-
PathArguments::AngleBracketed(arguments) => {
261-
arguments.args.len() == 1
262-
&& match &arguments.args[0] {
263-
GenericArgument::Type(Type::Path(arg)) => {
264-
arg.path.is_ident("Self")
251+
match &receiver.kind {
252+
// &self
253+
ReceiverKind::Reference(_ampersand, _lifetime, None::<Token![mut]>) => {
254+
&[InferredBound::Sync]
255+
}
256+
ReceiverKind::Typed(_colon, ty) => match ty.as_ref() {
257+
// self: &Self
258+
Type::Reference(ty) if ty.mutability.is_none() => &[InferredBound::Sync],
259+
// self: Arc<Self>
260+
Type::Path(ty)
261+
if {
262+
let segment = ty.path.segments.last().unwrap();
263+
segment.ident == "Arc"
264+
&& match &segment.arguments {
265+
PathArguments::AngleBracketed(arguments) => {
266+
arguments.args.len() == 1
267+
&& match &arguments.args[0] {
268+
GenericArgument::Type(Type::Path(arg)) => {
269+
arg.path.is_ident("Self")
270+
}
271+
_ => false,
265272
}
266-
_ => false,
267-
}
273+
}
274+
_ => false,
268275
}
269-
_ => false,
270-
}
271-
} =>
272-
{
273-
&[InferredBound::Sync, InferredBound::Send]
274-
}
276+
} =>
277+
{
278+
&[InferredBound::Sync, InferredBound::Send]
279+
}
280+
_ => &[InferredBound::Send],
281+
},
275282
_ => &[InferredBound::Send],
276283
}
277284
} else {
@@ -293,9 +300,7 @@ fn transform_sig(
293300
for (i, arg) in sig.inputs.iter_mut().enumerate() {
294301
match arg {
295302
FnArg::Receiver(receiver) => {
296-
if receiver.reference.is_none() {
297-
receiver.mutability = None;
298-
}
303+
receiver.mutability = None;
299304
}
300305
FnArg::Typed(arg) => {
301306
if match *arg.ty {
@@ -493,6 +498,7 @@ fn replace_impl_trait_with_infer(ty: &mut Type) {
493498
fn visit_type_mut(&mut self, ty: &mut Type) {
494499
if let Type::ImplTrait(impl_trait) = ty {
495500
*ty = Type::Infer(TypeInfer {
501+
attrs: Vec::new(),
496502
underscore_token: Token![_](impl_trait.impl_token.span),
497503
});
498504
}

src/lifetime.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use proc_macro2::{Span, TokenStream};
22
use std::mem;
33
use syn::visit_mut::{self, VisitMut};
44
use syn::{
5-
parse_quote_spanned, token, Expr, GenericArgument, Lifetime, Receiver, ReturnType, Token, Type,
6-
TypeBareFn, TypeImplTrait, TypeParen, TypePtr, TypeReference,
5+
parse_quote_spanned, token, Expr, GenericArgument, Lifetime, ReceiverKind, ReturnType, Token,
6+
Type, TypeFnPtr, TypeImplTrait, TypeParen, TypePtr, TypeReference,
77
};
88

99
pub struct CollectLifetimes {
@@ -43,11 +43,16 @@ impl CollectLifetimes {
4343
}
4444

4545
impl VisitMut for CollectLifetimes {
46-
fn visit_receiver_mut(&mut self, arg: &mut Receiver) {
47-
if let Some((reference, lifetime)) = &mut arg.reference {
48-
self.visit_opt_lifetime(reference, lifetime);
49-
} else {
50-
visit_mut::visit_type_mut(self, &mut arg.ty);
46+
fn visit_receiver_kind_mut(&mut self, receiver: &mut ReceiverKind) {
47+
match receiver {
48+
ReceiverKind::Value => {}
49+
ReceiverKind::Reference(reference, lifetime, _mutability) => {
50+
self.visit_opt_lifetime(reference, lifetime);
51+
}
52+
ReceiverKind::Typed(_colon, ty) => {
53+
visit_mut::visit_type_mut(self, ty);
54+
}
55+
_ => {}
5156
}
5257
}
5358

@@ -87,11 +92,11 @@ impl VisitMut for AddLifetimeToImplTrait {
8792
visit_mut::visit_type_ptr_mut(self, ty);
8893
}
8994

90-
fn visit_type_bare_fn_mut(&mut self, ty: &mut TypeBareFn) {
95+
fn visit_type_fn_ptr_mut(&mut self, ty: &mut TypeFnPtr) {
9196
if let ReturnType::Type(arrow, return_type) = &mut ty.output {
9297
parenthesize_impl_trait(return_type, arrow.spans[0]);
9398
}
94-
visit_mut::visit_type_bare_fn_mut(self, ty);
99+
visit_mut::visit_type_fn_ptr_mut(self, ty);
95100
}
96101

97102
fn visit_expr_mut(&mut self, _e: &mut Expr) {
@@ -105,6 +110,7 @@ fn parenthesize_impl_trait(elem: &mut Type, paren_span: Span) {
105110
if let Type::ImplTrait(_) = *elem {
106111
let placeholder = Type::Verbatim(TokenStream::new());
107112
*elem = Type::Paren(TypeParen {
113+
attrs: Vec::new(),
108114
paren_token: token::Paren(paren_span),
109115
elem: Box::new(mem::replace(elem, placeholder)),
110116
});

0 commit comments

Comments
 (0)