summaryrefslogtreecommitdiffstats
path: root/binding_generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'binding_generator.py')
-rw-r--r--binding_generator.py47
1 files changed, 38 insertions, 9 deletions
diff --git a/binding_generator.py b/binding_generator.py
index a1ae9f6..60d21cb 100644
--- a/binding_generator.py
+++ b/binding_generator.py
@@ -1064,7 +1064,10 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
if "enums" in class_api and class_name != "Object":
for enum_api in class_api["enums"]:
- result.append(f'VARIANT_ENUM_CAST({class_name}, {class_name}::{enum_api["name"]});')
+ if enum_api["is_bitfield"]:
+ result.append(f'VARIANT_BITFIELD_CAST({class_name}, {class_name}::{enum_api["name"]});')
+ else:
+ result.append(f'VARIANT_ENUM_CAST({class_name}, {class_name}::{enum_api["name"]});')
result.append("")
result.append(f"#endif // ! {header_guard}")
@@ -1194,7 +1197,7 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us
result.append(method_call)
if vararg and ("return_value" in method and method["return_value"]["type"] != "void"):
- return_type = method["return_value"]["type"].replace("enum::", "")
+ return_type = get_enum_fullname(method["return_value"]["type"])
if return_type != "Variant":
result.append(f"\treturn VariantCaster<{return_type}>::cast(ret);")
else:
@@ -1712,18 +1715,35 @@ def needs_copy_instead_of_move(type_name):
def is_enum(type_name):
- return type_name.startswith("enum::")
+ return type_name.startswith("enum::") or type_name.startswith("bitfield::")
+
+
+def is_bitfield(type_name):
+ return type_name.startswith("bitfield::")
def get_enum_class(enum_name: str):
if "." in enum_name:
- return enum_name.replace("enum::", "").split(".")[0]
+ if is_bitfield(enum_name):
+ return enum_name.replace("bitfield::", "").split(".")[0]
+ else:
+ return enum_name.replace("enum::", "").split(".")[0]
else:
return "GlobalConstants"
+def get_enum_fullname(enum_name: str):
+ if is_bitfield(enum_name):
+ return enum_name.replace("bitfield::", "BitField<") + ">"
+ else:
+ return enum_name.replace("enum::", "")
+
+
def get_enum_name(enum_name: str):
- return enum_name.replace("enum::", "").split(".")[-1]
+ if is_bitfield(enum_name):
+ return enum_name.replace("bitfield::", "").split(".")[-1]
+ else:
+ return enum_name.replace("enum::", "").split(".")[-1]
def is_variant(type_name):
@@ -1781,10 +1801,16 @@ def correct_type(type_name, meta=None):
if type_name in type_conversion:
return type_conversion[type_name]
if is_enum(type_name):
- base_class = get_enum_class(type_name)
- if base_class == "GlobalConstants":
- return f"{get_enum_name(type_name)}"
- return f"{base_class}::{get_enum_name(type_name)}"
+ if is_bitfield(type_name):
+ base_class = get_enum_class(type_name)
+ if base_class == "GlobalConstants":
+ return f"BitField<{get_enum_name(type_name)}>"
+ return f"BitField<{base_class}::{get_enum_name(type_name)}>"
+ else:
+ base_class = get_enum_class(type_name)
+ if base_class == "GlobalConstants":
+ return f"{get_enum_name(type_name)}"
+ return f"{base_class}::{get_enum_name(type_name)}"
if is_refcounted(type_name):
return f"Ref<{type_name}>"
if type_name == "Object" or is_engine_class(type_name):
@@ -1807,6 +1833,9 @@ def get_gdnative_type(type_name):
"float": "double",
}
+ if type_name.startswith("BitField<"):
+ return "int64_t"
+
if type_name in type_conversion_map:
return type_conversion_map[type_name]
return type_name