core: Remove unnecessary defined `#[no_dynamic]` `proc_macro_attribute`

This commit is contained in:
Lord-McSweeney 2024-08-05 11:24:43 -07:00 committed by Lord-McSweeney
parent c98c173c6b
commit 53347ed088
2 changed files with 31 additions and 25 deletions

View File

@ -4,7 +4,7 @@ use proc_macro::TokenStream;
use quote::quote; use quote::quote;
use syn::{ use syn::{
parse_macro_input, parse_quote, FnArg, ImplItem, ImplItemFn, ItemEnum, ItemTrait, Meta, Pat, parse_macro_input, parse_quote, FnArg, ImplItem, ImplItemFn, ItemEnum, ItemTrait, Meta, Pat,
TraitItem, TraitItemFn, Visibility, TraitItem, Visibility,
}; };
/// `enum_trait_object` will define an enum whose variants each implement a trait. /// `enum_trait_object` will define an enum whose variants each implement a trait.
@ -35,7 +35,7 @@ use syn::{
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn enum_trait_object(args: TokenStream, item: TokenStream) -> TokenStream { pub fn enum_trait_object(args: TokenStream, item: TokenStream) -> TokenStream {
// Parse the input. // Parse the input.
let input_trait = parse_macro_input!(item as ItemTrait); let mut input_trait = parse_macro_input!(item as ItemTrait);
let trait_name = &input_trait.ident; let trait_name = &input_trait.ident;
let trait_generics = &input_trait.generics; let trait_generics = &input_trait.generics;
let enum_input = parse_macro_input!(args as ItemEnum); let enum_input = parse_macro_input!(args as ItemEnum);
@ -62,21 +62,38 @@ pub fn enum_trait_object(args: TokenStream, item: TokenStream) -> TokenStream {
// to the underlying type. // to the underlying type.
let trait_methods: Vec<_> = input_trait let trait_methods: Vec<_> = input_trait
.items .items
.iter() .iter_mut()
.filter_map(|item| match item { .filter_map(|item| match item {
TraitItem::Fn(method) => { TraitItem::Fn(ref mut method) => {
let method_name = &method.sig.ident; let method_name = &method.sig.ident;
let is_no_dynamic = method.attrs.iter().any(|attr| match &attr.meta { let mut is_no_dynamic = false;
Meta::Path(path) => {
if let Some(ident) = path.get_ident() { let new_attrs = method
ident == "no_dynamic" .attrs
} else { .iter()
false .filter(|attr| match &attr.meta {
Meta::Path(path) => {
if let Some(ident) = path.get_ident() {
if ident == "no_dynamic" {
is_no_dynamic = true;
// Remove the #[no_dynamic] attribute from the
// list of method attributes.
false
} else {
true
}
} else {
true
}
} }
} _ => true,
_ => false, })
}); .map(|o| o.clone())
.collect::<Vec<_>>();
method.attrs = new_attrs;
if is_no_dynamic { if is_no_dynamic {
// Don't create this method as a dynamic-dispatch method // Don't create this method as a dynamic-dispatch method
@ -166,14 +183,3 @@ pub fn enum_trait_object(args: TokenStream, item: TokenStream) -> TokenStream {
out.into() out.into()
} }
#[proc_macro_attribute]
pub fn no_dynamic(_args: TokenStream, item: TokenStream) -> TokenStream {
let input_fn = parse_macro_input!(item as TraitItemFn);
let out = quote!(
#input_fn
);
out.into()
}

View File

@ -23,7 +23,7 @@ use crate::html::TextFormat;
use crate::streams::NetStream; use crate::streams::NetStream;
use crate::string::AvmString; use crate::string::AvmString;
use gc_arena::{lock::RefLock, Collect, Gc, Mutation}; use gc_arena::{lock::RefLock, Collect, Gc, Mutation};
use ruffle_macros::{enum_trait_object, no_dynamic}; use ruffle_macros::enum_trait_object;
use std::cell::{Ref, RefMut}; use std::cell::{Ref, RefMut};
use std::fmt::Debug; use std::fmt::Debug;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};