mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 07:53:26 +00:00
Merge pull request #109548 from bruvzg/shader_x
Improve shader overloaded function error reporting.
This commit is contained in:
commit
6f298b6642
1 changed files with 46 additions and 18 deletions
|
@ -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()) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue