@@ -672,6 +672,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
672
672
for include in fully_used_classes :
673
673
if include == "TypedArray" :
674
674
includes .append ("godot_cpp/variant/typed_array.hpp" )
675
+ elif include == "TypedDictionary" :
676
+ includes .append ("godot_cpp/variant/typed_dictionary.hpp" )
675
677
else :
676
678
includes .append (f"godot_cpp/{ get_include_path (include )} " )
677
679
@@ -1022,6 +1024,9 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
1022
1024
if class_name == "Dictionary" :
1023
1025
result .append ("\t const Variant &operator[](const Variant &p_key) const;" )
1024
1026
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
+ )
1025
1030
1026
1031
result .append ("};" )
1027
1032
@@ -1438,6 +1443,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
1438
1443
fully_used_classes .add (array_type_name )
1439
1444
else :
1440
1445
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 )
1441
1472
elif is_enum (type_name ):
1442
1473
fully_used_classes .add (get_enum_class (type_name ))
1443
1474
elif "default_value" in argument :
@@ -1467,6 +1498,32 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):
1467
1498
fully_used_classes .add (array_type_name )
1468
1499
else :
1469
1500
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 )
1470
1527
elif is_enum (type_name ):
1471
1528
fully_used_classes .add (get_enum_class (type_name ))
1472
1529
elif is_variant (type_name ):
@@ -1600,6 +1657,8 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
1600
1657
for included in fully_used_classes :
1601
1658
if included == "TypedArray" :
1602
1659
includes .append ("godot_cpp/variant/typed_array.hpp" )
1660
+ elif included == "TypedDictionary" :
1661
+ includes .append ("godot_cpp/variant/typed_dictionary.hpp" )
1603
1662
else :
1604
1663
includes .append (f"godot_cpp/{ get_include_path (included )} " )
1605
1664
@@ -2688,6 +2747,7 @@ def is_variant(type_name):
2688
2747
or type_name in builtin_classes
2689
2748
or type_name == "Nil"
2690
2749
or type_name .startswith ("typedarray::" )
2750
+ or type_name .startswith ("typeddictionary::" )
2691
2751
)
2692
2752
2693
2753
@@ -2727,6 +2787,8 @@ def is_included(type_name, current_type):
2727
2787
"""
2728
2788
if type_name .startswith ("typedarray::" ):
2729
2789
return True
2790
+ if type_name .startswith ("typeddictionary::" ):
2791
+ return True
2730
2792
to_include = get_enum_class (type_name ) if is_enum (type_name ) else type_name
2731
2793
if to_include == current_type or is_pod_type (to_include ):
2732
2794
return False
@@ -2765,6 +2827,12 @@ def correct_typed_array(type_name):
2765
2827
return type_name
2766
2828
2767
2829
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
+
2768
2836
def correct_type (type_name , meta = None , use_alias = True ):
2769
2837
type_conversion = {"float" : "double" , "int" : "int64_t" , "Nil" : "Variant" }
2770
2838
if meta is not None :
@@ -2778,6 +2846,8 @@ def correct_type(type_name, meta=None, use_alias=True):
2778
2846
return type_conversion [type_name ]
2779
2847
if type_name .startswith ("typedarray::" ):
2780
2848
return type_name .replace ("typedarray::" , "TypedArray<" ) + ">"
2849
+ if type_name .startswith ("typeddictionary::" ):
2850
+ return type_name .replace ("typeddictionary::" , "TypedDictionary<" ).replace (";" , ", " ) + ">"
2781
2851
if is_enum (type_name ):
2782
2852
if is_bitfield (type_name ):
2783
2853
base_class = get_enum_class (type_name )
@@ -2924,6 +2994,8 @@ def get_default_value_for_type(type_name):
2924
2994
return "false"
2925
2995
if type_name .startswith ("typedarray::" ):
2926
2996
return f"{ correct_type (type_name )} ()"
2997
+ if type_name .startswith ("typeddictionary::" ):
2998
+ return f"{ correct_type (type_name )} ()"
2927
2999
if is_enum (type_name ):
2928
3000
return f"{ correct_type (type_name )} (0)"
2929
3001
if is_variant (type_name ):
0 commit comments