Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_reflect/derive/src/impls/tuple_structs.rs
9374 views
1
use crate::{
2
impls::{common_partial_reflect_methods, impl_full_reflect, impl_type_path, impl_typed},
3
struct_utility::FieldAccessors,
4
ReflectStruct,
5
};
6
use bevy_macro_utils::fq_std::{FQDefault, FQOption, FQResult};
7
use quote::{quote, ToTokens};
8
9
/// Implements `TupleStruct`, `GetTypeRegistration`, and `Reflect` for the given derive data.
10
pub(crate) fn impl_tuple_struct(reflect_struct: &ReflectStruct) -> proc_macro2::TokenStream {
11
let fqoption = FQOption.into_token_stream();
12
13
let bevy_reflect_path = reflect_struct.meta().bevy_reflect_path();
14
let struct_path = reflect_struct.meta().type_path();
15
16
let FieldAccessors {
17
fields_ref,
18
fields_mut,
19
field_indices,
20
field_count,
21
..
22
} = FieldAccessors::new(reflect_struct);
23
24
let where_clause_options = reflect_struct.where_clause_options();
25
let get_type_registration_impl = reflect_struct.get_type_registration(&where_clause_options);
26
27
let typed_impl = impl_typed(&where_clause_options, reflect_struct.to_info_tokens(true));
28
29
let type_path_impl = impl_type_path(reflect_struct.meta());
30
let full_reflect_impl = impl_full_reflect(&where_clause_options);
31
let common_methods = common_partial_reflect_methods(
32
reflect_struct.meta(),
33
|| Some(quote!(#bevy_reflect_path::tuple_struct::tuple_struct_partial_eq)),
34
|| None,
35
|| Some(quote!(#bevy_reflect_path::tuple_struct::tuple_struct_partial_cmp)),
36
);
37
let clone_fn = reflect_struct.get_clone_impl();
38
39
#[cfg(not(feature = "functions"))]
40
let function_impls = None::<proc_macro2::TokenStream>;
41
#[cfg(feature = "functions")]
42
let function_impls = crate::impls::impl_function_traits(&where_clause_options);
43
44
let (impl_generics, ty_generics, where_clause) = reflect_struct
45
.meta()
46
.type_path()
47
.generics()
48
.split_for_impl();
49
50
#[cfg(not(feature = "auto_register"))]
51
let auto_register = None::<proc_macro2::TokenStream>;
52
#[cfg(feature = "auto_register")]
53
let auto_register = crate::impls::reflect_auto_registration(reflect_struct.meta());
54
55
let where_reflect_clause = where_clause_options.extend_where_clause(where_clause);
56
57
quote! {
58
#get_type_registration_impl
59
60
#typed_impl
61
62
#type_path_impl
63
64
#full_reflect_impl
65
66
#function_impls
67
68
#auto_register
69
70
impl #impl_generics #bevy_reflect_path::tuple_struct::TupleStruct for #struct_path #ty_generics #where_reflect_clause {
71
fn field(&self, index: usize) -> #FQOption<&dyn #bevy_reflect_path::PartialReflect> {
72
match index {
73
#(#field_indices => #fqoption::Some(#fields_ref),)*
74
_ => #FQOption::None,
75
}
76
}
77
78
fn field_mut(&mut self, index: usize) -> #FQOption<&mut dyn #bevy_reflect_path::PartialReflect> {
79
match index {
80
#(#field_indices => #fqoption::Some(#fields_mut),)*
81
_ => #FQOption::None,
82
}
83
}
84
#[inline]
85
fn field_len(&self) -> usize {
86
#field_count
87
}
88
#[inline]
89
fn iter_fields(&self) -> #bevy_reflect_path::tuple_struct::TupleStructFieldIter {
90
#bevy_reflect_path::tuple_struct::TupleStructFieldIter::new(self)
91
}
92
93
fn to_dynamic_tuple_struct(&self) -> #bevy_reflect_path::tuple_struct::DynamicTupleStruct {
94
let mut dynamic: #bevy_reflect_path::tuple_struct::DynamicTupleStruct = #FQDefault::default();
95
dynamic.set_represented_type(#bevy_reflect_path::PartialReflect::get_represented_type_info(self));
96
#(dynamic.insert_boxed(#bevy_reflect_path::PartialReflect::to_dynamic(#fields_ref));)*
97
dynamic
98
}
99
}
100
101
impl #impl_generics #bevy_reflect_path::PartialReflect for #struct_path #ty_generics #where_reflect_clause {
102
#[inline]
103
fn get_represented_type_info(&self) -> #FQOption<&'static #bevy_reflect_path::TypeInfo> {
104
#FQOption::Some(<Self as #bevy_reflect_path::Typed>::type_info())
105
}
106
107
#[inline]
108
fn try_apply(
109
&mut self,
110
value: &dyn #bevy_reflect_path::PartialReflect
111
) -> #FQResult<(), #bevy_reflect_path::ApplyError> {
112
if let #bevy_reflect_path::ReflectRef::TupleStruct(struct_value) =
113
#bevy_reflect_path::PartialReflect::reflect_ref(value) {
114
for (i, value) in ::core::iter::Iterator::enumerate(#bevy_reflect_path::tuple_struct::TupleStruct::iter_fields(struct_value)) {
115
if let #FQOption::Some(v) = #bevy_reflect_path::tuple_struct::TupleStruct::field_mut(self, i) {
116
#bevy_reflect_path::PartialReflect::try_apply(v, value)?;
117
}
118
}
119
} else {
120
return #FQResult::Err(
121
#bevy_reflect_path::ApplyError::MismatchedKinds {
122
from_kind: #bevy_reflect_path::PartialReflect::reflect_kind(value),
123
to_kind: #bevy_reflect_path::ReflectKind::TupleStruct,
124
}
125
);
126
}
127
#FQResult::Ok(())
128
}
129
#[inline]
130
fn reflect_kind(&self) -> #bevy_reflect_path::ReflectKind {
131
#bevy_reflect_path::ReflectKind::TupleStruct
132
}
133
#[inline]
134
fn reflect_ref(&self) -> #bevy_reflect_path::ReflectRef {
135
#bevy_reflect_path::ReflectRef::TupleStruct(self)
136
}
137
#[inline]
138
fn reflect_mut(&mut self) -> #bevy_reflect_path::ReflectMut {
139
#bevy_reflect_path::ReflectMut::TupleStruct(self)
140
}
141
#[inline]
142
fn reflect_owned(self: #bevy_reflect_path::__macro_exports::alloc_utils::Box<Self>) -> #bevy_reflect_path::ReflectOwned {
143
#bevy_reflect_path::ReflectOwned::TupleStruct(self)
144
}
145
146
#common_methods
147
148
#clone_fn
149
}
150
}
151
}
152
153