From a5b7c4c415ff9bf7e368371ddb88601bcb9e1232 Mon Sep 17 00:00:00 2001 From: ryanabx Date: Sun, 17 Sep 2023 22:09:18 -0500 Subject: [PATCH] Add `--lsp-port` as a command line argument --- main/main.cpp | 26 ++++++++++++++++--- .../gdscript_language_server.cpp | 8 +++--- .../gdscript_language_server.h | 1 + 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/main/main.cpp b/main/main.cpp index e24690f9926..f2209ed00f6 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -114,7 +114,10 @@ #ifdef MODULE_GDSCRIPT_ENABLED #include "modules/gdscript/gdscript.h" -#endif +#if defined(TOOLS_ENABLED) && !defined(GDSCRIPT_NO_LSP) +#include "modules/gdscript/language_server/gdscript_language_server.h" +#endif // TOOLS_ENABLED && !GDSCRIPT_NO_LSP +#endif // MODULE_GDSCRIPT_ENABLED /* Static members */ @@ -389,7 +392,10 @@ void Main::print_help(const char *p_binary) { OS::get_singleton()->print(" -e, --editor Start the editor instead of running the scene.\n"); OS::get_singleton()->print(" -p, --project-manager Start the project manager, even if a project is auto-detected.\n"); OS::get_singleton()->print(" --debug-server Start the editor debug server (://[:], e.g. tcp://127.0.0.1:6007)\n"); -#endif +#if defined(MODULE_GDSCRIPT_ENABLED) && !defined(GDSCRIPT_NO_LSP) + OS::get_singleton()->print(" --lsp-port Use the specified port for the language server protocol. The port must be between 0 to 65535.\n"); +#endif // MODULE_GDSCRIPT_ENABLED && !GDSCRIPT_NO_LSP +#endif // TOOLS_ENABLED OS::get_singleton()->print(" --quit Quit after the first iteration.\n"); OS::get_singleton()->print(" --quit-after Quit after the given number of iterations. Set to 0 to disable.\n"); OS::get_singleton()->print(" -l, --language Use a specific locale ( being a two-letter code).\n"); @@ -1504,7 +1510,21 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->print("Missing argument for --benchmark-file .\n"); goto error; } - +#if defined(TOOLS_ENABLED) && !defined(GDSCRIPT_NO_LSP) + } else if (I->get() == "--lsp-port") { + if (I->next()) { + int port_override = I->next()->get().to_int(); + if (port_override < 0 || port_override > 65535) { + OS::get_singleton()->print(" argument for --lsp-port must be between 0 and 65535.\n"); + goto error; + } + GDScriptLanguageServer::port_override = port_override; + N = I->next()->next(); + } else { + OS::get_singleton()->print("Missing argument for --lsp-port .\n"); + goto error; + } +#endif // TOOLS_ENABLED && !GDSCRIPT_NO_LSP } else if (I->get() == "--" || I->get() == "++") { adding_user_args = true; } else { diff --git a/modules/gdscript/language_server/gdscript_language_server.cpp b/modules/gdscript/language_server/gdscript_language_server.cpp index 8c444832880..053be7eec21 100644 --- a/modules/gdscript/language_server/gdscript_language_server.cpp +++ b/modules/gdscript/language_server/gdscript_language_server.cpp @@ -36,6 +36,8 @@ #include "editor/editor_node.h" #include "editor/editor_settings.h" +int GDScriptLanguageServer::port_override = -1; + GDScriptLanguageServer::GDScriptLanguageServer() { _EDITOR_DEF("network/language_server/remote_host", host); _EDITOR_DEF("network/language_server/remote_port", port); @@ -62,7 +64,7 @@ void GDScriptLanguageServer::_notification(int p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { String remote_host = String(_EDITOR_GET("network/language_server/remote_host")); - int remote_port = (int)_EDITOR_GET("network/language_server/remote_port"); + int remote_port = (GDScriptLanguageServer::port_override > -1) ? GDScriptLanguageServer::port_override : (int)_EDITOR_GET("network/language_server/remote_port"); bool remote_use_thread = (bool)_EDITOR_GET("network/language_server/use_thread"); if (remote_host != host || remote_port != port || remote_use_thread != use_thread) { stop(); @@ -84,10 +86,10 @@ void GDScriptLanguageServer::thread_main(void *p_userdata) { void GDScriptLanguageServer::start() { host = String(_EDITOR_GET("network/language_server/remote_host")); - port = (int)_EDITOR_GET("network/language_server/remote_port"); + port = (GDScriptLanguageServer::port_override > -1) ? GDScriptLanguageServer::port_override : (int)_EDITOR_GET("network/language_server/remote_port"); use_thread = (bool)_EDITOR_GET("network/language_server/use_thread"); if (protocol.start(port, IPAddress(host)) == OK) { - EditorNode::get_log()->add_message("--- GDScript language server started ---", EditorLog::MSG_TYPE_EDITOR); + EditorNode::get_log()->add_message("--- GDScript language server started on port " + itos(port) + " ---", EditorLog::MSG_TYPE_EDITOR); if (use_thread) { thread_running = true; thread.start(GDScriptLanguageServer::thread_main, this); diff --git a/modules/gdscript/language_server/gdscript_language_server.h b/modules/gdscript/language_server/gdscript_language_server.h index 75f9403a74e..e845d139bff 100644 --- a/modules/gdscript/language_server/gdscript_language_server.h +++ b/modules/gdscript/language_server/gdscript_language_server.h @@ -53,6 +53,7 @@ private: void _notification(int p_what); public: + static int port_override; GDScriptLanguageServer(); void start(); void stop();