diff options
author | Itamar <itamar8910@gmail.com> | 2021-01-23 19:48:42 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-01-27 21:10:57 +0100 |
commit | 8ed96eb27c332bd86dafd3da78b362668e00e0b9 (patch) | |
tree | 34d04984ca5d10afef29dda41f2ab49a03206820 /Userland/DevTools | |
parent | c85dad2383816166fc170ad283f7011984a88708 (diff) | |
download | serenity-8ed96eb27c332bd86dafd3da78b362668e00e0b9.zip |
HackStudio: Attach previous Language Client when detaching
Previously, if a new LanguageClient was created & destroyed, the
ServerConnection to the language server would be left without an
attached LanguageClient.
As a result, auto-completion results would not be updated in the UI.
Starting with this commit, the LanguageClient holds a WeakPtr to the
previous LanguageClient that was attached to the ServerConnection,
and re-attaches it after detaching itself.
Diffstat (limited to 'Userland/DevTools')
-rw-r--r-- | Userland/DevTools/HackStudio/LanguageClient.cpp | 7 | ||||
-rw-r--r-- | Userland/DevTools/HackStudio/LanguageClient.h | 12 |
2 files changed, 15 insertions, 4 deletions
diff --git a/Userland/DevTools/HackStudio/LanguageClient.cpp b/Userland/DevTools/HackStudio/LanguageClient.cpp index a10df6d4b6..e02b2c98cf 100644 --- a/Userland/DevTools/HackStudio/LanguageClient.cpp +++ b/Userland/DevTools/HackStudio/LanguageClient.cpp @@ -32,8 +32,11 @@ namespace HackStudio { void ServerConnection::handle(const Messages::LanguageClient::AutoCompleteSuggestions& message) { - if (m_language_client) - m_language_client->provide_autocomplete_suggestions(message.suggestions()); + if (!m_language_client) { + dbgln("Language Server connection has no attached language client"); + return; + } + m_language_client->provide_autocomplete_suggestions(message.suggestions()); } void LanguageClient::open_file(const String& path, int fd) diff --git a/Userland/DevTools/HackStudio/LanguageClient.h b/Userland/DevTools/HackStudio/LanguageClient.h index bf294a7ea6..03c362f6a7 100644 --- a/Userland/DevTools/HackStudio/LanguageClient.h +++ b/Userland/DevTools/HackStudio/LanguageClient.h @@ -30,6 +30,8 @@ #include <AK/Forward.h> #include <AK/LexicalPath.h> #include <AK/Types.h> +#include <AK/WeakPtr.h> +#include <AK/Weakable.h> #include <LibIPC/ServerConnection.h> #include <DevTools/HackStudio/LanguageServers/LanguageClientEndpoint.h> @@ -64,6 +66,8 @@ public: set_my_client_id(response->client_id()); } + WeakPtr<LanguageClient> language_client() { return m_language_client; } + template<typename ConcreteType> static NonnullRefPtr<ServerConnection> get_or_create(const String& project_path) { @@ -81,21 +85,24 @@ public: protected: virtual void handle(const Messages::LanguageClient::AutoCompleteSuggestions&) override; - LanguageClient* m_language_client { nullptr }; + WeakPtr<LanguageClient> m_language_client; }; -class LanguageClient { +class LanguageClient : public Weakable<LanguageClient> { public: explicit LanguageClient(NonnullRefPtr<ServerConnection>&& connection) : m_connection(*connection) , m_server_connection(move(connection)) { + m_previous_client = m_connection.language_client(); m_connection.attach(*this); } virtual ~LanguageClient() { m_connection.detach(); + if (m_previous_client) + m_connection.attach(*m_previous_client); } virtual void open_file(const String& path, int fd); @@ -111,6 +118,7 @@ public: private: ServerConnection& m_connection; NonnullRefPtr<ServerConnection> m_server_connection; + WeakPtr<LanguageClient> m_previous_client; }; template<typename ServerConnectionT> |