Skip to content

Commit c55a09f

Browse files
committed
added warning messages for when negative bitfields are encountered
1 parent 1e8fbf7 commit c55a09f

File tree

8 files changed

+176
-107
lines changed

8 files changed

+176
-107
lines changed

godot-codegen/src/generator/builtins.rs

+8-5
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

+43-38
Original file line numberDiff line numberDiff line change
@@ -101,40 +101,41 @@ 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-
}
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+
}
128129

129-
impl VariantDispatch {
130-
pub fn from_variant(variant: &Variant) -> Self {
131-
match variant.get_type() {
132-
VariantType::Nil => Self::Nil,
133-
#(
134-
VariantType::#variant_ty_enumerators_pascal
135-
=> Self::#variant_ty_enumerators_pascal(variant.to::<#variant_ty_enumerators_rust>()),
136-
)*
137-
}
130+
impl VariantDispatch {
131+
pub fn from_variant(variant: &Variant) -> Self {
132+
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+
}
138139
}
139140
}
140141

@@ -146,20 +147,22 @@ pub fn make_core_central_code(api: &ExtensionApi, ctx: &mut Context) -> TokenStr
146147
Self::#variant_ty_enumerators_pascal(v) => write!(f, "{v:?}"),
147148
)*
148149
}
150+
}
149151
}
150-
}
151152

152-
/// Global enums and constants.
153-
///
154-
/// A list of global-scope enumerated constants.
155-
/// For global built-in functions, check out the [`utilities` module][crate::engine::utilities].
156-
///
157-
/// See also [Godot docs for `@GlobalScope`](https://docs.godotengine.org/en/stable/classes/[email protected]#enumerations).
158-
pub mod global {
159-
use crate::sys;
160-
#( #global_enum_defs )*
161-
}
162-
}
153+
/// Global enums and constants.
154+
///
155+
/// A list of global-scope enumerated constants.
156+
/// For global built-in functions, check out the [`utilities` module][crate::engine::utilities].
157+
///
158+
/// See also [Godot docs for `@GlobalScope`](https://docs.godotengine.org/en/stable/classes/[email protected]#enumerations).
159+
pub mod global {
160+
use crate::sys;
161+
#( #global_enum_defs )*
162+
}
163+
},
164+
warning,
165+
)
163166
}
164167

165168
// ----------------------------------------------------------------------------------------------------------------------------------------------
@@ -256,18 +259,20 @@ fn make_variant_enums(api: &ExtensionApi, ctx: &mut Context) -> VariantEnums {
256259
result
257260
}
258261

259-
fn make_global_enums(api: &ExtensionApi) -> Vec<TokenStream> {
262+
fn make_global_enums(api: &ExtensionApi) -> (Vec<TokenStream>, String) {
260263
let mut global_enum_defs = vec![];
264+
let mut warning = String::new();
261265

262266
for enum_ in api.global_enums.iter() {
263267
// Skip those enums which are already manually handled.
264268
if enum_.name == "VariantType" || enum_.name == "VariantOperator" {
265269
continue;
266270
}
267271

268-
let def = enums::make_enum_definition(enum_);
272+
let (def, warn) = enums::make_enum_definition(enum_);
269273
global_enum_defs.push(def);
274+
warning.push_str(&warn)
270275
}
271276

272-
global_enum_defs
277+
(global_enum_defs, warning)
273278
}

godot-codegen/src/generator/classes.rs

+18-12
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)