Skip to content

Commit 0a0a3f5

Browse files
committed
added warning messages for when negative bitfields are encountered
1 parent 36adfe8 commit 0a0a3f5

File tree

8 files changed

+177
-108
lines changed

8 files changed

+177
-108
lines changed

godot-codegen/src/generator/builtins.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@ pub fn generate_builtin_class_files(
3333
ctx: &mut Context,
3434
gen_path: &Path,
3535
submit_fn: &mut SubmitFn,
36-
) {
36+
) -> String {
3737
let _ = std::fs::remove_dir_all(gen_path);
3838
std::fs::create_dir_all(gen_path).expect("create classes directory");
3939

40+
let mut warning = String::new();
4041
let mut modules = vec![];
4142
for class in api.builtins.iter() {
4243
let Some(class) = class.builtin_class.as_ref() else {
@@ -46,7 +47,8 @@ pub fn generate_builtin_class_files(
4647
// let godot_class_name = &class.name().godot_ty;
4748
let module_name = class.mod_name();
4849

49-
let generated_class = make_builtin_class(class, ctx);
50+
let (generated_class, warn) = make_builtin_class(class, ctx);
51+
warning.push_str(&warn);
5052
let file_contents = generated_class.code;
5153

5254
let out_path = gen_path.join(format!("{}.rs", module_name.rust_mod));
@@ -63,6 +65,7 @@ pub fn generate_builtin_class_files(
6365
let mod_contents = make_builtin_module_file(modules);
6466

6567
submit_fn(out_path, mod_contents);
68+
warning
6669
}
6770

6871
pub fn make_builtin_module_file(classes_and_modules: Vec<GeneratedBuiltinModule>) -> TokenStream {
@@ -87,7 +90,7 @@ pub fn make_builtin_module_file(classes_and_modules: Vec<GeneratedBuiltinModule>
8790
// ----------------------------------------------------------------------------------------------------------------------------------------------
8891
// Implementation
8992

90-
fn make_builtin_class(class: &BuiltinClass, ctx: &mut Context) -> GeneratedBuiltin {
93+
fn make_builtin_class(class: &BuiltinClass, ctx: &mut Context) -> (GeneratedBuiltin, String) {
9194
let godot_name = &class.name().godot_ty;
9295

9396
let RustTy::BuiltinIdent(outer_class) = conv::to_rust_type(godot_name, None, ctx) else {
@@ -101,7 +104,7 @@ fn make_builtin_class(class: &BuiltinClass, ctx: &mut Context) -> GeneratedBuilt
101104
} = make_builtin_methods(class, &class.methods, ctx);
102105

103106
let imports = util::make_imports();
104-
let enums = enums::make_enums(&class.enums);
107+
let (enums, warning) = enums::make_enums(&class.enums);
105108
let special_constructors = make_special_builtin_methods(class.name(), ctx);
106109

107110
// mod re_export needed, because class should not appear inside the file module, and we can't re-export private struct as pub
@@ -129,7 +132,7 @@ fn make_builtin_class(class: &BuiltinClass, ctx: &mut Context) -> GeneratedBuilt
129132
};
130133
// note: TypePtr -> ObjectPtr conversion OK?
131134

132-
GeneratedBuiltin { code }
135+
(GeneratedBuiltin { code }, warning)
133136
}
134137

135138
fn make_builtin_methods(

godot-codegen/src/generator/central_files.rs

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -101,57 +101,60 @@ pub fn make_sys_central_code(api: &ExtensionApi, ctx: &mut Context) -> TokenStre
101101
}
102102
}
103103

104-
pub fn make_core_central_code(api: &ExtensionApi, ctx: &mut Context) -> TokenStream {
104+
pub fn make_core_central_code(api: &ExtensionApi, ctx: &mut Context) -> (TokenStream, String) {
105105
let VariantEnums {
106106
variant_ty_enumerators_pascal,
107107
variant_ty_enumerators_rust,
108108
..
109109
} = make_variant_enums(api, ctx);
110110

111-
let global_enum_defs = make_global_enums(api);
111+
let (global_enum_defs, warning) = make_global_enums(api);
112112

113113
// TODO impl Clone, Debug, PartialEq, PartialOrd, Hash for VariantDispatch
114114
// TODO could use try_to().unwrap_unchecked(), since type is already verified. Also directly overload from_variant().
115115
// But this requires that all the variant types support this.
116-
quote! {
117-
use crate::builtin::*;
118-
use crate::engine::Object;
119-
use crate::obj::Gd;
120-
121-
#[allow(dead_code)]
122-
pub enum VariantDispatch {
123-
Nil,
124-
#(
125-
#variant_ty_enumerators_pascal(#variant_ty_enumerators_rust),
126-
)*
127-
}
128-
129-
#[cfg(FALSE)]
130-
impl FromVariant for VariantDispatch {
131-
fn try_from_variant(variant: &Variant) -> Result<Self, VariantConversionError> {
132-
let dispatch = match variant.get_type() {
133-
VariantType::Nil => Self::Nil,
134-
#(
135-
VariantType::#variant_ty_enumerators_pascal
136-
=> Self::#variant_ty_enumerators_pascal(variant.to::<#variant_ty_enumerators_rust>()),
137-
)*
138-
};
116+
(
117+
quote! {
118+
use crate::builtin::*;
119+
use crate::engine::Object;
120+
use crate::obj::Gd;
121+
122+
#[allow(dead_code)]
123+
pub enum VariantDispatch {
124+
Nil,
125+
#(
126+
#variant_ty_enumerators_pascal(#variant_ty_enumerators_rust),
127+
)*
128+
}
139129

140-
Ok(dispatch)
130+
#[cfg(FALSE)]
131+
impl FromVariant for VariantDispatch {
132+
fn try_from_variant(variant: &Variant) -> Result<Self, VariantConversionError> {
133+
let dispatch = match variant.get_type() {
134+
VariantType::Nil => Self::Nil,
135+
#(
136+
VariantType::#variant_ty_enumerators_pascal
137+
=> Self::#variant_ty_enumerators_pascal(variant.to::<#variant_ty_enumerators_rust>()),
138+
)*
139+
};
140+
141+
Ok(dispatch)
142+
}
141143
}
142-
}
143144

144-
/// Global enums and constants.
145-
///
146-
/// A list of global-scope enumerated constants.
147-
/// For global built-in functions, check out the [`utilities` module][crate::engine::utilities].
148-
///
149-
/// See also [Godot docs for `@GlobalScope`](https://docs.godotengine.org/en/stable/classes/[email protected]#enumerations).
150-
pub mod global {
151-
use crate::sys;
152-
#( #global_enum_defs )*
153-
}
154-
}
145+
/// Global enums and constants.
146+
///
147+
/// A list of global-scope enumerated constants.
148+
/// For global built-in functions, check out the [`utilities` module][crate::engine::utilities].
149+
///
150+
/// See also [Godot docs for `@GlobalScope`](https://docs.godotengine.org/en/stable/classes/[email protected]#enumerations).
151+
pub mod global {
152+
use crate::sys;
153+
#( #global_enum_defs )*
154+
}
155+
},
156+
warning,
157+
)
155158
}
156159

157160
// ----------------------------------------------------------------------------------------------------------------------------------------------
@@ -248,18 +251,20 @@ fn make_variant_enums(api: &ExtensionApi, ctx: &mut Context) -> VariantEnums {
248251
result
249252
}
250253

251-
fn make_global_enums(api: &ExtensionApi) -> Vec<TokenStream> {
254+
fn make_global_enums(api: &ExtensionApi) -> (Vec<TokenStream>, String) {
252255
let mut global_enum_defs = vec![];
256+
let mut warning = String::new();
253257

254258
for enum_ in api.global_enums.iter() {
255259
// Skip those enums which are already manually handled.
256260
if enum_.name == "VariantType" || enum_.name == "VariantOperator" {
257261
continue;
258262
}
259263

260-
let def = enums::make_enum_definition(enum_);
264+
let (def, warn) = enums::make_enum_definition(enum_);
261265
global_enum_defs.push(def);
266+
warning.push_str(&warn)
262267
}
263268

264-
global_enum_defs
269+
(global_enum_defs, warning)
265270
}

godot-codegen/src/generator/classes.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ pub fn generate_class_files(
2525
view: &ApiView,
2626
gen_path: &Path,
2727
submit_fn: &mut SubmitFn,
28-
) {
28+
) -> String {
2929
let _ = std::fs::remove_dir_all(gen_path);
3030
std::fs::create_dir_all(gen_path).expect("create classes directory");
31+
let mut warning = String::new();
3132

3233
let mut modules = vec![];
3334
for class in api.classes.iter() {
34-
let generated_class = make_class(class, ctx, view);
35+
let (generated_class, warn) = make_class(class, ctx, view);
36+
warning.push_str(&warn);
3537
let file_contents = generated_class.code;
3638

3739
let out_path = gen_path.join(format!("{}.rs", class.mod_name().rust_mod));
@@ -51,6 +53,7 @@ pub fn generate_class_files(
5153
let mod_contents = make_class_module_file(modules);
5254

5355
submit_fn(out_path, mod_contents);
56+
warning
5457
}
5558

5659
// ----------------------------------------------------------------------------------------------------------------------------------------------
@@ -72,7 +75,7 @@ struct GeneratedClassModule {
7275
is_pub_sidecar: bool,
7376
}
7477

75-
fn make_class(class: &Class, ctx: &mut Context, view: &ApiView) -> GeneratedClass {
78+
fn make_class(class: &Class, ctx: &mut Context, view: &ApiView) -> (GeneratedClass, String) {
7679
let class_name = class.name();
7780

7881
// Strings
@@ -98,7 +101,7 @@ fn make_class(class: &Class, ctx: &mut Context, view: &ApiView) -> GeneratedClas
98101
builders,
99102
} = make_class_methods(class, &class.methods, ctx);
100103

101-
let enums = enums::make_enums(&class.enums);
104+
let (enums, warning) = enums::make_enums(&class.enums);
102105
let constants = constants::make_constants(&class.constants);
103106
let inherits_macro = format_ident!("unsafe_inherits_transitive_{}", class_name.rust_ty);
104107
let deref_impl = make_deref_impl(class_name, &base_ty);
@@ -225,15 +228,18 @@ fn make_class(class: &Class, ctx: &mut Context, view: &ApiView) -> GeneratedClas
225228
};
226229
// note: TypePtr -> ObjectPtr conversion OK?
227230

228-
GeneratedClass {
229-
code: tokens,
230-
notification_enum: NotificationEnum {
231-
name: notification_enum_name,
232-
declared_by_own_class: notification_enum.is_some(),
231+
(
232+
GeneratedClass {
233+
code: tokens,
234+
notification_enum: NotificationEnum {
235+
name: notification_enum_name,
236+
declared_by_own_class: notification_enum.is_some(),
237+
},
238+
inherits_macro_ident: inherits_macro,
239+
has_sidecar_module,
233240
},
234-
inherits_macro_ident: inherits_macro,
235-
has_sidecar_module,
236-
}
241+
warning,
242+
)
237243
}
238244

239245
fn make_class_module_file(classes_and_modules: Vec<GeneratedClassModule>) -> TokenStream {

0 commit comments

Comments
 (0)