diff --git a/Cargo.toml b/Cargo.toml index 3bfe2f466..0d3a4ead8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,7 +77,7 @@ scoped_threadpool = "0.1.9" serde = "1.0" serde_json = "1.0.82" smallvec = "1.8.0" -syn = "1.0.109" +syn = "2.0.38" tiny-skia-path = {version = "0.11.0"} unicode-bidi = "0.3.7" unicode-script = "0.5.4" diff --git a/macros/builtin/Cargo.toml b/macros/builtin/Cargo.toml index 7c9bc3ec1..5cfd1ffea 100644 --- a/macros/builtin/Cargo.toml +++ b/macros/builtin/Cargo.toml @@ -19,7 +19,4 @@ proc-macro = true proc-macro2.workspace = true quote.workspace = true smallvec.workspace = true - -[dependencies.syn] -features = ["full"] -version = "1.0.109" +syn ={ workspace=true, features = ["full"]} diff --git a/macros/builtin/src/lib.rs b/macros/builtin/src/lib.rs index e1aa40bbd..6a4b0e9f9 100644 --- a/macros/builtin/src/lib.rs +++ b/macros/builtin/src/lib.rs @@ -81,8 +81,8 @@ impl ToTokens for Item { Item::Field { doc_attr, mem, _colon, ty } => { let ty = quote! { #ty }.to_string(); let name = mem.to_string(); - let doc = match &doc_attr.lit { - syn::Lit::Str(str) => str, + let doc = match &doc_attr.value { + syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Str(str), .. }) => str, _ => unreachable!(), }; tokens.extend(quote! { @@ -96,8 +96,8 @@ impl ToTokens for Item { Item::Method { doc_attr, sign } => { let name = sign.ident.to_string(); let sign = sign.to_token_stream().to_string(); - let doc = match &doc_attr.lit { - syn::Lit::Str(str) => str, + let doc = match &doc_attr.value { + syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Str(str), .. }) => str, _ => unreachable!(), }; tokens.extend(quote! { diff --git a/macros/src/declare_derive2.rs b/macros/src/declare_derive2.rs index fc40f7c23..da2645d34 100644 --- a/macros/src/declare_derive2.rs +++ b/macros/src/declare_derive2.rs @@ -307,10 +307,9 @@ fn collect_filed_and_attrs(stt: &mut DataStruct) -> Result>(|pair| { let (field, comma) = pair.into_tuple(); - let idx = field - .attrs - .iter() - .position(|attr| attr.path.is_ident(DECLARE_ATTR)); + let idx = field.attrs.iter().position( + |attr| matches!(&attr.meta, syn::Meta::List(l) if l.path.is_ident(DECLARE_ATTR)), + ); let builder_attr = if let Some(idx) = idx { let attr = field.attrs.remove(idx); let args: DeclareAttr = attr.parse_args()?; diff --git a/macros/src/rdl_macro.rs b/macros/src/rdl_macro.rs index e88cebf8e..9280c1d61 100644 --- a/macros/src/rdl_macro.rs +++ b/macros/src/rdl_macro.rs @@ -14,7 +14,7 @@ use syn::{ parse_macro_input, parse_quote, punctuated::Punctuated, spanned::Spanned, - token::{Bang, Brace, Colon, Comma, Dollar}, + token::{Brace, Colon, Comma, Dollar, Not}, Expr, Ident, Macro, Path, Result as SynResult, Stmt, }; @@ -115,7 +115,7 @@ impl Parse for StructLiteral { break; } - if content.peek(kw::rdl) && content.peek2(Bang) { + if content.peek(kw::rdl) && content.peek2(Not) { children.push(content.parse()?); } else if content.peek(Ident) { let f: DeclareField = content.parse()?; @@ -142,7 +142,7 @@ impl Parse for StructLiteral { impl Parse for RdlParent { fn parse(input: ParseStream) -> SynResult { - if input.peek(kw::_dollar_ಠ_ಠ) && input.peek2(Bang) { + if input.peek(kw::_dollar_ಠ_ಠ) && input.peek2(Not) { let mac: Macro = input.parse()?; Ok(RdlParent::Var(mac.parse_body_with( diff --git a/macros/src/symbol_process.rs b/macros/src/symbol_process.rs index ef1f16f26..0fc1a43a1 100644 --- a/macros/src/symbol_process.rs +++ b/macros/src/symbol_process.rs @@ -103,7 +103,7 @@ mod tokens_pre_process { if at.as_char() == '@' && !matches!(tokens.last(), Some(TokenTree::Ident(_))) => { tokens.push(TokenTree::Ident(Ident::new(KW_RDL, at.span()))); - tokens.push(TokenTree::Punct(Punct::new('!', Spacing::Alone))); + tokens.push(not_token(at.span())); let body = match iter.next() { // declare a new widget: `@ SizedBox { ... }` @@ -147,7 +147,7 @@ mod tokens_pre_process { match iter.next() { Some(TokenTree::Ident(name)) => { tokens.push(TokenTree::Ident(Ident::new(KW_DOLLAR_STR, p.span()))); - tokens.push(TokenTree::Punct(Punct::new('!', Spacing::Alone))); + tokens.push(not_token(p.span())); let span = name.span(); let mut g = Group::new( Delimiter::Parenthesis, @@ -183,6 +183,12 @@ mod tokens_pre_process { }; p.as_char() == '!' } + + fn not_token(span: Span) -> TokenTree { + let mut t = Punct::new('!', Spacing::Alone); + t.set_span(span); + TokenTree::Punct(t) + } } impl Fold for DollarRefsCtx { @@ -204,11 +210,8 @@ impl Fold for DollarRefsCtx { fn fold_local(&mut self, mut i: syn::Local) -> syn::Local { // we fold right expression first, then fold pattern, because the `=` is a // right operator. - i.init = i - .init - .map(|(assign, e)| (assign, Box::new(self.fold_expr(*e)))); + i.init = i.init.map(|init| self.fold_local_init(init)); i.pat = self.fold_pat(i.pat); - i }