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
9374 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(|manifest| {
9
manifest
10
.maybe_get_path("bevy_ecs")
11
.expect("bevy_ecs should be found in manifest")
12
});
13
14
ast.generics
15
.make_where_clause()
16
.predicates
17
.push(parse_quote! { Self: Clone });
18
19
let struct_name = &ast.ident;
20
let (impl_generics, type_generics, where_clause) = &ast.generics.split_for_impl();
21
22
let filter = if let Some(attr) = ast
23
.attrs
24
.iter()
25
.find(|a| a.path().is_ident("extract_component_filter"))
26
{
27
let filter = match attr.parse_args::<syn::Type>() {
28
Ok(filter) => filter,
29
Err(e) => return e.to_compile_error().into(),
30
};
31
32
quote! {
33
#filter
34
}
35
} else {
36
quote! {
37
()
38
}
39
};
40
41
TokenStream::from(quote! {
42
impl #impl_generics #bevy_render_path::sync_component::SyncComponent for #struct_name #type_generics #where_clause {
43
type Out = Self;
44
}
45
46
impl #impl_generics #bevy_render_path::extract_component::ExtractComponent for #struct_name #type_generics #where_clause {
47
type QueryData = &'static Self;
48
49
type QueryFilter = #filter;
50
51
fn extract_component(item: #bevy_ecs_path::query::QueryItem<'_, '_, Self::QueryData>) -> Option<Self::Out> {
52
Some(item.clone())
53
}
54
}
55
})
56
}
57
58