Add check to ensure registered classes are declared

Checks that all classes registered to `ClassDB` have been properly
declared with `GDCLASS`
This commit is contained in:
A Thousand Ships 2023-08-26 17:39:43 +02:00
parent 713bfaf5ea
commit c638238fae
2 changed files with 6 additions and 0 deletions

View File

@ -187,6 +187,7 @@ public:
template <class T> template <class T>
static void register_class(bool p_virtual = false) { static void register_class(bool p_virtual = false) {
GLOBAL_LOCK_FUNCTION; GLOBAL_LOCK_FUNCTION;
static_assert(TypesAreSame<typename T::self_type, T>::value, "Class not declared properly, please use GDCLASS.");
T::initialize_class(); T::initialize_class();
ClassInfo *t = classes.getptr(T::get_class_static()); ClassInfo *t = classes.getptr(T::get_class_static());
ERR_FAIL_COND(!t); ERR_FAIL_COND(!t);
@ -201,6 +202,7 @@ public:
template <class T> template <class T>
static void register_abstract_class() { static void register_abstract_class() {
GLOBAL_LOCK_FUNCTION; GLOBAL_LOCK_FUNCTION;
static_assert(TypesAreSame<typename T::self_type, T>::value, "Class not declared properly, please use GDCLASS.");
T::initialize_class(); T::initialize_class();
ClassInfo *t = classes.getptr(T::get_class_static()); ClassInfo *t = classes.getptr(T::get_class_static());
ERR_FAIL_COND(!t); ERR_FAIL_COND(!t);
@ -221,6 +223,7 @@ public:
template <class T> template <class T>
static void register_custom_instance_class() { static void register_custom_instance_class() {
GLOBAL_LOCK_FUNCTION; GLOBAL_LOCK_FUNCTION;
static_assert(TypesAreSame<typename T::self_type, T>::value, "Class not declared properly, please use GDCLASS.");
T::initialize_class(); T::initialize_class();
ClassInfo *t = classes.getptr(T::get_class_static()); ClassInfo *t = classes.getptr(T::get_class_static());
ERR_FAIL_COND(!t); ERR_FAIL_COND(!t);

View File

@ -382,6 +382,7 @@ private:
friend class ::ClassDB; \ friend class ::ClassDB; \
\ \
public: \ public: \
typedef m_class self_type; \
static constexpr bool _class_is_enabled = !bool(GD_IS_DEFINED(ClassDB_Disable_##m_class)) && m_inherits::_class_is_enabled; \ static constexpr bool _class_is_enabled = !bool(GD_IS_DEFINED(ClassDB_Disable_##m_class)) && m_inherits::_class_is_enabled; \
virtual String get_class() const override { \ virtual String get_class() const override { \
if (_get_extension()) { \ if (_get_extension()) { \
@ -557,6 +558,8 @@ class ScriptInstance;
class Object { class Object {
public: public:
typedef Object self_type;
enum ConnectFlags { enum ConnectFlags {
CONNECT_DEFERRED = 1, CONNECT_DEFERRED = 1,
CONNECT_PERSIST = 2, // hint for scene to save this connection CONNECT_PERSIST = 2, // hint for scene to save this connection