Merge pull request #45032 from neikeq/classdb-tests-for-44856
Add ClassDB tests to look for core API deps on editor API
This commit is contained in:
commit
8eaea1db53
|
@ -1479,6 +1479,12 @@ Error BindingsGenerator::_generate_cs_property(const BindingsGenerator::TypeInte
|
||||||
ERR_FAIL_COND_V_MSG(prop_itype->is_singleton, ERR_BUG,
|
ERR_FAIL_COND_V_MSG(prop_itype->is_singleton, ERR_BUG,
|
||||||
"Property type is a singleton: '" + p_itype.name + "." + String(p_iprop.cname) + "'.");
|
"Property type is a singleton: '" + p_itype.name + "." + String(p_iprop.cname) + "'.");
|
||||||
|
|
||||||
|
if (p_itype.api_type == ClassDB::API_CORE) {
|
||||||
|
ERR_FAIL_COND_V_MSG(prop_itype->api_type == ClassDB::API_EDITOR, ERR_BUG,
|
||||||
|
"Property '" + p_itype.name + "." + String(p_iprop.cname) + "' has type '" + prop_itype->name +
|
||||||
|
"' from the editor API. Core API cannot have dependencies on the editor API.");
|
||||||
|
}
|
||||||
|
|
||||||
if (p_iprop.prop_doc && p_iprop.prop_doc->description.size()) {
|
if (p_iprop.prop_doc && p_iprop.prop_doc->description.size()) {
|
||||||
String xml_summary = bbcode_to_xml(fix_doc_description(p_iprop.prop_doc->description), &p_itype);
|
String xml_summary = bbcode_to_xml(fix_doc_description(p_iprop.prop_doc->description), &p_itype);
|
||||||
Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>();
|
Vector<String> summary_lines = xml_summary.length() ? xml_summary.split("\n") : Vector<String>();
|
||||||
|
@ -1575,6 +1581,12 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf
|
||||||
ERR_FAIL_COND_V_MSG(return_type->is_singleton, ERR_BUG,
|
ERR_FAIL_COND_V_MSG(return_type->is_singleton, ERR_BUG,
|
||||||
"Method return type is a singleton: '" + p_itype.name + "." + p_imethod.name + "'.");
|
"Method return type is a singleton: '" + p_itype.name + "." + p_imethod.name + "'.");
|
||||||
|
|
||||||
|
if (p_itype.api_type == ClassDB::API_CORE) {
|
||||||
|
ERR_FAIL_COND_V_MSG(return_type->api_type == ClassDB::API_EDITOR, ERR_BUG,
|
||||||
|
"Method '" + p_itype.name + "." + p_imethod.name + "' has return type '" + return_type->name +
|
||||||
|
"' from the editor API. Core API cannot have dependencies on the editor API.");
|
||||||
|
}
|
||||||
|
|
||||||
String method_bind_field = "__method_bind_" + itos(p_method_bind_count);
|
String method_bind_field = "__method_bind_" + itos(p_method_bind_count);
|
||||||
|
|
||||||
String arguments_sig;
|
String arguments_sig;
|
||||||
|
@ -1593,6 +1605,12 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf
|
||||||
ERR_FAIL_COND_V_MSG(arg_type->is_singleton, ERR_BUG,
|
ERR_FAIL_COND_V_MSG(arg_type->is_singleton, ERR_BUG,
|
||||||
"Argument type is a singleton: '" + iarg.name + "' of method '" + p_itype.name + "." + p_imethod.name + "'.");
|
"Argument type is a singleton: '" + iarg.name + "' of method '" + p_itype.name + "." + p_imethod.name + "'.");
|
||||||
|
|
||||||
|
if (p_itype.api_type == ClassDB::API_CORE) {
|
||||||
|
ERR_FAIL_COND_V_MSG(arg_type->api_type == ClassDB::API_EDITOR, ERR_BUG,
|
||||||
|
"Argument '" + iarg.name + "' of method '" + p_itype.name + "." + p_imethod.name + "' has type '" +
|
||||||
|
arg_type->name + "' from the editor API. Core API cannot have dependencies on the editor API.");
|
||||||
|
}
|
||||||
|
|
||||||
if (iarg.default_argument.size()) {
|
if (iarg.default_argument.size()) {
|
||||||
CRASH_COND_MSG(!_arg_default_value_is_assignable_to_type(iarg.def_param_value, *arg_type),
|
CRASH_COND_MSG(!_arg_default_value_is_assignable_to_type(iarg.def_param_value, *arg_type),
|
||||||
"Invalid default value for parameter '" + iarg.name + "' of method '" + p_itype.name + "." + p_imethod.name + "'.");
|
"Invalid default value for parameter '" + iarg.name + "' of method '" + p_itype.name + "." + p_imethod.name + "'.");
|
||||||
|
@ -1806,7 +1824,13 @@ Error BindingsGenerator::_generate_cs_signal(const BindingsGenerator::TypeInterf
|
||||||
const TypeInterface *arg_type = _get_type_or_placeholder(iarg.type);
|
const TypeInterface *arg_type = _get_type_or_placeholder(iarg.type);
|
||||||
|
|
||||||
ERR_FAIL_COND_V_MSG(arg_type->is_singleton, ERR_BUG,
|
ERR_FAIL_COND_V_MSG(arg_type->is_singleton, ERR_BUG,
|
||||||
"Argument type is a singleton: '" + iarg.name + "' of signal" + p_itype.name + "." + p_isignal.name + "'.");
|
"Argument type is a singleton: '" + iarg.name + "' of signal '" + p_itype.name + "." + p_isignal.name + "'.");
|
||||||
|
|
||||||
|
if (p_itype.api_type == ClassDB::API_CORE) {
|
||||||
|
ERR_FAIL_COND_V_MSG(arg_type->api_type == ClassDB::API_EDITOR, ERR_BUG,
|
||||||
|
"Argument '" + iarg.name + "' of signal '" + p_itype.name + "." + p_isignal.name + "' has type '" +
|
||||||
|
arg_type->name + "' from the editor API. Core API cannot have dependencies on the editor API.");
|
||||||
|
}
|
||||||
|
|
||||||
// Add the current arguments to the signature
|
// Add the current arguments to the signature
|
||||||
|
|
||||||
|
|
|
@ -340,7 +340,14 @@ void validate_property(const Context &p_context, const ExposedClass &p_class, co
|
||||||
if (prop_class) {
|
if (prop_class) {
|
||||||
TEST_COND(prop_class->is_singleton,
|
TEST_COND(prop_class->is_singleton,
|
||||||
"Property type is a singleton: '", p_class.name, ".", String(p_prop.name), "'.");
|
"Property type is a singleton: '", p_class.name, ".", String(p_prop.name), "'.");
|
||||||
|
|
||||||
|
if (p_class.api_type == ClassDB::API_CORE) {
|
||||||
|
TEST_COND(prop_class->api_type == ClassDB::API_EDITOR,
|
||||||
|
"Property '", p_class.name, ".", p_prop.name, "' has type '", prop_class->name,
|
||||||
|
"' from the editor API. Core API cannot have dependencies on the editor API.");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Look for types that don't inherit Object
|
||||||
TEST_FAIL_COND(!p_context.has_type(prop_type_ref),
|
TEST_FAIL_COND(!p_context.has_type(prop_type_ref),
|
||||||
"Property type '", prop_type_ref.name, "' not found: '", p_class.name, ".", String(p_prop.name), "'.");
|
"Property type '", prop_type_ref.name, "' not found: '", p_class.name, ".", String(p_prop.name), "'.");
|
||||||
}
|
}
|
||||||
|
@ -370,10 +377,22 @@ void validate_property(const Context &p_context, const ExposedClass &p_class, co
|
||||||
}
|
}
|
||||||
|
|
||||||
void validate_method(const Context &p_context, const ExposedClass &p_class, const MethodData &p_method) {
|
void validate_method(const Context &p_context, const ExposedClass &p_class, const MethodData &p_method) {
|
||||||
|
if (p_method.return_type.name != StringName()) {
|
||||||
const ExposedClass *return_class = p_context.find_exposed_class(p_method.return_type);
|
const ExposedClass *return_class = p_context.find_exposed_class(p_method.return_type);
|
||||||
if (return_class) {
|
if (return_class) {
|
||||||
TEST_COND(return_class->is_singleton,
|
TEST_COND(return_class->is_singleton,
|
||||||
"Method return type is a singleton: '", p_class.name, ".", p_method.name, "'.");
|
"Method return type is a singleton: '", p_class.name, ".", p_method.name, "'.");
|
||||||
|
|
||||||
|
if (p_class.api_type == ClassDB::API_CORE) {
|
||||||
|
TEST_COND(return_class->api_type == ClassDB::API_EDITOR,
|
||||||
|
"Method '", p_class.name, ".", p_method.name, "' has return type '", return_class->name,
|
||||||
|
"' from the editor API. Core API cannot have dependencies on the editor API.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Look for types that don't inherit Object
|
||||||
|
TEST_FAIL_COND(!p_context.has_type(p_method.return_type),
|
||||||
|
"Method return type '", p_method.return_type.name, "' not found: '", p_class.name, ".", p_method.name, "'.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const List<ArgumentData>::Element *F = p_method.arguments.front(); F; F = F->next()) {
|
for (const List<ArgumentData>::Element *F = p_method.arguments.front(); F; F = F->next()) {
|
||||||
|
@ -383,7 +402,14 @@ void validate_method(const Context &p_context, const ExposedClass &p_class, cons
|
||||||
if (arg_class) {
|
if (arg_class) {
|
||||||
TEST_COND(arg_class->is_singleton,
|
TEST_COND(arg_class->is_singleton,
|
||||||
"Argument type is a singleton: '", arg.name, "' of method '", p_class.name, ".", p_method.name, "'.");
|
"Argument type is a singleton: '", arg.name, "' of method '", p_class.name, ".", p_method.name, "'.");
|
||||||
|
|
||||||
|
if (p_class.api_type == ClassDB::API_CORE) {
|
||||||
|
TEST_COND(arg_class->api_type == ClassDB::API_EDITOR,
|
||||||
|
"Argument '", arg.name, "' of method '", p_class.name, ".", p_method.name, "' has type '",
|
||||||
|
arg_class->name, "' from the editor API. Core API cannot have dependencies on the editor API.");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Look for types that don't inherit Object
|
||||||
TEST_FAIL_COND(!p_context.has_type(arg.type),
|
TEST_FAIL_COND(!p_context.has_type(arg.type),
|
||||||
"Argument type '", arg.type.name, "' not found: '", arg.name, "' of method", p_class.name, ".", p_method.name, "'.");
|
"Argument type '", arg.type.name, "' not found: '", arg.name, "' of method", p_class.name, ".", p_method.name, "'.");
|
||||||
}
|
}
|
||||||
|
@ -407,8 +433,15 @@ void validate_signal(const Context &p_context, const ExposedClass &p_class, cons
|
||||||
const ExposedClass *arg_class = p_context.find_exposed_class(arg.type);
|
const ExposedClass *arg_class = p_context.find_exposed_class(arg.type);
|
||||||
if (arg_class) {
|
if (arg_class) {
|
||||||
TEST_COND(arg_class->is_singleton,
|
TEST_COND(arg_class->is_singleton,
|
||||||
"Argument class is a singleton: '", arg.name, "' of signal", p_class.name, ".", p_signal.name, "'.");
|
"Argument class is a singleton: '", arg.name, "' of signal '", p_class.name, ".", p_signal.name, "'.");
|
||||||
|
|
||||||
|
if (p_class.api_type == ClassDB::API_CORE) {
|
||||||
|
TEST_COND(arg_class->api_type == ClassDB::API_EDITOR,
|
||||||
|
"Argument '", arg.name, "' of signal '", p_class.name, ".", p_signal.name, "' has type '",
|
||||||
|
arg_class->name, "' from the editor API. Core API cannot have dependencies on the editor API.");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Look for types that don't inherit Object
|
||||||
TEST_FAIL_COND(!p_context.has_type(arg.type),
|
TEST_FAIL_COND(!p_context.has_type(arg.type),
|
||||||
"Argument type '", arg.type.name, "' not found: '", arg.name, "' of signal", p_class.name, ".", p_signal.name, "'.");
|
"Argument type '", arg.type.name, "' not found: '", arg.name, "' of signal", p_class.name, ".", p_signal.name, "'.");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue