Skip to content

Commit 6f298b6

Browse files
committed
Merge pull request #109548 from bruvzg/shader_x
Improve shader overloaded function error reporting.
2 parents a02ff44 + c3cc1ba commit 6f298b6

File tree

1 file changed

+46
-18
lines changed

1 file changed

+46
-18
lines changed

servers/rendering/shader_language.cpp

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3865,6 +3865,14 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
38653865
int last_arg_count = 0;
38663866
bool exists = false;
38673867
String arg_list = "";
3868+
bool overload_fail = false;
3869+
struct OverloadErrorInfo {
3870+
String arg_list;
3871+
int index = 0;
3872+
String func_arg_name;
3873+
String arg_name;
3874+
};
3875+
Vector<OverloadErrorInfo> overload_errors;
38683876

38693877
for (int i = 0; i < shader->vfunctions.size(); i++) {
38703878
if (rname != shader->vfunctions[i].rname) {
@@ -3878,24 +3886,23 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
38783886
}
38793887

38803888
FunctionNode *pfunc = shader->vfunctions[i].function;
3881-
if (arg_list.is_empty()) {
3882-
for (int j = 0; j < pfunc->arguments.size(); j++) {
3883-
if (j > 0) {
3884-
arg_list += ", ";
3885-
}
3886-
String func_arg_name;
3887-
if (pfunc->arguments[j].type == TYPE_STRUCT) {
3888-
func_arg_name = pfunc->arguments[j].struct_name;
3889-
} else {
3890-
func_arg_name = get_datatype_name(pfunc->arguments[j].type);
3891-
}
3892-
if (pfunc->arguments[j].array_size > 0) {
3893-
func_arg_name += "[";
3894-
func_arg_name += itos(pfunc->arguments[j].array_size);
3895-
func_arg_name += "]";
3896-
}
3897-
arg_list += func_arg_name;
3889+
arg_list.clear();
3890+
for (int j = 0; j < pfunc->arguments.size(); j++) {
3891+
if (j > 0) {
3892+
arg_list += ", ";
3893+
}
3894+
String func_arg_name;
3895+
if (pfunc->arguments[j].type == TYPE_STRUCT) {
3896+
func_arg_name = pfunc->arguments[j].struct_name;
3897+
} else {
3898+
func_arg_name = get_datatype_name(pfunc->arguments[j].type);
3899+
}
3900+
if (pfunc->arguments[j].array_size > 0) {
3901+
func_arg_name += "[";
3902+
func_arg_name += itos(pfunc->arguments[j].array_size);
3903+
func_arg_name += "]";
38983904
}
3905+
arg_list += func_arg_name;
38993906
}
39003907

39013908
if (pfunc->arguments.size() != args.size()) {
@@ -3933,9 +3940,17 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
39333940
arg_name += "]";
39343941
}
39353942

3936-
_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));
39373943
fail = true;
3944+
OverloadErrorInfo err_info;
3945+
err_info.arg_list = arg_list;
3946+
err_info.index = j + 1;
3947+
err_info.func_arg_name = func_arg_name;
3948+
err_info.arg_name = arg_name;
3949+
overload_errors.push_back(err_info);
3950+
overload_fail = true;
39383951
break;
3952+
} else {
3953+
overload_fail = false;
39393954
}
39403955
}
39413956

@@ -3971,6 +3986,19 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
39713986
return true;
39723987
}
39733988
}
3989+
if (overload_fail) {
3990+
String err_str;
3991+
if (overload_errors.size() == 1) {
3992+
const OverloadErrorInfo &err_info = overload_errors[0];
3993+
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);
3994+
} else {
3995+
err_str = vformat(RTR("No matching function for \"%s\" call:"), String(rname));
3996+
for (const OverloadErrorInfo &err_info : overload_errors) {
3997+
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);
3998+
}
3999+
}
4000+
_set_error(err_str);
4001+
}
39744002

39754003
if (exists) {
39764004
if (last_arg_count > args.size()) {

0 commit comments

Comments
 (0)