Add support for BitField hint, sync API files.

This commit is contained in:
bruvzg
2022-07-11 14:37:14 +03:00
parent bffedfed1e
commit 713b122b84
8 changed files with 2692 additions and 2528 deletions

View File

@@ -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