Skip to content

Commit 466d43d

Browse files
committed
Avoid duplicate symbols in gdnative::api; inner modules only have additional types (not the API class itself)
1 parent 40cb288 commit 466d43d

File tree

5 files changed

+33
-21
lines changed

5 files changed

+33
-21
lines changed

bindings_generator/src/api.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,9 +406,10 @@ impl Ty {
406406
}
407407
}
408408
ty => {
409-
let module = format_ident!("{}", module_name_from_class_name(ty));
409+
//let module = format_ident!("{}", module_name_from_class_name(ty));
410410
let ty = format_ident!("{}", ty);
411-
Ty::Object(syn::parse_quote! { crate::generated::#module::#ty })
411+
//Ty::Object(syn::parse_quote! { crate::generated::#module::#ty })
412+
Ty::Object(syn::parse_quote! { crate::generated::#ty })
412413
}
413414
}
414415
}

bindings_generator/src/classes.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,23 @@ use quote::{format_ident, quote};
99

1010
use std::collections::HashMap;
1111

12-
pub(crate) fn generate_class_struct(class: &GodotClass) -> TokenStream {
12+
pub(crate) fn generate_class_struct(class: &GodotClass, class_doc: TokenStream) -> TokenStream {
1313
let class_name = format_ident!("{}", &class.name);
1414

1515
// dead_code: 'this' might not be read
16+
// mod private: hide the type in the #module_name module, export it only in gdnative::api
1617
quote! {
17-
#[allow(non_camel_case_types)]
18-
#[derive(Debug)]
19-
pub struct #class_name {
20-
#[allow(dead_code)]
21-
this: RawObject<Self>,
18+
#[doc(hidden)]
19+
pub(crate) mod private {
20+
#class_doc
21+
#[allow(non_camel_case_types)]
22+
#[derive(Debug)]
23+
pub struct #class_name {
24+
#[allow(dead_code)]
25+
pub(crate) this: super::RawObject<Self>,
26+
}
2227
}
28+
use private::#class_name;
2329
}
2430
}
2531

bindings_generator/src/lib.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,8 @@ fn generate_class_bindings(
8484
) -> TokenStream {
8585
// types and methods
8686
let types_and_methods = {
87-
let documentation = generate_class_documentation(api, class);
88-
89-
let class_struct = generate_class_struct(class);
87+
let class_doc = generate_class_documentation(api, class);
88+
let class_struct = generate_class_struct(class, class_doc);
9089

9190
let enums = generate_enums(class);
9291

@@ -99,7 +98,6 @@ fn generate_class_bindings(
9998
let class_impl = generate_class_impl(class, icalls, docs);
10099

101100
quote! {
102-
#documentation
103101
#class_struct
104102
#enums
105103
#constants
@@ -195,17 +193,22 @@ pub(crate) mod test_prelude {
195193

196194
#[test]
197195
fn sanity_test_generated_code() {
196+
// Tests whether each generated snippet individually constitutes a valid AST representation of Rust code
197+
198198
let api = Api::new(include_str!("../../gdnative-bindings/api.json"));
199199
let mut buffer = BufWriter::new(Vec::with_capacity(16384));
200200
for class in &api.classes {
201201
let mut icalls = HashMap::new();
202202

203-
let code = generate_class_documentation(&api, &class);
203+
let code = generate_module_doc(&class);
204+
write!(&mut buffer, "{}", code).unwrap();
205+
validate_and_clear_buffer!(buffer);
206+
207+
let class_doc = generate_class_documentation(&api, &class);
204208
write!(&mut buffer, "{}", code).unwrap();
205-
write!(&mut buffer, "{}", quote! { struct Docs {} }).unwrap();
206209
validate_and_clear_buffer!(buffer);
207210

208-
let code = generate_class_struct(&class);
211+
let code = generate_class_struct(&class, class_doc);
209212
write!(&mut buffer, "{}", code).unwrap();
210213
validate_and_clear_buffer!(buffer);
211214

bindings_generator/src/special_methods.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,12 @@ pub fn generate_deref_impl(class: &GodotClass) -> TokenStream {
154154
);
155155

156156
let class_name = format_ident!("{}", class.name);
157-
let base_class_module = format_ident!("{}", class.base_class_module());
157+
//let base_class_module = format_ident!("{}", class.base_class_module());
158158
let base_class = format_ident!("{}", class.base_class);
159159

160+
//crate::generated::#base_class_module::#base_class
160161
let qualified_base_class = quote! {
161-
crate::generated::#base_class_module::#base_class
162+
crate::generated::#base_class
162163
};
163164

164165
quote! {
@@ -190,11 +191,12 @@ pub fn generate_sub_class_impls<'a>(api: &'a Api, mut class: &'a GodotClass) ->
190191
let mut tokens = TokenStream::new();
191192

192193
while let Some(base_class) = class.base_class(api) {
193-
let base_class_module = format_ident!("{}", base_class.module());
194+
//let base_class_module = format_ident!("{}", base_class.module());
194195
let base_class_ident = format_ident!("{}", base_class.name);
195196

197+
//unsafe impl SubClass<crate::generated::#base_class_module::#base_class_ident> for #class_name {}
196198
tokens.extend(quote! {
197-
unsafe impl SubClass<crate::generated::#base_class_module::#base_class_ident> for #class_name {}
199+
unsafe impl SubClass<crate::generated::#base_class_ident> for #class_name {}
198200
});
199201

200202
class = base_class;

gdnative-bindings/build.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ fn generate(
5858
use super::*;
5959
{content}
6060
}}
61-
pub use crate::generated::{mod_name}::{class_name};
61+
pub use crate::generated::{mod_name}::private::{class_name};
6262
"#,
6363
mod_name = module_name_from_class_name(class_name),
6464
class_name = class_name,
@@ -101,7 +101,7 @@ fn generate(
101101
r#"
102102
#[path = {:?}]
103103
pub mod {mod_name};
104-
pub use crate::generated::{mod_name}::{class_name};
104+
pub use crate::generated::{mod_name}::private::{class_name};
105105
"#,
106106
mod_path.display(),
107107
mod_name = mod_name,

0 commit comments

Comments
 (0)