core: Remove unnecessary defined `#[no_dynamic]` `proc_macro_attribute`
This commit is contained in:
parent
c98c173c6b
commit
53347ed088
|
@ -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()
|
|
||||||
}
|
|
||||||
|
|
|
@ -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};
|
||||||
|
|
Loading…
Reference in New Issue