Make it a build error if a GetTypeInfo specialization cannot be resolved

Previously it was a runtime error message.
This commit is contained in:
Ignacio Etcheverry 2019-07-21 23:25:44 +02:00
parent 4379395892
commit 2c85439da0

View File

@ -83,15 +83,13 @@ enum Metadata {
}; };
} }
// If the compiler fails because it's trying to instantiate the primary 'GetTypeInfo' template
// instead of one of the specializations, it's most likely because the type 'T' is not supported.
// If 'T' is a class that inherits 'Object', make sure it can see the actual class declaration
// instead of a forward declaration. You can always forward declare 'T' in a header file, and then
// include the actual declaration of 'T' in the source file where 'GetTypeInfo<T>' is instantiated.
template <class T, typename = void> template <class T, typename = void>
struct GetTypeInfo { struct GetTypeInfo;
static const Variant::Type VARIANT_TYPE = Variant::NIL;
static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
static inline PropertyInfo get_class_info() {
ERR_PRINT("GetTypeInfo fallback. Bug!");
return PropertyInfo(); // Not "Nil", this is an error
}
};
#define MAKE_TYPE_INFO(m_type, m_var_type) \ #define MAKE_TYPE_INFO(m_type, m_var_type) \
template <> \ template <> \
@ -283,10 +281,7 @@ inline StringName __constant_get_enum_name(T param, const String &p_constant) {
return GetTypeInfo<T>::get_class_info().class_name; return GetTypeInfo<T>::get_class_info().class_name;
} }
#define CLASS_INFO(m_type) \ #define CLASS_INFO(m_type) (GetTypeInfo<m_type *>::get_class_info())
(GetTypeInfo<m_type *>::VARIANT_TYPE != Variant::NIL ? \
GetTypeInfo<m_type *>::get_class_info() : \
GetTypeInfo<m_type>::get_class_info())
#else #else