Browse Source

Merge pull request #109548 from bruvzg/shader_x

Improve shader overloaded function error reporting.
Thaddeus Crews 1 month ago
parent
commit
6f298b6642
1 changed files with 46 additions and 18 deletions
  1. 46 18
      servers/rendering/shader_language.cpp

+ 46 - 18
servers/rendering/shader_language.cpp

@@ -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()) {
-			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()) {
 		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()) {