You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-12 13:20:55 +00:00
Improve shader overloaded function error reporting.
This commit is contained in:
@@ -3865,6 +3865,14 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|||||||
int last_arg_count = 0;
|
int last_arg_count = 0;
|
||||||
bool exists = false;
|
bool exists = false;
|
||||||
String arg_list = "";
|
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++) {
|
for (int i = 0; i < shader->vfunctions.size(); i++) {
|
||||||
if (rname != shader->vfunctions[i].rname) {
|
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;
|
FunctionNode *pfunc = shader->vfunctions[i].function;
|
||||||
if (arg_list.is_empty()) {
|
arg_list.clear();
|
||||||
for (int j = 0; j < pfunc->arguments.size(); j++) {
|
for (int j = 0; j < pfunc->arguments.size(); j++) {
|
||||||
if (j > 0) {
|
if (j > 0) {
|
||||||
arg_list += ", ";
|
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;
|
|
||||||
}
|
}
|
||||||
|
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()) {
|
if (pfunc->arguments.size() != args.size()) {
|
||||||
@@ -3933,9 +3940,17 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|||||||
arg_name += "]";
|
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;
|
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;
|
break;
|
||||||
|
} else {
|
||||||
|
overload_fail = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3971,6 +3986,19 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|||||||
return true;
|
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 (exists) {
|
||||||
if (last_arg_count > args.size()) {
|
if (last_arg_count > args.size()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user