Add std::monostate to represent null field and add Ipc::Shutdown

Fixes #265

// FIXME lsRequestId should be number | string | null (std::variant<std::monostate, double, string>
This commit is contained in:
Fangrui Song 2018-01-09 00:20:51 -08:00
parent bcd3de18bb
commit 37152da0fc
5 changed files with 41 additions and 0 deletions

View File

@ -10,6 +10,8 @@ const char* IpcIdToString(IpcId id) {
return "initialize"; return "initialize";
case IpcId::Initialized: case IpcId::Initialized:
return "initialized"; return "initialized";
case IpcId::Shutdown:
return "shutdown";
case IpcId::Exit: case IpcId::Exit:
return "exit"; return "exit";
case IpcId::TextDocumentDidOpen: case IpcId::TextDocumentDidOpen:

View File

@ -10,6 +10,7 @@ enum class IpcId : int {
CancelRequest = 0, CancelRequest = 0,
Initialize, Initialize,
Initialized, Initialized,
Shutdown,
Exit, Exit,
TextDocumentDidOpen, TextDocumentDidOpen,
TextDocumentDidChange, TextDocumentDidChange,

27
src/messages/shutdown.cc Normal file
View File

@ -0,0 +1,27 @@
#include "message_handler.h"
#include "queue_manager.h"
namespace {
struct Ipc_Shutdown : public IpcMessage<Ipc_Shutdown> {
static const IpcId kIpcId = IpcId::Shutdown;
};
MAKE_REFLECT_EMPTY_STRUCT(Ipc_Shutdown);
REGISTER_IPC_MESSAGE(Ipc_Shutdown);
struct Out_Shutdown
: public lsOutMessage<Out_Shutdown> {
lsRequestId id;
std::monostate result;
};
MAKE_REFLECT_STRUCT(Out_Shutdown, jsonrpc, id, result);
struct ShutdownHandler : BaseMessageHandler<Ipc_Shutdown> {
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

View File

@ -201,6 +201,14 @@ void Reflect(TVisitor& visitor, IndexFile& value) {
REFLECT_MEMBER_END(); 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) { void Reflect(Reader& visitor, SerializeFormat& value) {
std::string fmt = visitor.GetString(); std::string fmt = visitor.GetString();
value = fmt[0] == 'm' ? SerializeFormat::MessagePack : SerializeFormat::Json; value = fmt[0] == 'm' ? SerializeFormat::MessagePack : SerializeFormat::Json;

View File

@ -255,6 +255,9 @@ void ReflectMember(Reader& visitor, const char* name, T& value) {
// Specializations // Specializations
void Reflect(Reader& visitor, std::monostate&);
void Reflect(Writer& visitor, std::monostate&);
void Reflect(Reader& visitor, SerializeFormat& value); void Reflect(Reader& visitor, SerializeFormat& value);
void Reflect(Writer& visitor, SerializeFormat& value); void Reflect(Writer& visitor, SerializeFormat& value);