#pragma once #include "Protocol.h" #include "Scheduler.h" #include "Transport.h" namespace clice { // global server instance extern class Server server; /// core class responsible for starting the server class Server { uv_loop_t* loop; std::unique_ptr transport; Scheduler scheduler; std::map methods; public: int run(int argc, char** argv); int exit(); void handle_message(std::string_view message); template void register_method(std::string_view name) { methods[name] = [](R (*)(Args...)) { return [](std::string_view message) { // auto input = json::parse(message); // auto params = deserialize(input["params"]); // ptr(params); }; }(ptr); } private: /*===================================================/ / / /==================== LSP methods ===================/ / / /===================================================*/ // Server lifecycle void initialize(const InitializeParams& params); // Text Document Synchronization Task didOpen(const DidOpenTextDocumentParams& params); Task didChange(const DidChangeTextDocumentParams& params); Task didClose(const DidCloseTextDocumentParams& params); Task didSave(const DidSaveTextDocumentParams& params); // Language Features Task declaration(); Task definition(); Task typeDefinition(); Task implementation(); Task references(); Task callHierarchy(); /* ... */ Task hover(); Task codeLens(); /* ... */ Task foldingRange(); Task selectionRange(); Task documentSymbol(); Task semanticTokens(); Task inlineValue(); }; } // namespace clice