Skip to content

Commit f185e61

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

File tree

5 files changed

+27
-21
lines changed

5 files changed

+27
-21
lines changed

bindings_generator/src/api.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,9 +406,8 @@ impl Ty {
406406
}
407407
}
408408
ty => {
409-
let module = format_ident!("{}", module_name_from_class_name(ty));
410409
let ty = format_ident!("{}", ty);
411-
Ty::Object(syn::parse_quote! { crate::generated::#module::#ty })
410+
Ty::Object(syn::parse_quote! { crate::generated::#ty })
412411
}
413412
}
414413
}

bindings_generator/src/classes.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,22 @@ 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+
pub(crate) mod private {
19+
#class_doc
20+
#[allow(non_camel_case_types)]
21+
#[derive(Debug)]
22+
pub struct #class_name {
23+
#[allow(dead_code)]
24+
pub(crate) this: super::RawObject<Self>,
25+
}
2226
}
27+
use private::#class_name;
2328
}
2429
}
2530

bindings_generator/src/lib.rs

Lines changed: 11 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,23 @@ 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();
209+
write!(&mut buffer, "{}", quote! { struct StructWithDocs {} }).unwrap();
206210
validate_and_clear_buffer!(buffer);
207211

208-
let code = generate_class_struct(&class);
212+
let code = generate_class_struct(&class, class_doc);
209213
write!(&mut buffer, "{}", code).unwrap();
210214
validate_and_clear_buffer!(buffer);
211215

bindings_generator/src/special_methods.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,10 @@ 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());
158157
let base_class = format_ident!("{}", class.base_class);
159158

160159
let qualified_base_class = quote! {
161-
crate::generated::#base_class_module::#base_class
160+
crate::generated::#base_class
162161
};
163162

164163
quote! {
@@ -190,11 +189,10 @@ pub fn generate_sub_class_impls<'a>(api: &'a Api, mut class: &'a GodotClass) ->
190189
let mut tokens = TokenStream::new();
191190

192191
while let Some(base_class) = class.base_class(api) {
193-
let base_class_module = format_ident!("{}", base_class.module());
194192
let base_class_ident = format_ident!("{}", base_class.name);
195193

196194
tokens.extend(quote! {
197-
unsafe impl SubClass<crate::generated::#base_class_module::#base_class_ident> for #class_name {}
195+
unsafe impl SubClass<crate::generated::#base_class_ident> for #class_name {}
198196
});
199197

200198
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)