Merge pull request #109548 from bruvzg/shader_x

Improve shader overloaded function error reporting.
This commit is contained in:
Thaddeus Crews 2025-08-14 09:28:01 -05:00
commit 6f298b6642
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC

View file

@ -3865,6 +3865,14 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
int last_arg_count = 0;
bool exists = false;
String arg_list = "";
bool overload_fail = false;
struct OverloadErrorInfo {
String arg_list;
int index = 0;
String func_arg_name;
String arg_name;
};
Vector<OverloadErrorInfo> overload_errors;
for (int i = 0; i < shader->vfunctions.size(); i++) {
if (rname != shader->vfunctions[i].rname) {
@ -3878,24 +3886,23 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
}
FunctionNode *pfunc = shader->vfunctions[i].function;
if (arg_list.is_empty()) {
for (int j = 0; j < pfunc->arguments.size(); j++) {
if (j > 0) {
arg_list += ", ";
}
String func_arg_name;
if (pfunc->arguments[j].type == TYPE_STRUCT) {
func_arg_name = pfunc->arguments[j].struct_name;
} else {
func_arg_name = get_datatype_name(pfunc->arguments[j].type);
}
if (pfunc->arguments[j].array_size > 0) {
func_arg_name += "[";
func_arg_name += itos(pfunc->arguments[j].array_size);
func_arg_name += "]";
}
arg_list += func_arg_name;
arg_list.clear();
for (int j = 0; j < pfunc->arguments.size(); j++) {
if (j > 0) {
arg_list += ", ";
}
String func_arg_name;
if (pfunc->arguments[j].type == TYPE_STRUCT) {
func_arg_name = pfunc->arguments[j].struct_name;
} else {
func_arg_name = get_datatype_name(pfunc->arguments[j].type);
}
if (pfunc->arguments[j].array_size > 0) {
func_arg_name += "[";
func_arg_name += itos(pfunc->arguments[j].array_size);
func_arg_name += "]";
}
arg_list += func_arg_name;
}
if (pfunc->arguments.size() != args.size()) {
@ -3933,9 +3940,17 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
arg_name += "]";
}
_set_error(vformat(RTR("Invalid argument for \"%s(%s)\" function: argument %d should be %s but is %s."), String(rname), arg_list, j + 1, func_arg_name, arg_name));
fail = true;
OverloadErrorInfo err_info;
err_info.arg_list = arg_list;
err_info.index = j + 1;
err_info.func_arg_name = func_arg_name;
err_info.arg_name = arg_name;
overload_errors.push_back(err_info);
overload_fail = true;
break;
} else {
overload_fail = false;
}
}
@ -3971,6 +3986,19 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
return true;
}
}
if (overload_fail) {
String err_str;
if (overload_errors.size() == 1) {
const OverloadErrorInfo &err_info = overload_errors[0];
err_str = vformat("No matching function for \"%s(%s)\" call: argument %d should be %s but is %s.", String(rname), err_info.arg_list, err_info.index, err_info.func_arg_name, err_info.arg_name);
} else {
err_str = vformat(RTR("No matching function for \"%s\" call:"), String(rname));
for (const OverloadErrorInfo &err_info : overload_errors) {
err_str += "\n\t" + vformat(RTR("candidate function \"%s(%s)\" not viable, argument %d should be %s but is %s."), String(rname), err_info.arg_list, err_info.index, err_info.func_arg_name, err_info.arg_name);
}
}
_set_error(err_str);
}
if (exists) {
if (last_arg_count > args.size()) {