diff --git a/proc-macros/Cargo.toml b/proc-macros/Cargo.toml index a6495fcadd..353ba6c51f 100644 --- a/proc-macros/Cargo.toml +++ b/proc-macros/Cargo.toml @@ -19,7 +19,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0" quote = "1.0" -syn = { version = "1.0", default-features = false, features = ["extra-traits", "full", "visit", "parsing", "printing", "clone-impls", "proc-macro"] } +syn = { version = "2.0", default-features = false, features = ["extra-traits", "full", "visit", "parsing", "printing", "clone-impls", "proc-macro"] } proc-macro-crate = "3" heck = "0.4.0" diff --git a/proc-macros/src/attributes.rs b/proc-macros/src/attributes.rs index 30c0797bd2..14e4f28698 100644 --- a/proc-macros/src/attributes.rs +++ b/proc-macros/src/attributes.rs @@ -108,7 +108,7 @@ impl Parse for Bracketed { syn::bracketed!(content in input); - let list = content.parse_terminated(Parse::parse)?; + let list = content.parse_terminated(Parse::parse, Token![,])?; Ok(Bracketed { list }) } @@ -119,15 +119,16 @@ fn parenthesized(input: ParseStream) -> syn::Result syn::Result { - let path = attr.path; - let arguments = parenthesized.parse2(attr.tokens)?; + let path = attr.path().clone(); + + let arguments = attr.parse_args_with(|input: ParseStream| input.parse_terminated(Parse::parse, Token![,]))?; Ok(AttributeMeta { path, arguments }) } diff --git a/proc-macros/src/helpers.rs b/proc-macros/src/helpers.rs index 43e6c8a5c7..5faed4b908 100644 --- a/proc-macros/src/helpers.rs +++ b/proc-macros/src/helpers.rs @@ -198,12 +198,12 @@ pub(crate) fn is_option(ty: &syn::Type) -> bool { /// Note that `doc comments` are expanded into `#[doc = "some comment"]` /// Thus, if the attribute starts with `doc` => it's regarded as a doc comment. pub(crate) fn extract_doc_comments(attrs: &[syn::Attribute]) -> TokenStream2 { - let docs = attrs.iter().filter(|attr| { - attr.path.is_ident("doc") - && match attr.parse_meta() { - Ok(syn::Meta::NameValue(meta)) => matches!(&meta.lit, syn::Lit::Str(_)), - _ => false, - } + let docs = attrs.iter().filter(|attr| match &attr.meta { + syn::Meta::NameValue(meta) => { + meta.path.is_ident("doc") + && matches!(meta.value, syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Str(_), .. })) + } + _ => false, }); quote! ( #(#docs)* ) } diff --git a/proc-macros/src/lib.rs b/proc-macros/src/lib.rs index c88fc6431c..6943e2efda 100644 --- a/proc-macros/src/lib.rs +++ b/proc-macros/src/lib.rs @@ -27,7 +27,6 @@ extern crate proc_macro; use proc_macro::TokenStream; -use quote::quote; use rpc_macro::RpcDescription; mod attributes; @@ -388,16 +387,16 @@ pub(crate) mod visitor; /// ``` #[proc_macro_attribute] pub fn rpc(attr: TokenStream, item: TokenStream) -> TokenStream { - let attr = proc_macro2::TokenStream::from(attr); - let rebuilt_rpc_attribute = syn::Attribute { pound_token: syn::token::Pound::default(), style: syn::AttrStyle::Outer, bracket_token: syn::token::Bracket::default(), - path: syn::Ident::new("rpc", proc_macro2::Span::call_site()).into(), - tokens: quote! { (#attr) }, + meta: syn::Meta::List(syn::MetaList { + path: syn::Ident::new("rpc", proc_macro2::Span::call_site()).into(), + delimiter: syn::MacroDelimiter::Paren(syn::token::Paren(proc_macro2::Span::call_site())), + tokens: attr.into(), + }), }; - match rpc_impl(rebuilt_rpc_attribute, item) { Ok(tokens) => tokens, Err(err) => err.to_compile_error(), diff --git a/proc-macros/src/render_client.rs b/proc-macros/src/render_client.rs index f331aad76b..41312f32ed 100644 --- a/proc-macros/src/render_client.rs +++ b/proc-macros/src/render_client.rs @@ -208,7 +208,7 @@ impl RpcDescription { &self, params: &[(syn::PatIdent, syn::Type)], param_kind: &ParamKind, - signature: &syn::TraitItemMethod, + signature: &syn::TraitItemFn, ) -> TokenStream2 { let jsonrpsee = self.jsonrpsee_client_path.as_ref().unwrap(); diff --git a/proc-macros/src/render_server.rs b/proc-macros/src/render_server.rs index eddb9e3d99..5c4996ebde 100644 --- a/proc-macros/src/render_server.rs +++ b/proc-macros/src/render_server.rs @@ -31,8 +31,7 @@ use super::RpcDescription; use crate::helpers::{generate_where_clause, is_option}; use proc_macro2::{Span, TokenStream as TokenStream2}; use quote::{quote, quote_spanned}; -use syn::punctuated::Punctuated; -use syn::{token, AttrStyle, Attribute, Path, PathSegment}; +use syn::Attribute; impl RpcDescription { pub(super) fn render_server(&self) -> Result { @@ -379,17 +378,10 @@ impl RpcDescription { heck::ToLowerCamelCase::to_lower_camel_case(name.ident.to_string().as_str()) )); - let mut punc_attr = Punctuated::new(); + let alias = TokenStream2::from_str(alias_vals.as_str()).unwrap(); - punc_attr - .push_value(PathSegment { ident: quote::format_ident!("serde"), arguments: Default::default() }); - - let serde_alias = Attribute { - pound_token: token::Pound::default(), - style: AttrStyle::Outer, - bracket_token: Default::default(), - path: Path { leading_colon: None, segments: punc_attr }, - tokens: TokenStream2::from_str(&format!("({})", alias_vals.as_str())).unwrap(), + let serde_alias: Attribute = syn::parse_quote! { + #[serde(#alias)] }; quote! { diff --git a/proc-macros/src/rpc_macro.rs b/proc-macros/src/rpc_macro.rs index 693ec2ad23..e500c72281 100644 --- a/proc-macros/src/rpc_macro.rs +++ b/proc-macros/src/rpc_macro.rs @@ -46,12 +46,12 @@ pub struct RpcMethod { pub params: Vec<(syn::PatIdent, syn::Type)>, pub param_kind: ParamKind, pub returns: Option, - pub signature: syn::TraitItemMethod, + pub signature: syn::TraitItemFn, pub aliases: Vec, } impl RpcMethod { - pub fn from_item(attr: Attribute, mut method: syn::TraitItemMethod) -> syn::Result { + pub fn from_item(attr: Attribute, mut method: syn::TraitItemFn) -> syn::Result { let [aliases, blocking, name, param_kind] = AttributeMeta::parse(attr)?.retain(["aliases", "blocking", "name", "param_kind"])?; @@ -117,13 +117,13 @@ pub struct RpcSubscription { pub params: Vec<(syn::PatIdent, syn::Type)>, pub param_kind: ParamKind, pub item: syn::Type, - pub signature: syn::TraitItemMethod, + pub signature: syn::TraitItemFn, pub aliases: Vec, pub unsubscribe_aliases: Vec, } impl RpcSubscription { - pub fn from_item(attr: syn::Attribute, mut sub: syn::TraitItemMethod) -> syn::Result { + pub fn from_item(attr: syn::Attribute, mut sub: syn::TraitItemFn) -> syn::Result { let [aliases, item, name, param_kind, unsubscribe, unsubscribe_aliases] = AttributeMeta::parse(attr)? .retain(["aliases", "item", "name", "param_kind", "unsubscribe", "unsubscribe_aliases"])?; @@ -249,7 +249,7 @@ impl RpcDescription { // Go through all the methods in the trait and collect methods and // subscriptions. for entry in item.items.iter() { - if let syn::TraitItem::Method(method) = entry { + if let syn::TraitItem::Fn(method) = entry { if method.sig.receiver().is_none() { return Err(syn::Error::new_spanned(&method.sig, "First argument of the trait must be '&self'")); } @@ -354,7 +354,7 @@ fn parse_subscribe(arg: Result) -> syn::Result