Skip to content

Commit a0c04d5

Browse files
authored
Merge branch 'godot-rust:master' into master
2 parents ceabbeb + 096eccd commit a0c04d5

File tree

4 files changed

+45
-8
lines changed

4 files changed

+45
-8
lines changed

godot-codegen/src/api_parser.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub struct BuiltinClass {
4141
pub indexing_return_type: Option<String>,
4242
pub is_keyed: bool,
4343
pub members: Option<Vec<Member>>,
44-
pub constants: Option<Vec<Constant>>,
44+
// pub constants: Option<Vec<BuiltinConstant>>,
4545
pub enums: Option<Vec<BuiltinClassEnum>>, // no bitfield
4646
pub operators: Vec<Operator>,
4747
pub methods: Option<Vec<BuiltinClassMethod>>,
@@ -56,7 +56,7 @@ pub struct Class {
5656
pub is_instantiable: bool,
5757
pub inherits: Option<String>,
5858
// pub api_type: String,
59-
// pub constants: Option<Vec<Constant>>,
59+
pub constants: Option<Vec<ClassConstant>>,
6060
pub enums: Option<Vec<Enum>>,
6161
pub methods: Option<Vec<ClassMethod>>,
6262
// pub properties: Option<Vec<Property>>,
@@ -100,13 +100,18 @@ pub struct EnumConstant {
100100
pub value: i32,
101101
}
102102

103+
pub type ClassConstant = EnumConstant;
104+
105+
/*
106+
// Constants of builtin types have a string value like "Vector2(1, 1)", hence also a type field
103107
#[derive(DeJson)]
104-
pub struct Constant {
108+
pub struct BuiltinConstant {
105109
pub name: String,
106110
#[nserde(rename = "type")]
107111
pub type_: String,
108112
pub value: String,
109113
}
114+
*/
110115

111116
#[derive(DeJson)]
112117
pub struct Operator {

godot-codegen/src/class_generator.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ fn make_class(class: &Class, class_name: &TyName, ctx: &mut Context) -> Generate
173173
let constructor = make_constructor(class, ctx);
174174
let methods = make_methods(&class.methods, class_name, ctx);
175175
let enums = make_enums(&class.enums, class_name, ctx);
176+
let constants = make_constants(&class.constants, class_name, ctx);
176177
let inherits_macro = format_ident!("inherits_transitive_{}", class_name.rust_ty);
177178
let all_bases = ctx.inheritance_tree().collect_all_bases(class_name);
178179
let virtual_trait = make_virtual_methods_trait(class, &all_bases, &virtual_trait_str, ctx);
@@ -205,6 +206,7 @@ fn make_class(class: &Class, class_name: &TyName, ctx: &mut Context) -> Generate
205206
impl #class_name {
206207
#constructor
207208
#methods
209+
#constants
208210
}
209211
impl crate::obj::GodotClass for #class_name {
210212
type Base = #base;
@@ -420,9 +422,8 @@ fn make_builtin_methods(
420422
}
421423

422424
fn make_enums(enums: &Option<Vec<Enum>>, _class_name: &TyName, _ctx: &Context) -> TokenStream {
423-
let enums = match enums {
424-
Some(e) => e,
425-
None => return TokenStream::new(),
425+
let Some(enums) = enums else {
426+
return TokenStream::new();
426427
};
427428

428429
let definitions = enums.iter().map(util::make_enum_definition);
@@ -432,6 +433,22 @@ fn make_enums(enums: &Option<Vec<Enum>>, _class_name: &TyName, _ctx: &Context) -
432433
}
433434
}
434435

436+
fn make_constants(
437+
constants: &Option<Vec<ClassConstant>>,
438+
_class_name: &TyName,
439+
_ctx: &Context,
440+
) -> TokenStream {
441+
let Some(constants) = constants else {
442+
return TokenStream::new();
443+
};
444+
445+
let definitions = constants.iter().map(util::make_constant_definition);
446+
447+
quote! {
448+
#( #definitions )*
449+
}
450+
}
451+
435452
/// Depending on the built-in class, adds custom constructors and methods.
436453
fn make_special_builtin_methods(class_name: &TyName, _ctx: &Context) -> TokenStream {
437454
if class_name.godot_ty == "Array" {

godot-codegen/src/util.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
55
*/
66

7-
use crate::api_parser::Enum;
7+
use crate::api_parser::{ClassConstant, Enum};
88
use crate::special_cases::is_builtin_scalar;
99
use crate::{Context, ModName, RustTy, TyName};
1010
use proc_macro2::{Ident, Literal, TokenStream};
@@ -106,6 +106,15 @@ pub fn make_enum_definition(enum_: &Enum) -> TokenStream {
106106
}
107107
}
108108

109+
pub fn make_constant_definition(constant: &ClassConstant) -> TokenStream {
110+
let ClassConstant { name, value } = constant;
111+
let name = ident(name);
112+
113+
quote! {
114+
pub const #name: i32 = #value;
115+
}
116+
}
117+
109118
fn make_enum_name(enum_name: &str) -> Ident {
110119
// TODO clean up enum name
111120

itest/rust/src/codegen_test.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
use crate::itest;
1111
use godot::builtin::inner::{InnerColor, InnerString};
12-
use godot::engine::{FileAccess, HttpRequest, HttpRequestVirtual};
12+
use godot::engine::{FileAccess, HttpRequest, HttpRequestVirtual, Image};
1313
use godot::prelude::*;
1414

1515
#[itest]
@@ -50,6 +50,12 @@ fn codegen_static_class_method() {
5050
// see also object_test for reference count verification
5151
}
5252

53+
#[itest]
54+
fn codegen_constants() {
55+
assert_eq!(Image::MAX_WIDTH, 16777216);
56+
// assert_eq!(Material::RENDER_PRIORITY_MIN, -128);
57+
}
58+
5359
// ----------------------------------------------------------------------------------------------------------------------------------------------
5460

5561
#[derive(GodotClass)]

0 commit comments

Comments
 (0)