From 8aef77a64d29e3b8c42ba2c9851e63cc2f703b99 Mon Sep 17 00:00:00 2001 From: David Snopek Date: Wed, 24 Apr 2024 14:26:06 -0500 Subject: [PATCH] Give compile-time error if registering a class without its own `_bind_methods()` function (cherry picked from commit ca46ef4d256c727a116366334b705ecda0a06c5d) --- include/godot_cpp/classes/wrapped.hpp | 5 +++++ include/godot_cpp/core/class_db.hpp | 1 + include/godot_cpp/core/type_info.hpp | 10 ++++++++++ 3 files changed, 16 insertions(+) diff --git a/include/godot_cpp/classes/wrapped.hpp b/include/godot_cpp/classes/wrapped.hpp index 49f89a46..0452e42d 100644 --- a/include/godot_cpp/classes/wrapped.hpp +++ b/include/godot_cpp/classes/wrapped.hpp @@ -193,6 +193,7 @@ protected: \ public: \ typedef m_class self_type; \ + typedef m_inherits parent_type; \ \ static void initialize_class() { \ static bool initialized = false; \ @@ -359,6 +360,7 @@ private: private: \ inline static ::godot::internal::EngineClassRegistration _gde_engine_class_registration_helper; \ void operator=(const m_class &p_rval) {} \ + friend class ::godot::ClassDB; \ \ protected: \ virtual const GDExtensionInstanceBindingCallbacks *_get_bindings_callbacks() const override { \ @@ -368,6 +370,8 @@ protected: m_class(const char *p_godot_class) : m_inherits(p_godot_class) {} \ m_class(GodotObject *p_godot_object) : m_inherits(p_godot_object) {} \ \ + static void _bind_methods() {} \ + \ static void (*_get_bind_methods())() { \ return nullptr; \ } \ @@ -410,6 +414,7 @@ protected: \ public: \ typedef m_class self_type; \ + typedef m_inherits parent_type; \ \ static void initialize_class() {} \ \ diff --git a/include/godot_cpp/core/class_db.hpp b/include/godot_cpp/core/class_db.hpp index 18d2cc79..7b1967e7 100644 --- a/include/godot_cpp/core/class_db.hpp +++ b/include/godot_cpp/core/class_db.hpp @@ -198,6 +198,7 @@ public: template void ClassDB::_register_class(bool p_virtual, bool p_exposed) { static_assert(TypesAreSame::value, "Class not declared properly, please use GDCLASS."); + static_assert(!FunctionsAreSame::value, "Class must declare 'static void _bind_methods'."); static_assert(!std::is_abstract_v || is_abstract, "Class is abstract, please use GDREGISTER_ABSTRACT_CLASS."); instance_binding_callbacks[T::get_class_static()] = &T::_gde_binding_callbacks; diff --git a/include/godot_cpp/core/type_info.hpp b/include/godot_cpp/core/type_info.hpp index 2c4f8e40..e1f2b205 100644 --- a/include/godot_cpp/core/type_info.hpp +++ b/include/godot_cpp/core/type_info.hpp @@ -58,6 +58,16 @@ struct TypesAreSame { static bool const value = true; }; +template +struct FunctionsAreSame { + static bool const value = false; +}; + +template +struct FunctionsAreSame { + static bool const value = true; +}; + template struct TypeInherits { static D *get_d();