Skip to content

Commit

Permalink
fix: add checks to make sure structs aren't deriving Copy trait.
Browse files Browse the repository at this point in the history
  • Loading branch information
rzvxa committed Apr 15, 2024
1 parent 2e3504d commit 03548a4
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions crates/oxc_macros/src/ast_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,29 +25,36 @@ pub fn ast_node(mut item: Item) -> TokenStream2 {
}

fn modify_struct(item: &mut ItemStruct) -> NodeData {
println!("{:#?}", item.attrs);
validate_struct_attributes(item.attrs.iter());
NodeData { ident: &item.ident, generics: &item.generics }
}

fn modify_enum(item: &mut ItemEnum) -> NodeData {
validate_enum_attributes(item.attrs.iter());
NodeData { ident: &item.ident, generics: &item.generics }
}

fn validate_struct_attributes<'a>(mut attrs: slice::Iter<'a, Attribute>) {
// make sure that no structure derives Clone/Copy trait.
// TODO: It might fail if there is a manual Clone/Copy trait implemented for the struct.
assert!(!attrs.any(|attr| {
let args = attr.parse_args_with(Punctuated::<Meta, Token![,]>::parse_terminated);
attr.path().is_ident("derive")
&& args.is_ok_and(|args| args.iter().any(|arg| arg.path().is_ident("Clone")))
&& args.is_ok_and(|args| {
args.iter().any(|arg| arg.path().is_ident("Clone") || arg.path().is_ident("Copy"))
})
}));
}

fn validate_enum_attributes<'a>(_: slice::Iter<'a, Attribute>) {
// TODO: Later on we may want to enforce deriving clone and copy traits for all enum types
}

fn impl_traversable_test_trait(node: &NodeData) -> TokenStream2 {
let ident = node.ident;
let generics = node.generics;
quote! {
impl #generics crate::traverse::TraversableTest for #ident #generics {
}
impl #generics crate::traverse::TraversableTest for #ident #generics { }
}
}

Expand Down

0 comments on commit 03548a4

Please sign in to comment.