From e7e179212c5b1938fd00da62a1d5aca8441cf487 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Sat, 21 Nov 2020 22:12:37 +0300 Subject: HackStudio: Send an open file to language servers Language servers will now receive an open file instead of just its path. This means the language servers no longer need to access the filesystem to open the file themselves. The C++ language server now has no filesystem access whatsoever (although we might need to relax this in the future if it learns to complete #include paths), while the Shell language server can read /etc/passwd (it wants that in order to get the user's home directory) and browse (but not read!) the whole file system tree for completing paths. --- .../LanguageServers/Shell/ClientConnection.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'DevTools/HackStudio/LanguageServers/Shell/ClientConnection.cpp') diff --git a/DevTools/HackStudio/LanguageServers/Shell/ClientConnection.cpp b/DevTools/HackStudio/LanguageServers/Shell/ClientConnection.cpp index 823a36290f..3e32c0d7e9 100644 --- a/DevTools/HackStudio/LanguageServers/Shell/ClientConnection.cpp +++ b/DevTools/HackStudio/LanguageServers/Shell/ClientConnection.cpp @@ -53,12 +53,8 @@ void ClientConnection::die() exit(0); } -OwnPtr ClientConnection::handle(const Messages::LanguageServer::Greet& message) +OwnPtr ClientConnection::handle(const Messages::LanguageServer::Greet&) { - m_project_root = LexicalPath(message.project_root()); -#ifdef DEBUG_SH_LANGUAGE_SERVER - dbgln("project_root: {}", m_project_root); -#endif return make(client_id()); } @@ -81,16 +77,11 @@ static DefaultDocumentClient s_default_document_client; void ClientConnection::handle(const Messages::LanguageServer::FileOpened& message) { - LexicalPath file_path(String::formatted("{}/{}", m_project_root, message.file_name())); -#ifdef DEBUG_SH_LANGUAGE_SERVER - dbgln("FileOpened: {}", file_path); -#endif - - auto file = Core::File::construct(file_path.string()); - if (!file->open(Core::IODevice::ReadOnly)) { + auto file = Core::File::construct(this); + if (!file->open(message.file().fd(), Core::IODevice::ReadOnly, Core::File::ShouldCloseFileDescriptor::Yes)) { errno = file->error(); perror("open"); - dbgln("Failed to open project file: {}", file_path); + dbgln("Failed to open project file"); return; } auto content = file->read_all(); -- cgit v1.2.3