diff --git a/src/ipc.cc b/src/ipc.cc index eceeadb7..767528fe 100644 --- a/src/ipc.cc +++ b/src/ipc.cc @@ -10,6 +10,8 @@ const char* IpcIdToString(IpcId id) { return "initialize"; case IpcId::Initialized: return "initialized"; + case IpcId::Shutdown: + return "shutdown"; case IpcId::Exit: return "exit"; case IpcId::TextDocumentDidOpen: diff --git a/src/ipc.h b/src/ipc.h index 4c51420b..c626c7a8 100644 --- a/src/ipc.h +++ b/src/ipc.h @@ -10,6 +10,7 @@ enum class IpcId : int { CancelRequest = 0, Initialize, Initialized, + Shutdown, Exit, TextDocumentDidOpen, TextDocumentDidChange, diff --git a/src/messages/shutdown.cc b/src/messages/shutdown.cc new file mode 100644 index 00000000..b8ea5eaa --- /dev/null +++ b/src/messages/shutdown.cc @@ -0,0 +1,27 @@ +#include "message_handler.h" +#include "queue_manager.h" + +namespace { +struct Ipc_Shutdown : public IpcMessage { + static const IpcId kIpcId = IpcId::Shutdown; +}; +MAKE_REFLECT_EMPTY_STRUCT(Ipc_Shutdown); +REGISTER_IPC_MESSAGE(Ipc_Shutdown); + +struct Out_Shutdown + : public lsOutMessage { + lsRequestId id; + std::monostate result; +}; +MAKE_REFLECT_STRUCT(Out_Shutdown, jsonrpc, id, result); + +struct ShutdownHandler : BaseMessageHandler { + void Run(Ipc_Shutdown* request) override { + Out_Shutdown out; + // FIXME lsRequestId should be number | string | null + out.id.id0 = 0; + QueueManager::WriteStdout(IpcId::TextDocumentDefinition, out); + } +}; +REGISTER_MESSAGE_HANDLER(ShutdownHandler); +} // namespace diff --git a/src/serializer.cc b/src/serializer.cc index 9c447b17..0fff4eae 100644 --- a/src/serializer.cc +++ b/src/serializer.cc @@ -201,6 +201,14 @@ void Reflect(TVisitor& visitor, IndexFile& value) { REFLECT_MEMBER_END(); } +void Reflect(Reader& visitor, std::monostate&) { + visitor.GetNull(); +} + +void Reflect(Writer& visitor, std::monostate&) { + visitor.Null(); +} + void Reflect(Reader& visitor, SerializeFormat& value) { std::string fmt = visitor.GetString(); value = fmt[0] == 'm' ? SerializeFormat::MessagePack : SerializeFormat::Json; diff --git a/src/serializer.h b/src/serializer.h index 29c9a41c..b62dd39a 100644 --- a/src/serializer.h +++ b/src/serializer.h @@ -255,6 +255,9 @@ void ReflectMember(Reader& visitor, const char* name, T& value) { // Specializations +void Reflect(Reader& visitor, std::monostate&); +void Reflect(Writer& visitor, std::monostate&); + void Reflect(Reader& visitor, SerializeFormat& value); void Reflect(Writer& visitor, SerializeFormat& value);