Browse Source

Merge pull request #38393 from nekomatata/printerr-remote-debugger-4.0

Format remote printerr properly in script debugger output
Rémi Verschelde 5 years ago
parent
commit
33d0b9e169

+ 28 - 5
core/debugger/remote_debugger.cpp

@@ -480,10 +480,16 @@ void RemoteDebugger::_print_handler(void *p_this, const String &p_string, bool p
 	if (rd->is_peer_connected()) {
 	if (rd->is_peer_connected()) {
 		if (overflowed)
 		if (overflowed)
 			s += "[...]";
 			s += "[...]";
-		rd->output_strings.push_back(s);
+
+		OutputString output_string;
+		output_string.message = s;
+		output_string.type = p_error ? MESSAGE_TYPE_ERROR : MESSAGE_TYPE_LOG;
+		rd->output_strings.push_back(output_string);
 
 
 		if (overflowed) {
 		if (overflowed) {
-			rd->output_strings.push_back("[output overflow, print less text!]");
+			output_string.message = "[output overflow, print less text!]";
+			output_string.type = MESSAGE_TYPE_ERROR;
+			rd->output_strings.push_back(output_string);
 		}
 		}
 	}
 	}
 }
 }
@@ -517,15 +523,32 @@ void RemoteDebugger::flush_output() {
 	if (output_strings.size()) {
 	if (output_strings.size()) {
 
 
 		// Join output strings so we generate less messages.
 		// Join output strings so we generate less messages.
+		Vector<String> joined_log_strings;
 		Vector<String> strings;
 		Vector<String> strings;
-		strings.resize(output_strings.size());
-		String *w = strings.ptrw();
+		Vector<int> types;
 		for (int i = 0; i < output_strings.size(); i++) {
 		for (int i = 0; i < output_strings.size(); i++) {
-			w[i] = output_strings[i];
+			const OutputString &output_string = output_strings[i];
+			if (output_string.type == MESSAGE_TYPE_ERROR) {
+				if (!joined_log_strings.empty()) {
+					strings.push_back(String("\n").join(joined_log_strings));
+					types.push_back(MESSAGE_TYPE_LOG);
+					joined_log_strings.clear();
+				}
+				strings.push_back(output_string.message);
+				types.push_back(MESSAGE_TYPE_ERROR);
+			} else {
+				joined_log_strings.push_back(output_string.message);
+			}
+		}
+
+		if (!joined_log_strings.empty()) {
+			strings.push_back(String("\n").join(joined_log_strings));
+			types.push_back(MESSAGE_TYPE_LOG);
 		}
 		}
 
 
 		Array arr;
 		Array arr;
 		arr.push_back(strings);
 		arr.push_back(strings);
+		arr.push_back(types);
 		_put_msg("output", arr);
 		_put_msg("output", arr);
 		output_strings.clear();
 		output_strings.clear();
 	}
 	}

+ 10 - 1
core/debugger/remote_debugger.h

@@ -40,6 +40,11 @@
 #include "core/ustring.h"
 #include "core/ustring.h"
 
 
 class RemoteDebugger : public EngineDebugger {
 class RemoteDebugger : public EngineDebugger {
+public:
+	enum MessageType {
+		MESSAGE_TYPE_LOG,
+		MESSAGE_TYPE_ERROR,
+	};
 
 
 private:
 private:
 	typedef DebuggerMarshalls::OutputError ErrorMessage;
 	typedef DebuggerMarshalls::OutputError ErrorMessage;
@@ -57,7 +62,11 @@ private:
 
 
 	Ref<RemoteDebuggerPeer> peer;
 	Ref<RemoteDebuggerPeer> peer;
 
 
-	List<String> output_strings;
+	struct OutputString {
+		String message;
+		MessageType type;
+	};
+	List<OutputString> output_strings;
 	List<ErrorMessage> errors;
 	List<ErrorMessage> errors;
 
 
 	int n_messages_dropped = 0;
 	int n_messages_dropped = 0;

+ 27 - 3
editor/debugger/script_editor_debugger.cpp

@@ -31,6 +31,7 @@
 #include "script_editor_debugger.h"
 #include "script_editor_debugger.h"
 
 
 #include "core/debugger/debugger_marshalls.h"
 #include "core/debugger/debugger_marshalls.h"
+#include "core/debugger/remote_debugger.h"
 #include "core/io/marshalls.h"
 #include "core/io/marshalls.h"
 #include "core/project_settings.h"
 #include "core/project_settings.h"
 #include "core/ustring.h"
 #include "core/ustring.h"
@@ -396,10 +397,33 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
 		inspector->add_stack_variable(p_data);
 		inspector->add_stack_variable(p_data);
 
 
 	} else if (p_msg == "output") {
 	} else if (p_msg == "output") {
-		ERR_FAIL_COND(p_data.size() < 1);
+		ERR_FAIL_COND(p_data.size() != 2);
+
 		ERR_FAIL_COND(p_data[0].get_type() != Variant::PACKED_STRING_ARRAY);
 		ERR_FAIL_COND(p_data[0].get_type() != Variant::PACKED_STRING_ARRAY);
-		Vector<String> strings = p_data[0];
-		EditorNode::get_log()->add_message(String("\n").join(strings));
+		Vector<String> output_strings = p_data[0];
+
+		ERR_FAIL_COND(p_data[1].get_type() != Variant::PACKED_INT32_ARRAY);
+		Vector<int> output_types = p_data[1];
+
+		ERR_FAIL_COND(output_strings.size() != output_types.size());
+
+		for (int i = 0; i < output_strings.size(); i++) {
+			RemoteDebugger::MessageType type = (RemoteDebugger::MessageType)(int)(output_types[i]);
+			EditorLog::MessageType msg_type;
+			switch (type) {
+				case RemoteDebugger::MESSAGE_TYPE_LOG: {
+					msg_type = EditorLog::MSG_TYPE_STD;
+				} break;
+				case RemoteDebugger::MESSAGE_TYPE_ERROR: {
+					msg_type = EditorLog::MSG_TYPE_ERROR;
+				} break;
+				default: {
+					WARN_PRINT("Unhandled script debugger message type: " + itos(type));
+					msg_type = EditorLog::MSG_TYPE_STD;
+				} break;
+			}
+			EditorNode::get_log()->add_message(output_strings[i], msg_type);
+		}
 	} else if (p_msg == "performance:profile_frame") {
 	} else if (p_msg == "performance:profile_frame") {
 		Vector<float> p;
 		Vector<float> p;
 		p.resize(p_data.size());
 		p.resize(p_data.size());