Skip to content

Commit 57bd88a

Browse files
authored
Merge pull request #1162 from Repiteo/typed-dictionary
Implement typed dictionaries
2 parents b93d6e8 + 2ffff66 commit 57bd88a

File tree

9 files changed

+546
-2
lines changed

9 files changed

+546
-2
lines changed

binding_generator.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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("\tconst Variant &operator[](const Variant &p_key) const;")
10241026
result.append("\tVariant &operator[](const Variant &p_key);")
1027+
result.append(
1028+
"\tvoid 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+
27682836
def 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

Comments
 (0)