Skip to content

Commit 7326bc0

Browse files
committed
fix derive macro
1 parent b3a03e0 commit 7326bc0

File tree

5 files changed

+36
-15
lines changed

5 files changed

+36
-15
lines changed

crates/bevy_crevice/bevy-crevice-derive/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ proc-macro = true
2424
syn = "1.0.40"
2525
quote = "1.0.7"
2626
proc-macro2 = "1.0.21"
27+
bevy_macro_utils = { path = "../../bevy_macro_utils", version = "0.5.0" }

crates/bevy_crevice/bevy-crevice-derive/src/glsl.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1+
use bevy_macro_utils::BevyManifest;
12
use proc_macro2::{Literal, TokenStream};
23
use quote::quote;
34
use syn::{parse_quote, Data, DeriveInput, Fields, Path};
45

56
pub fn emit(input: DeriveInput) -> TokenStream {
7+
let bevy_prefix_path = BevyManifest::default()
8+
.maybe_get_path(crate::BEVY_RENDER)
9+
.unwrap_or_else(|| Path {
10+
leading_colon: None,
11+
segments: Default::default(),
12+
});
13+
614
let fields = match &input.data {
715
Data::Struct(data) => match &data.fields {
816
Fields::Named(fields) => fields,
@@ -12,8 +20,8 @@ pub fn emit(input: DeriveInput) -> TokenStream {
1220
Data::Enum(_) | Data::Union(_) => panic!("Only structs are supported"),
1321
};
1422

15-
let base_trait_path: Path = parse_quote!(::bevy_crevice::glsl::Glsl);
16-
let struct_trait_path: Path = parse_quote!(::bevy_crevice::glsl::GlslStruct);
23+
let base_trait_path: Path = parse_quote!(#bevy_prefix_path::bevy_crevice::glsl::Glsl);
24+
let struct_trait_path: Path = parse_quote!(#bevy_prefix_path::bevy_crevice::glsl::GlslStruct);
1725

1826
let name = input.ident;
1927
let name_str = Literal::string(&name.to_string());
@@ -23,14 +31,14 @@ pub fn emit(input: DeriveInput) -> TokenStream {
2331
let glsl_fields = fields.named.iter().map(|field| {
2432
let field_ty = &field.ty;
2533
let field_name_str = Literal::string(&field.ident.as_ref().unwrap().to_string());
26-
let field_as = quote! {<#field_ty as ::bevy_crevice::glsl::GlslArray>};
34+
let field_as = quote! {<#field_ty as #bevy_prefix_path::bevy_crevice::glsl::GlslArray>};
2735

2836
quote! {
2937
s.push_str("\t");
3038
s.push_str(#field_as::NAME);
3139
s.push_str(" ");
3240
s.push_str(#field_name_str);
33-
<#field_as::ArraySize as ::bevy_crevice::glsl::DimensionList>::push_to_string(s);
41+
<#field_as::ArraySize as #bevy_prefix_path::bevy_crevice::glsl::DimensionList>::push_to_string(s);
3442
s.push_str(";\n");
3543
}
3644
});

crates/bevy_crevice/bevy-crevice-derive/src/layout.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use bevy_macro_utils::BevyManifest;
12
use proc_macro2::{Span, TokenStream};
23
use quote::{format_ident, quote};
34
use syn::{parse_quote, Data, DeriveInput, Fields, Ident, Path, Type};
@@ -8,10 +9,17 @@ pub fn emit(
89
mod_name: &'static str,
910
min_struct_alignment: usize,
1011
) -> TokenStream {
12+
let bevy_prefix_path = BevyManifest::default()
13+
.maybe_get_path(crate::BEVY_RENDER)
14+
.unwrap_or_else(|| Path {
15+
leading_colon: None,
16+
segments: Default::default(),
17+
});
18+
1119
let mod_name = Ident::new(mod_name, Span::call_site());
1220
let trait_name = Ident::new(trait_name, Span::call_site());
1321

14-
let mod_path: Path = parse_quote!(::bevy_crevice::#mod_name);
22+
let mod_path: Path = parse_quote!(#bevy_prefix_path::bevy_crevice::#mod_name);
1523
let trait_path: Path = parse_quote!(#mod_path::#trait_name);
1624

1725
let as_trait_name = format_ident!("As{}", trait_name);
@@ -63,7 +71,7 @@ pub fn emit(
6371

6472
let field_alignments = fields.iter().map(|field| layout_alignment_of_ty(&field.ty));
6573
let struct_alignment = quote! {
66-
::bevy_crevice::internal::max_arr([
74+
#bevy_prefix_path::bevy_crevice::internal::max_arr([
6775
#min_struct_alignment,
6876
#(#field_alignments,)*
6977
])
@@ -139,13 +147,13 @@ pub fn emit(
139147
// We set our target alignment to the larger of the
140148
// alignment due to the previous field and the alignment
141149
// requirement of the next field.
142-
let alignment = ::bevy_crevice::internal::max(
150+
let alignment = #bevy_prefix_path::bevy_crevice::internal::max(
143151
#next_field_or_self_alignment,
144152
min_alignment,
145153
);
146154

147155
// Using everything we've got, compute our padding amount.
148-
::bevy_crevice::internal::align_offset(starting_offset, alignment)
156+
#bevy_prefix_path::bevy_crevice::internal::align_offset(starting_offset, alignment)
149157
}
150158
}
151159
})
@@ -222,7 +230,7 @@ pub fn emit(
222230
let size = ::core::mem::size_of::<Self>();
223231
let align = <Self as #trait_path>::ALIGNMENT;
224232

225-
let zeroed: Self = ::bevy_crevice::internal::bytemuck::Zeroable::zeroed();
233+
let zeroed: Self = #bevy_prefix_path::bevy_crevice::internal::bytemuck::Zeroable::zeroed();
226234

227235
#[derive(Debug)]
228236
struct Field {
@@ -253,13 +261,13 @@ pub fn emit(
253261
#pad_fn_impls
254262
#struct_definition
255263

256-
unsafe impl #impl_generics ::bevy_crevice::internal::bytemuck::Zeroable for #generated_name #ty_generics #where_clause {}
257-
unsafe impl #impl_generics ::bevy_crevice::internal::bytemuck::Pod for #generated_name #ty_generics #where_clause {}
264+
unsafe impl #impl_generics #bevy_prefix_path::bevy_crevice::internal::bytemuck::Zeroable for #generated_name #ty_generics #where_clause {}
265+
unsafe impl #impl_generics #bevy_prefix_path::bevy_crevice::internal::bytemuck::Pod for #generated_name #ty_generics #where_clause {}
258266

259267
unsafe impl #impl_generics #mod_path::#trait_name for #generated_name #ty_generics #where_clause {
260268
const ALIGNMENT: usize = #struct_alignment;
261269
const PAD_AT_END: bool = true;
262-
type Padded = #padded_path<Self, {::bevy_crevice::internal::align_offset(
270+
type Padded = #padded_path<Self, {#bevy_prefix_path::bevy_crevice::internal::align_offset(
263271
::core::mem::size_of::<#generated_name>(),
264272
#struct_alignment
265273
)}>;
@@ -272,7 +280,7 @@ pub fn emit(
272280
Self::Output {
273281
#generated_struct_field_init
274282

275-
..::bevy_crevice::internal::bytemuck::Zeroable::zeroed()
283+
..#bevy_prefix_path::bevy_crevice::internal::bytemuck::Zeroable::zeroed()
276284
}
277285
}
278286

crates/bevy_crevice/bevy-crevice-derive/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ pub fn derive_glsl_struct(input: CompilerTokenStream) -> CompilerTokenStream {
2828

2929
CompilerTokenStream::from(expanded)
3030
}
31+
32+
const BEVY_RENDER: &str = "bevy_render";

crates/bevy_macro_utils/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl Default for BevyManifest {
3030
}
3131

3232
impl BevyManifest {
33-
pub fn get_path(&self, name: &str) -> syn::Path {
33+
pub fn maybe_get_path(&self, name: &str) -> Option<syn::Path> {
3434
const BEVY: &str = "bevy";
3535
const BEVY_INTERNAL: &str = "bevy_internal";
3636

@@ -57,7 +57,9 @@ impl BevyManifest {
5757

5858
deps.and_then(find_in_deps)
5959
.or_else(|| deps_dev.and_then(find_in_deps))
60-
.unwrap_or_else(|| get_path(name))
60+
}
61+
pub fn get_path(&self, name: &str) -> syn::Path {
62+
self.maybe_get_path(name).unwrap_or_else(|| get_path(name))
6163
}
6264
}
6365

0 commit comments

Comments
 (0)