Path: blob/master/modules/gdscript/language_server/gdscript_language_server.cpp
10278 views
/**************************************************************************/1/* gdscript_language_server.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "gdscript_language_server.h"3132#include "core/os/os.h"33#include "editor/editor_log.h"34#include "editor/editor_node.h"35#include "editor/settings/editor_settings.h"3637int GDScriptLanguageServer::port_override = -1;3839GDScriptLanguageServer::GDScriptLanguageServer() {40// TODO: Move to editor_settings.cpp41_EDITOR_DEF("network/language_server/remote_host", host);42_EDITOR_DEF("network/language_server/remote_port", port);43_EDITOR_DEF("network/language_server/enable_smart_resolve", true);44_EDITOR_DEF("network/language_server/show_native_symbols_in_editor", false);45_EDITOR_DEF("network/language_server/use_thread", use_thread);46_EDITOR_DEF("network/language_server/poll_limit_usec", poll_limit_usec);4748set_process_internal(true);49}5051void GDScriptLanguageServer::_notification(int p_what) {52switch (p_what) {53case NOTIFICATION_EXIT_TREE: {54stop();55} break;5657case NOTIFICATION_INTERNAL_PROCESS: {58if (!started && EditorNode::get_singleton()->is_editor_ready()) {59start();60}6162if (started && !use_thread) {63protocol.poll(poll_limit_usec);64}65} break;6667case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {68if (!EditorSettings::get_singleton()->check_changed_settings_in_group("network/language_server")) {69break;70}7172String remote_host = String(_EDITOR_GET("network/language_server/remote_host"));73int remote_port = (GDScriptLanguageServer::port_override > -1) ? GDScriptLanguageServer::port_override : (int)_EDITOR_GET("network/language_server/remote_port");74bool remote_use_thread = (bool)_EDITOR_GET("network/language_server/use_thread");75int remote_poll_limit = (int)_EDITOR_GET("network/language_server/poll_limit_usec");76if (remote_host != host || remote_port != port || remote_use_thread != use_thread || remote_poll_limit != poll_limit_usec) {77stop();78start();79}80} break;81}82}8384void GDScriptLanguageServer::thread_main(void *p_userdata) {85set_current_thread_safe_for_nodes(true);86GDScriptLanguageServer *self = static_cast<GDScriptLanguageServer *>(p_userdata);87while (self->thread_running) {88// Poll 20 times per second89self->protocol.poll(self->poll_limit_usec);90OS::get_singleton()->delay_usec(50000);91}92}9394void GDScriptLanguageServer::start() {95host = String(_EDITOR_GET("network/language_server/remote_host"));96port = (GDScriptLanguageServer::port_override > -1) ? GDScriptLanguageServer::port_override : (int)_EDITOR_GET("network/language_server/remote_port");97use_thread = (bool)_EDITOR_GET("network/language_server/use_thread");98poll_limit_usec = (int)_EDITOR_GET("network/language_server/poll_limit_usec");99if (protocol.start(port, IPAddress(host)) == OK) {100EditorNode::get_log()->add_message("--- GDScript language server started on port " + itos(port) + " ---", EditorLog::MSG_TYPE_EDITOR);101if (use_thread) {102thread_running = true;103thread.start(GDScriptLanguageServer::thread_main, this);104}105set_process_internal(!use_thread);106started = true;107}108}109110void GDScriptLanguageServer::stop() {111if (use_thread) {112ERR_FAIL_COND(!thread.is_started());113thread_running = false;114thread.wait_to_finish();115}116protocol.stop();117started = false;118EditorNode::get_log()->add_message("--- GDScript language server stopped ---", EditorLog::MSG_TYPE_EDITOR);119}120121void register_lsp_types() {122GDREGISTER_CLASS(GDScriptLanguageProtocol);123GDREGISTER_CLASS(GDScriptTextDocument);124GDREGISTER_CLASS(GDScriptWorkspace);125}126127128