summaryrefslogtreecommitdiffstats
path: root/include/godot_cpp/core
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-01-30 12:07:15 +0100
committerRémi Verschelde <rverschelde@gmail.com>2023-01-30 12:07:15 +0100
commit2ef10f9754208f5a7fd388e6928d8fc00b9f97fd (patch)
tree628f04aa58de52690b826a4e4ce0968e14b66a15 /include/godot_cpp/core
parent0f3a0913f100dcd988b538582431d064f46c4e17 (diff)
parent6528c7177fa96bfcc81805e97a0a03290816cb51 (diff)
downloadredot-cpp-2ef10f9754208f5a7fd388e6928d8fc00b9f97fd.tar.gz
Merge pull request #956 from DmitriySalnikov/enum_bitfield_cast
Fixed `VARIANT_ENUM/BITFIELD_CAST` to show the correct names
Diffstat (limited to 'include/godot_cpp/core')
-rw-r--r--include/godot_cpp/core/binder_common.hpp76
-rw-r--r--include/godot_cpp/core/type_info.hpp52
2 files changed, 69 insertions, 59 deletions
diff --git a/include/godot_cpp/core/binder_common.hpp b/include/godot_cpp/core/binder_common.hpp
index c96498f..ed7c487 100644
--- a/include/godot_cpp/core/binder_common.hpp
+++ b/include/godot_cpp/core/binder_common.hpp
@@ -41,46 +41,46 @@
namespace godot {
-#define VARIANT_ENUM_CAST(m_class, m_enum) \
- namespace godot { \
- MAKE_ENUM_TYPE_INFO(m_class, m_enum) \
- template <> \
- struct VariantCaster<m_class::m_enum> { \
- static _FORCE_INLINE_ m_class::m_enum cast(const Variant &p_variant) { \
- return (m_class::m_enum)p_variant.operator int64_t(); \
- } \
- }; \
- template <> \
- struct PtrToArg<m_class::m_enum> { \
- _FORCE_INLINE_ static m_class::m_enum convert(const void *p_ptr) { \
- return m_class::m_enum(*reinterpret_cast<const int64_t *>(p_ptr)); \
- } \
- typedef int64_t EncodeT; \
- _FORCE_INLINE_ static void encode(m_class::m_enum p_val, void *p_ptr) { \
- *reinterpret_cast<int64_t *>(p_ptr) = p_val; \
- } \
- }; \
+#define VARIANT_ENUM_CAST(m_enum) \
+ namespace godot { \
+ MAKE_ENUM_TYPE_INFO(m_enum) \
+ template <> \
+ struct VariantCaster<m_enum> { \
+ static _FORCE_INLINE_ m_enum cast(const Variant &p_variant) { \
+ return (m_enum)p_variant.operator int64_t(); \
+ } \
+ }; \
+ template <> \
+ struct PtrToArg<m_enum> { \
+ _FORCE_INLINE_ static m_enum convert(const void *p_ptr) { \
+ return m_enum(*reinterpret_cast<const int64_t *>(p_ptr)); \
+ } \
+ typedef int64_t EncodeT; \
+ _FORCE_INLINE_ static void encode(m_enum p_val, void *p_ptr) { \
+ *reinterpret_cast<int64_t *>(p_ptr) = p_val; \
+ } \
+ }; \
}
-#define VARIANT_BITFIELD_CAST(m_class, m_enum) \
- namespace godot { \
- MAKE_BITFIELD_TYPE_INFO(m_class, m_enum) \
- template <> \
- struct VariantCaster<BitField<m_class::m_enum>> { \
- static _FORCE_INLINE_ BitField<m_class::m_enum> cast(const Variant &p_variant) { \
- return BitField<m_class::m_enum>(p_variant.operator int64_t()); \
- } \
- }; \
- template <> \
- struct PtrToArg<BitField<m_class::m_enum>> { \
- _FORCE_INLINE_ static BitField<m_class::m_enum> convert(const void *p_ptr) { \
- return BitField<m_class::m_enum>(*reinterpret_cast<const int64_t *>(p_ptr)); \
- } \
- typedef int64_t EncodeT; \
- _FORCE_INLINE_ static void encode(BitField<m_class::m_enum> p_val, void *p_ptr) { \
- *reinterpret_cast<int64_t *>(p_ptr) = p_val; \
- } \
- }; \
+#define VARIANT_BITFIELD_CAST(m_enum) \
+ namespace godot { \
+ MAKE_BITFIELD_TYPE_INFO(m_enum) \
+ template <> \
+ struct VariantCaster<BitField<m_enum>> { \
+ static _FORCE_INLINE_ BitField<m_enum> cast(const Variant &p_variant) { \
+ return BitField<m_enum>(p_variant.operator int64_t()); \
+ } \
+ }; \
+ template <> \
+ struct PtrToArg<BitField<m_enum>> { \
+ _FORCE_INLINE_ static BitField<m_enum> convert(const void *p_ptr) { \
+ return BitField<m_enum>(*reinterpret_cast<const int64_t *>(p_ptr)); \
+ } \
+ typedef int64_t EncodeT; \
+ _FORCE_INLINE_ static void encode(BitField<m_enum> p_val, void *p_ptr) { \
+ *reinterpret_cast<int64_t *>(p_ptr) = p_val; \
+ } \
+ }; \
}
template <class T>
diff --git a/include/godot_cpp/core/type_info.hpp b/include/godot_cpp/core/type_info.hpp
index 509bfb7..039cb2e 100644
--- a/include/godot_cpp/core/type_info.hpp
+++ b/include/godot_cpp/core/type_info.hpp
@@ -214,21 +214,31 @@ struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>:
}
};
-#define TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, m_impl) \
- template <> \
- struct GetTypeInfo<m_impl> { \
- static const Variant::Type VARIANT_TYPE = Variant::INT; \
- static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
- static inline PropertyInfo get_class_info() { \
- return make_property_info(Variant::Type::INT, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_ENUM, #m_class "." #m_enum); \
- } \
+inline String enum_qualified_name_to_class_info_name(const String &p_qualified_name) {
+ PackedStringArray parts = p_qualified_name.split("::", false);
+ if (parts.size() <= 2) {
+ return String(".").join(parts);
+ }
+ // Contains namespace. We only want the class and enum names.
+ return parts[parts.size() - 2] + "." + parts[parts.size() - 1];
+}
+
+#define TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_impl) \
+ template <> \
+ struct GetTypeInfo<m_impl> { \
+ static const Variant::Type VARIANT_TYPE = Variant::INT; \
+ static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
+ static inline PropertyInfo get_class_info() { \
+ return make_property_info(Variant::Type::INT, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_ENUM, \
+ enum_qualified_name_to_class_info_name(#m_enum)); \
+ } \
};
-#define MAKE_ENUM_TYPE_INFO(m_class, m_enum) \
- TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, m_class::m_enum) \
- TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, m_class::m_enum const) \
- TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, m_class::m_enum &) \
- TEMPL_MAKE_ENUM_TYPE_INFO(m_class, m_enum, const m_class::m_enum &)
+#define MAKE_ENUM_TYPE_INFO(m_enum) \
+ TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum) \
+ TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum const) \
+ TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum &) \
+ TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, const m_enum &)
template <typename T>
inline StringName __constant_get_enum_name(T param, StringName p_constant) {
@@ -251,14 +261,14 @@ public:
_FORCE_INLINE_ operator Variant() const { return value; }
};
-#define TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, m_impl) \
+#define TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_impl) \
template <> \
struct GetTypeInfo<m_impl> { \
static const Variant::Type VARIANT_TYPE = Variant::INT; \
static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::INT, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_BITFIELD, \
- #m_class "." #m_enum); \
+ enum_qualified_name_to_class_info_name(#m_enum)); \
} \
}; \
template <> \
@@ -267,15 +277,15 @@ public:
static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE; \
static inline PropertyInfo get_class_info() { \
return make_property_info(Variant::Type::INT, "", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_CLASS_IS_BITFIELD, \
- #m_class "." #m_enum); \
+ enum_qualified_name_to_class_info_name(#m_enum)); \
} \
};
-#define MAKE_BITFIELD_TYPE_INFO(m_class, m_enum) \
- TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, m_enum) \
- TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, m_enum const) \
- TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, m_enum &) \
- TEMPL_MAKE_BITFIELD_TYPE_INFO(m_class, m_enum, const m_enum &)
+#define MAKE_BITFIELD_TYPE_INFO(m_enum) \
+ TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum) \
+ TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum const) \
+ TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, m_enum &) \
+ TEMPL_MAKE_BITFIELD_TYPE_INFO(m_enum, const m_enum &)
template <typename T>
inline StringName __constant_get_bitfield_name(T param, StringName p_constant) {