@@ -672,6 +672,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
672672 for include in fully_used_classes :
673673 if include == "TypedArray" :
674674 includes .append ("godot_cpp/variant/typed_array.hpp" )
675+ elif include == "TypedDictionary" :
676+ includes .append ("godot_cpp/variant/typed_dictionary.hpp" )
675677 else :
676678 includes .append (f"godot_cpp/{ get_include_path (include )} " )
677679
@@ -1022,6 +1024,9 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
10221024 if class_name == "Dictionary" :
10231025 result .append ("\t const Variant &operator[](const Variant &p_key) const;" )
10241026 result .append ("\t Variant &operator[](const Variant &p_key);" )
1027+ result .append (
1028+ "\t void set_typed(uint32_t p_key_type, const StringName &p_key_class_name, const Variant &p_key_script, uint32_t p_value_type, const StringName &p_value_class_name, const Variant &p_value_script);"
1029+ )
10251030
10261031 result .append ("};" )
10271032
@@ -1438,6 +1443,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
14381443 fully_used_classes .add (array_type_name )
14391444 else :
14401445 used_classes .add (array_type_name )
1446+ elif type_name .startswith ("typeddictionary::" ):
1447+ fully_used_classes .add ("TypedDictionary" )
1448+ dict_type_name = type_name .replace ("typeddictionary::" , "" )
1449+ if dict_type_name .startswith ("const " ):
1450+ dict_type_name = dict_type_name [6 :]
1451+ dict_type_names = dict_type_name .split (";" )
1452+ dict_type_name = dict_type_names [0 ]
1453+ if dict_type_name .endswith ("*" ):
1454+ dict_type_name = dict_type_name [:- 1 ]
1455+ if is_included (dict_type_name , class_name ):
1456+ if is_enum (dict_type_name ):
1457+ fully_used_classes .add (get_enum_class (dict_type_name ))
1458+ elif "default_value" in argument :
1459+ fully_used_classes .add (dict_type_name )
1460+ else :
1461+ used_classes .add (dict_type_name )
1462+ dict_type_name = dict_type_names [2 ]
1463+ if dict_type_name .endswith ("*" ):
1464+ dict_type_name = dict_type_name [:- 1 ]
1465+ if is_included (dict_type_name , class_name ):
1466+ if is_enum (dict_type_name ):
1467+ fully_used_classes .add (get_enum_class (dict_type_name ))
1468+ elif "default_value" in argument :
1469+ fully_used_classes .add (dict_type_name )
1470+ else :
1471+ used_classes .add (dict_type_name )
14411472 elif is_enum (type_name ):
14421473 fully_used_classes .add (get_enum_class (type_name ))
14431474 elif "default_value" in argument :
@@ -1467,6 +1498,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
14671498 fully_used_classes .add (array_type_name )
14681499 else :
14691500 used_classes .add (array_type_name )
1501+ elif type_name .startswith ("typeddictionary::" ):
1502+ fully_used_classes .add ("TypedDictionary" )
1503+ dict_type_name = type_name .replace ("typeddictionary::" , "" )
1504+ if dict_type_name .startswith ("const " ):
1505+ dict_type_name = dict_type_name [6 :]
1506+ dict_type_names = dict_type_name .split (";" )
1507+ dict_type_name = dict_type_names [0 ]
1508+ if dict_type_name .endswith ("*" ):
1509+ dict_type_name = dict_type_name [:- 1 ]
1510+ if is_included (dict_type_name , class_name ):
1511+ if is_enum (dict_type_name ):
1512+ fully_used_classes .add (get_enum_class (dict_type_name ))
1513+ elif is_variant (dict_type_name ):
1514+ fully_used_classes .add (dict_type_name )
1515+ else :
1516+ used_classes .add (dict_type_name )
1517+ dict_type_name = dict_type_names [2 ]
1518+ if dict_type_name .endswith ("*" ):
1519+ dict_type_name = dict_type_name [:- 1 ]
1520+ if is_included (dict_type_name , class_name ):
1521+ if is_enum (dict_type_name ):
1522+ fully_used_classes .add (get_enum_class (dict_type_name ))
1523+ elif is_variant (dict_type_name ):
1524+ fully_used_classes .add (dict_type_name )
1525+ else :
1526+ used_classes .add (dict_type_name )
14701527 elif is_enum (type_name ):
14711528 fully_used_classes .add (get_enum_class (type_name ))
14721529 elif is_variant (type_name ):
@@ -1600,6 +1657,8 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
16001657 for included in fully_used_classes :
16011658 if included == "TypedArray" :
16021659 includes .append ("godot_cpp/variant/typed_array.hpp" )
1660+ elif included == "TypedDictionary" :
1661+ includes .append ("godot_cpp/variant/typed_dictionary.hpp" )
16031662 else :
16041663 includes .append (f"godot_cpp/{ get_include_path (included )} " )
16051664
@@ -2688,6 +2747,7 @@ def is_variant(type_name):
26882747 or type_name in builtin_classes
26892748 or type_name == "Nil"
26902749 or type_name .startswith ("typedarray::" )
2750+ or type_name .startswith ("typeddictionary::" )
26912751 )
26922752
26932753
@@ -2727,6 +2787,8 @@ def is_included(type_name, current_type):
27272787 """
27282788 if type_name .startswith ("typedarray::" ):
27292789 return True
2790+ if type_name .startswith ("typeddictionary::" ):
2791+ return True
27302792 to_include = get_enum_class (type_name ) if is_enum (type_name ) else type_name
27312793 if to_include == current_type or is_pod_type (to_include ):
27322794 return False
@@ -2765,6 +2827,12 @@ def correct_typed_array(type_name):
27652827 return type_name
27662828
27672829
2830+ def correct_typed_dictionary (type_name ):
2831+ if type_name .startswith ("typeddictionary::" ):
2832+ return type_name .replace ("typeddictionary::" , "TypedDictionary<" ).replace (";" , ", " ) + ">"
2833+ return type_name
2834+
2835+
27682836def correct_type (type_name , meta = None , use_alias = True ):
27692837 type_conversion = {"float" : "double" , "int" : "int64_t" , "Nil" : "Variant" }
27702838 if meta is not None :
@@ -2778,6 +2846,8 @@ def correct_type(type_name, meta=None, use_alias=True):
27782846 return type_conversion [type_name ]
27792847 if type_name .startswith ("typedarray::" ):
27802848 return type_name .replace ("typedarray::" , "TypedArray<" ) + ">"
2849+ if type_name .startswith ("typeddictionary::" ):
2850+ return type_name .replace ("typeddictionary::" , "TypedDictionary<" ).replace (";" , ", " ) + ">"
27812851 if is_enum (type_name ):
27822852 if is_bitfield (type_name ):
27832853 base_class = get_enum_class (type_name )
@@ -2924,6 +2994,8 @@ def get_default_value_for_type(type_name):
29242994 return "false"
29252995 if type_name .startswith ("typedarray::" ):
29262996 return f"{ correct_type (type_name )} ()"
2997+ if type_name .startswith ("typeddictionary::" ):
2998+ return f"{ correct_type (type_name )} ()"
29272999 if is_enum (type_name ):
29283000 return f"{ correct_type (type_name )} (0)"
29293001 if is_variant (type_name ):
0 commit comments