From e9e63c057e6a2427bf7ac520db004f0d886e8c08 Mon Sep 17 00:00:00 2001 From: Andrew Walbran Date: Fri, 15 Dec 2023 12:42:58 +0000 Subject: Fix cargo build and remove proc-macro-error dependency. Test: Ran cargo2android.py Change-Id: Iab6c8d7f6b7a961c71d6f7329ca6646e83e9aa7d --- Android.bp | 1 - Cargo.toml | 4 +- patches/syn-2.patch | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/lib.rs | 88 ++++++++++++++------------ 4 files changed, 224 insertions(+), 47 deletions(-) diff --git a/Android.bp b/Android.bp index 30722b9..52facb1 100644 --- a/Android.bp +++ b/Android.bp @@ -25,7 +25,6 @@ rust_proc_macro { edition: "2018", rustlibs: [ "libproc_macro2", - "libproc_macro_error", "libquote", "libsyn", ], diff --git a/Cargo.toml b/Cargo.toml index 2e33871..388f042 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,8 +24,6 @@ repository = "https://git.sr.ht/~ireas/merge-rs/tree/master/merge_derive" [lib] proc-macro = true -[dependencies.proc-macro-error] -version = "1.0" [dependencies.proc-macro2] version = "1.0" @@ -34,4 +32,4 @@ version = "1.0" version = "1.0" [dependencies.syn] -version = "1.0" +version = "2.0" diff --git a/patches/syn-2.patch b/patches/syn-2.patch index 226c027..d1f6cde 100644 --- a/patches/syn-2.patch +++ b/patches/syn-2.patch @@ -1,8 +1,151 @@ +diff --git a/Cargo.toml b/Cargo.toml +index 2e33871..388f042 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -24,8 +24,6 @@ repository = "https://git.sr.ht/~ireas/merge-rs/tree/master/merge_derive" + + [lib] + proc-macro = true +-[dependencies.proc-macro-error] +-version = "1.0" + + [dependencies.proc-macro2] + version = "1.0" +@@ -34,4 +32,4 @@ version = "1.0" + version = "1.0" + + [dependencies.syn] +-version = "1.0" ++version = "2.0" diff --git a/src/lib.rs b/src/lib.rs -index 75732f9..3727bf6 100644 +index 75732f9..11f5b49 100644 --- a/src/lib.rs +++ b/src/lib.rs -@@ -119,7 +119,7 @@ impl<'a, I: Iterator> From for FieldAttrs { +@@ -11,9 +11,9 @@ + extern crate proc_macro; + + use proc_macro2::TokenStream; +-use proc_macro_error::{abort, abort_call_site, dummy::set_dummy, proc_macro_error, ResultExt}; + use quote::{quote, quote_spanned}; +-use syn::Token; ++use std::convert::TryFrom; ++use syn::{Error, Result, Token}; + + struct Field { + name: syn::Member, +@@ -33,48 +33,51 @@ enum FieldAttr { + } + + #[proc_macro_derive(Merge, attributes(merge))] +-#[proc_macro_error] + pub fn merge_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let ast = syn::parse(input).unwrap(); +- impl_merge(&ast).into() ++ impl_merge(&ast) ++ .unwrap_or_else(Error::into_compile_error) ++ .into() + } + +-fn impl_merge(ast: &syn::DeriveInput) -> TokenStream { ++fn impl_merge(ast: &syn::DeriveInput) -> Result { + let name = &ast.ident; + +- set_dummy(quote! { +- impl ::merge::Merge for #name { +- fn merge(&mut self, other: Self) { +- unimplemented!() +- } +- } +- }); +- + if let syn::Data::Struct(syn::DataStruct { ref fields, .. }) = ast.data { + impl_merge_for_struct(name, fields) + } else { +- abort_call_site!("merge::Merge can only be derived for structs") ++ Err(Error::new_spanned( ++ ast, ++ "merge::Merge can only be derived for structs", ++ )) + } + } + +-fn impl_merge_for_struct(name: &syn::Ident, fields: &syn::Fields) -> TokenStream { +- let assignments = gen_assignments(fields); ++fn impl_merge_for_struct(name: &syn::Ident, fields: &syn::Fields) -> Result { ++ let assignments = gen_assignments(fields)?; + +- quote! { ++ Ok(quote! { + impl ::merge::Merge for #name { + fn merge(&mut self, other: Self) { + #assignments + } + } +- } ++ }) + } + +-fn gen_assignments(fields: &syn::Fields) -> TokenStream { +- let fields = fields.iter().enumerate().map(Field::from); +- let assignments = fields.filter(|f| !f.attrs.skip).map(|f| gen_assignment(&f)); +- quote! { ++fn gen_assignments(fields: &syn::Fields) -> Result { ++ let fields = fields ++ .iter() ++ .enumerate() ++ .map(Field::try_from) ++ .collect::>>()?; ++ let assignments = fields ++ .iter() ++ .filter(|f| !f.attrs.skip) ++ .map(|f| gen_assignment(&f)); ++ Ok(quote! { + #( #assignments )* +- } ++ }) + } + + fn gen_assignment(field: &Field) -> TokenStream { +@@ -88,48 +91,48 @@ fn gen_assignment(field: &Field) -> TokenStream { + } + } + +-impl From<(usize, &syn::Field)> for Field { +- fn from(data: (usize, &syn::Field)) -> Self { ++impl TryFrom<(usize, &syn::Field)> for Field { ++ type Error = syn::Error; ++ ++ fn try_from(data: (usize, &syn::Field)) -> std::result::Result { + use syn::spanned::Spanned; + + let (index, field) = data; +- Field { ++ Ok(Field { + name: if let Some(ident) = &field.ident { + syn::Member::Named(ident.clone()) + } else { + syn::Member::Unnamed(index.into()) + }, + span: field.span(), +- attrs: field.attrs.iter().into(), +- } ++ attrs: FieldAttrs::new(field.attrs.iter())?, ++ }) + } + } + + impl FieldAttrs { +- fn apply(&mut self, attr: FieldAttr) { +- match attr { +- FieldAttr::Skip => self.skip = true, +- FieldAttr::Strategy(path) => self.strategy = Some(path), +- } +- } +-} +- +-impl<'a, I: Iterator> From for FieldAttrs { +- fn from(iter: I) -> Self { ++ fn new<'a, I: Iterator>(iter: I) -> Result { let mut field_attrs = Self::default(); for attr in iter { @@ -11,3 +154,34 @@ index 75732f9..3727bf6 100644 continue; } + let parser = syn::punctuated::Punctuated::::parse_terminated; +- for attr in attr.parse_args_with(parser).unwrap_or_abort() { ++ for attr in attr.parse_args_with(parser)? { + field_attrs.apply(attr); + } + } + +- field_attrs ++ Ok(field_attrs) ++ } ++ ++ fn apply(&mut self, attr: FieldAttr) { ++ match attr { ++ FieldAttr::Skip => self.skip = true, ++ FieldAttr::Strategy(path) => self.strategy = Some(path), ++ } + } + } + +@@ -144,7 +147,10 @@ impl syn::parse::Parse for FieldAttr { + let path: syn::Path = input.parse()?; + Ok(FieldAttr::Strategy(path)) + } else { +- abort!(name, "Unexpected attribute: {}", name) ++ Err(Error::new_spanned( ++ &name, ++ format!("Unexpected attribute: {}", name), ++ )) + } + } + } diff --git a/src/lib.rs b/src/lib.rs index 3727bf6..11f5b49 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,9 +11,9 @@ extern crate proc_macro; use proc_macro2::TokenStream; -use proc_macro_error::{abort, abort_call_site, dummy::set_dummy, proc_macro_error, ResultExt}; use quote::{quote, quote_spanned}; -use syn::Token; +use std::convert::TryFrom; +use syn::{Error, Result, Token}; struct Field { name: syn::Member, @@ -33,48 +33,51 @@ enum FieldAttr { } #[proc_macro_derive(Merge, attributes(merge))] -#[proc_macro_error] pub fn merge_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let ast = syn::parse(input).unwrap(); - impl_merge(&ast).into() + impl_merge(&ast) + .unwrap_or_else(Error::into_compile_error) + .into() } -fn impl_merge(ast: &syn::DeriveInput) -> TokenStream { +fn impl_merge(ast: &syn::DeriveInput) -> Result { let name = &ast.ident; - set_dummy(quote! { - impl ::merge::Merge for #name { - fn merge(&mut self, other: Self) { - unimplemented!() - } - } - }); - if let syn::Data::Struct(syn::DataStruct { ref fields, .. }) = ast.data { impl_merge_for_struct(name, fields) } else { - abort_call_site!("merge::Merge can only be derived for structs") + Err(Error::new_spanned( + ast, + "merge::Merge can only be derived for structs", + )) } } -fn impl_merge_for_struct(name: &syn::Ident, fields: &syn::Fields) -> TokenStream { - let assignments = gen_assignments(fields); +fn impl_merge_for_struct(name: &syn::Ident, fields: &syn::Fields) -> Result { + let assignments = gen_assignments(fields)?; - quote! { + Ok(quote! { impl ::merge::Merge for #name { fn merge(&mut self, other: Self) { #assignments } } - } + }) } -fn gen_assignments(fields: &syn::Fields) -> TokenStream { - let fields = fields.iter().enumerate().map(Field::from); - let assignments = fields.filter(|f| !f.attrs.skip).map(|f| gen_assignment(&f)); - quote! { +fn gen_assignments(fields: &syn::Fields) -> Result { + let fields = fields + .iter() + .enumerate() + .map(Field::try_from) + .collect::>>()?; + let assignments = fields + .iter() + .filter(|f| !f.attrs.skip) + .map(|f| gen_assignment(&f)); + Ok(quote! { #( #assignments )* - } + }) } fn gen_assignment(field: &Field) -> TokenStream { @@ -88,34 +91,27 @@ fn gen_assignment(field: &Field) -> TokenStream { } } -impl From<(usize, &syn::Field)> for Field { - fn from(data: (usize, &syn::Field)) -> Self { +impl TryFrom<(usize, &syn::Field)> for Field { + type Error = syn::Error; + + fn try_from(data: (usize, &syn::Field)) -> std::result::Result { use syn::spanned::Spanned; let (index, field) = data; - Field { + Ok(Field { name: if let Some(ident) = &field.ident { syn::Member::Named(ident.clone()) } else { syn::Member::Unnamed(index.into()) }, span: field.span(), - attrs: field.attrs.iter().into(), - } + attrs: FieldAttrs::new(field.attrs.iter())?, + }) } } impl FieldAttrs { - fn apply(&mut self, attr: FieldAttr) { - match attr { - FieldAttr::Skip => self.skip = true, - FieldAttr::Strategy(path) => self.strategy = Some(path), - } - } -} - -impl<'a, I: Iterator> From for FieldAttrs { - fn from(iter: I) -> Self { + fn new<'a, I: Iterator>(iter: I) -> Result { let mut field_attrs = Self::default(); for attr in iter { @@ -124,12 +120,19 @@ impl<'a, I: Iterator> From for FieldAttrs { } let parser = syn::punctuated::Punctuated::::parse_terminated; - for attr in attr.parse_args_with(parser).unwrap_or_abort() { + for attr in attr.parse_args_with(parser)? { field_attrs.apply(attr); } } - field_attrs + Ok(field_attrs) + } + + fn apply(&mut self, attr: FieldAttr) { + match attr { + FieldAttr::Skip => self.skip = true, + FieldAttr::Strategy(path) => self.strategy = Some(path), + } } } @@ -144,7 +147,10 @@ impl syn::parse::Parse for FieldAttr { let path: syn::Path = input.parse()?; Ok(FieldAttr::Strategy(path)) } else { - abort!(name, "Unexpected attribute: {}", name) + Err(Error::new_spanned( + &name, + format!("Unexpected attribute: {}", name), + )) } } } -- cgit v1.2.3