#ifndef LSP_H #define LSP_H #include "editor/editor.h" #include "pch.h" #include "utils/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; bool allow_completion = false; std::string trigger_chars; 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; extern Queue lsp_open_queue; static json client_capabilities = { {"textDocument", {{"publishDiagnostics", {{"relatedInformation", true}}}, {"hover", {{"contentFormat", {"markdown", "plaintext"}}}}, {"completion", {{"completionItem", {{"snippetSupport", true}, {"documentationFormat", {"markdown", "plaintext"}}, {"resolveSupport", {{"properties", {"documentation", "detail"}}}}, {"insertReplaceSupport", true}, {"labelDetailsSupport", true}, {"insertTextModeSupport", {{"valueSet", {1}}}}}}, {"completionItemKind", {{"valueSet", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}}}, {"contextSupport", true}, {"insertTextMode", 1}}}}}}; void lsp_send(std::shared_ptr lsp, json message, LSPPending *pending); void lsp_worker(); std::shared_ptr get_or_init_lsp(uint8_t lsp_id); void clean_lsp(std::shared_ptr lsp, uint8_t lsp_id); void close_lsp(uint8_t lsp_id); void open_editor(std::shared_ptr lsp, std::pair entry); void request_add_to_lsp(Language language, Editor *editor); void add_to_lsp(Language language, Editor *editor); void remove_from_lsp(Editor *editor); void lsp_handle(std::shared_ptr lsp, json message); #endif