Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_render/macros/src/extract_component.rs
6596 views
1
use proc_macro::TokenStream;
2
use quote::quote;
3
use syn::{parse_macro_input, parse_quote, DeriveInput, Path};
4
5
pub fn derive_extract_component(input: TokenStream) -> TokenStream {
6
let mut ast = parse_macro_input!(input as DeriveInput);
7
let bevy_render_path: Path = crate::bevy_render_path();
8
let bevy_ecs_path: Path = bevy_macro_utils::BevyManifest::shared()
9
.maybe_get_path("bevy_ecs")
10
.expect("bevy_ecs should be found in manifest");
11
12
ast.generics
13
.make_where_clause()
14
.predicates
15
.push(parse_quote! { Self: Clone });
16
17
let struct_name = &ast.ident;
18
let (impl_generics, type_generics, where_clause) = &ast.generics.split_for_impl();
19
20
let filter = if let Some(attr) = ast
21
.attrs
22
.iter()
23
.find(|a| a.path().is_ident("extract_component_filter"))
24
{
25
let filter = match attr.parse_args::<syn::Type>() {
26
Ok(filter) => filter,
27
Err(e) => return e.to_compile_error().into(),
28
};
29
30
quote! {
31
#filter
32
}
33
} else {
34
quote! {
35
()
36
}
37
};
38
39
TokenStream::from(quote! {
40
impl #impl_generics #bevy_render_path::extract_component::ExtractComponent for #struct_name #type_generics #where_clause {
41
type QueryData = &'static Self;
42
43
type QueryFilter = #filter;
44
type Out = Self;
45
46
fn extract_component(item: #bevy_ecs_path::query::QueryItem<'_, '_, Self::QueryData>) -> Option<Self::Out> {
47
Some(item.clone())
48
}
49
}
50
})
51
}
52
53