Add C# support for bitfield enums (flags)
This commit is contained in:
parent
76d0a99707
commit
f9c43c5489
@ -990,6 +990,10 @@ void BindingsGenerator::_generate_global_constants(StringBuilder &p_output) {
|
|||||||
p_output.append("\n" INDENT1 OPEN_BLOCK);
|
p_output.append("\n" INDENT1 OPEN_BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ienum.is_flags) {
|
||||||
|
p_output.append("\n" INDENT1 "[System.Flags]");
|
||||||
|
}
|
||||||
|
|
||||||
p_output.append("\n" INDENT1 "public enum ");
|
p_output.append("\n" INDENT1 "public enum ");
|
||||||
p_output.append(enum_proxy_name);
|
p_output.append(enum_proxy_name);
|
||||||
p_output.append(" : long");
|
p_output.append(" : long");
|
||||||
@ -1434,6 +1438,10 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str
|
|||||||
for (const EnumInterface &ienum : itype.enums) {
|
for (const EnumInterface &ienum : itype.enums) {
|
||||||
ERR_FAIL_COND_V(ienum.constants.is_empty(), ERR_BUG);
|
ERR_FAIL_COND_V(ienum.constants.is_empty(), ERR_BUG);
|
||||||
|
|
||||||
|
if (ienum.is_flags) {
|
||||||
|
output.append(MEMBER_BEGIN "[System.Flags]");
|
||||||
|
}
|
||||||
|
|
||||||
output.append(MEMBER_BEGIN "public enum ");
|
output.append(MEMBER_BEGIN "public enum ");
|
||||||
output.append(ienum.cname.operator String());
|
output.append(ienum.cname.operator String());
|
||||||
output.append(" : long");
|
output.append(" : long");
|
||||||
@ -3087,6 +3095,7 @@ bool BindingsGenerator::_populate_object_type_interfaces() {
|
|||||||
enum_proxy_cname = StringName(enum_proxy_name);
|
enum_proxy_cname = StringName(enum_proxy_name);
|
||||||
}
|
}
|
||||||
EnumInterface ienum(enum_proxy_cname);
|
EnumInterface ienum(enum_proxy_cname);
|
||||||
|
ienum.is_flags = E.value.is_bitfield;
|
||||||
const List<StringName> &enum_constants = E.value.constants;
|
const List<StringName> &enum_constants = E.value.constants;
|
||||||
for (const StringName &constant_cname : enum_constants) {
|
for (const StringName &constant_cname : enum_constants) {
|
||||||
String constant_name = constant_cname.operator String();
|
String constant_name = constant_cname.operator String();
|
||||||
@ -3676,6 +3685,7 @@ void BindingsGenerator::_populate_global_constants() {
|
|||||||
|
|
||||||
if (enum_name != StringName()) {
|
if (enum_name != StringName()) {
|
||||||
EnumInterface ienum(enum_name);
|
EnumInterface ienum(enum_name);
|
||||||
|
// TODO: ienum.is_flags is always false for core constants since they don't seem to support bitfield enums
|
||||||
List<EnumInterface>::Element *enum_match = global_enums.find(ienum);
|
List<EnumInterface>::Element *enum_match = global_enums.find(ienum);
|
||||||
if (enum_match) {
|
if (enum_match) {
|
||||||
enum_match->get().constants.push_back(iconstant);
|
enum_match->get().constants.push_back(iconstant);
|
||||||
|
@ -60,6 +60,7 @@ class BindingsGenerator {
|
|||||||
struct EnumInterface {
|
struct EnumInterface {
|
||||||
StringName cname;
|
StringName cname;
|
||||||
List<ConstantInterface> constants;
|
List<ConstantInterface> constants;
|
||||||
|
bool is_flags = false;
|
||||||
|
|
||||||
_FORCE_INLINE_ bool operator==(const EnumInterface &p_ienum) const {
|
_FORCE_INLINE_ bool operator==(const EnumInterface &p_ienum) const {
|
||||||
return p_ienum.cname == cname;
|
return p_ienum.cname == cname;
|
||||||
|
Loading…
Reference in New Issue
Block a user