#ifndef LSP_H #define LSP_H #include "./editor.h" #include "./pch.h" #include "utils.h" struct LSP { const char *command; std::vector args; }; struct LSPPending { std::string method; Editor *editor = nullptr; std::function callback; }; struct LSPOpenRequest { Language language; Editor *editor; }; struct LSPInstance { std::shared_mutex mtx; const LSP *lsp; std::string root_dir; int pid{-1}; int stdin_fd{-1}; int stdout_fd{-1}; std::atomic initialized = false; std::atomic exited = false; bool incremental_sync = false; bool allow_hover = false; uint32_t last_id = 0; Queue inbox; Queue outbox; Queue> open_queue; std::unordered_map pending; std::vector editors; }; extern std::shared_mutex active_lsps_mtx; extern std::unordered_map> active_lsps; void lsp_worker(); void lsp_handle(std::shared_ptr lsp, json message); std::shared_ptr get_or_init_lsp(uint8_t lsp_id); void close_lsp(uint8_t lsp_id); void request_add_to_lsp(Language language, Editor *editor); void open_editor(std::shared_ptr lsp, std::pair entry); void add_to_lsp(Language language, Editor *editor); void remove_from_lsp(Editor *editor); void lsp_send(std::shared_ptr lsp, json message, LSPPending *pending); #endif