From 58e996366d7c5dffcdaa915f8cf3b0714a0cfa44 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 23 Nov 2018 10:08:44 -0800 Subject: [PATCH] Refactor ReplyOnce; error if InitializeParams.rootUri is null --- src/lsp.hh | 7 ------- src/message_handler.cc | 28 +++++++------------------ src/message_handler.hh | 9 +++----- src/messages/ccls_call.cc | 6 ++---- src/messages/ccls_inheritance.cc | 6 ++---- src/messages/ccls_member.cc | 6 ++---- src/messages/initialize.cc | 12 +++++------ src/messages/textDocument_formatting.cc | 14 +++++-------- 8 files changed, 27 insertions(+), 61 deletions(-) diff --git a/src/lsp.hh b/src/lsp.hh index b6a60877..2c4c735f 100644 --- a/src/lsp.hh +++ b/src/lsp.hh @@ -62,15 +62,8 @@ enum class ErrorCode { }; struct ResponseError { - // A number indicating the error type that occurred. ErrorCode code; - - // A string providing a short description of the error. std::string message; - - // A Primitive or Structured value that contains additional - // information about the error. Can be omitted. - // std::optional data; }; constexpr char ccls_xref[] = "ccls.xref"; diff --git a/src/message_handler.cc b/src/message_handler.cc index 969c691b..c9ff275d 100644 --- a/src/message_handler.cc +++ b/src/message_handler.cc @@ -207,21 +207,13 @@ void MessageHandler::Run(InMessage &msg) { try { it->second(reader, reply); } catch (std::invalid_argument &ex) { - ResponseError err; - err.code = ErrorCode::InvalidParams; - err.message = "invalid params of " + msg.method + ": " + ex.what(); - reply.Error(err); + reply.Error(ErrorCode::InvalidParams, + "invalid params of " + msg.method + ": " + ex.what()); } catch (...) { - ResponseError err; - err.code = ErrorCode::InternalError; - err.message = "failed to process " + msg.method; - reply.Error(err); + reply.Error(ErrorCode::InternalError, "failed to process " + msg.method); } } else { - ResponseError err; - err.code = ErrorCode::MethodNotFound; - err.message = "unknown request " + msg.method; - reply.Error(err); + reply.Error(ErrorCode::MethodNotFound, "unknown request " + msg.method); } } else { auto it = method2notification.find(msg.method); @@ -260,14 +252,10 @@ QueryFile *MessageHandler::FindFile(ReplyOnce &reply, has_entry |= folder.path2entry_index.count(path); } ResponseError err; - if (has_entry) { - err.code = ErrorCode::ServerNotInitialized; - err.message = path + " is being indexed"; - } else { - err.code = ErrorCode::InternalError; - err.message = "unable to find " + path; - } - reply.Error(err); + if (has_entry) + reply.Error(ErrorCode::ServerNotInitialized, path + " is being indexed"); + else + reply.Error(ErrorCode::InternalError, "unable to find " + path); } return ret; diff --git a/src/message_handler.hh b/src/message_handler.hh index bac8b1b9..ed2ab136 100644 --- a/src/message_handler.hh +++ b/src/message_handler.hh @@ -194,17 +194,14 @@ MAKE_REFLECT_STRUCT(Diagnostic, range, severity, code, source, message); MAKE_REFLECT_STRUCT(ShowMessageParam, type, message); MAKE_REFLECT_TYPE_PROXY(LanguageId); -// TODO llvm 8 llvm::unique_function -template -using Callback = std::function; - struct ReplyOnce { RequestId id; - template void operator()(Res &result) const { + template void operator()(Res &&result) const { if (id.Valid()) pipeline::Reply(id, [&](Writer &w) { Reflect(w, result); }); } - template void Error(Err &err) const { + void Error(ErrorCode code, std::string message) const { + ResponseError err{code, std::move(message)}; if (id.Valid()) pipeline::ReplyError(id, [&](Writer &w) { Reflect(w, err); }); } diff --git a/src/messages/ccls_call.cc b/src/messages/ccls_call.cc index babf849c..1b0b9f76 100644 --- a/src/messages/ccls_call.cc +++ b/src/messages/ccls_call.cc @@ -216,9 +216,7 @@ void MessageHandler::ccls_call(Reader &reader, ReplyOnce &reply) { if (param.hierarchy) reply(result); - else { - auto out = FlattenHierarchy(result); - reply(out); - } + else + reply(FlattenHierarchy(result)); } } // namespace ccls diff --git a/src/messages/ccls_inheritance.cc b/src/messages/ccls_inheritance.cc index 558d537b..d2f65258 100644 --- a/src/messages/ccls_inheritance.cc +++ b/src/messages/ccls_inheritance.cc @@ -161,10 +161,8 @@ void Inheritance(MessageHandler *m, Param ¶m, ReplyOnce &reply) { if (param.hierarchy) reply(result); - else { - auto out = FlattenHierarchy(result); - reply(out); - } + else + reply(FlattenHierarchy(result)); } } // namespace diff --git a/src/messages/ccls_member.cc b/src/messages/ccls_member.cc index fd7d2c4a..87fd58cd 100644 --- a/src/messages/ccls_member.cc +++ b/src/messages/ccls_member.cc @@ -309,9 +309,7 @@ void MessageHandler::ccls_member(Reader &reader, ReplyOnce &reply) { if (param.hierarchy) reply(result); - else { - auto out = FlattenHierarchy(result); - reply(out); - } + else + reply(FlattenHierarchy(result)); } } // namespace ccls diff --git a/src/messages/initialize.cc b/src/messages/initialize.cc index 7c93511e..cfea3b3e 100644 --- a/src/messages/initialize.cc +++ b/src/messages/initialize.cc @@ -292,10 +292,7 @@ void Initialize(MessageHandler *m, InitializeParam ¶m, ReplyOnce &reply) { // Send initialization before starting indexers, so we don't send a // status update too early. - { - InitializeResult result; - reply(result); - } + reply(InitializeResult{}); // Set project root. EnsureEndsInSlash(project_path); @@ -342,8 +339,10 @@ void Initialize(MessageHandler *m, InitializeParam ¶m, ReplyOnce &reply) { void MessageHandler::initialize(Reader &reader, ReplyOnce &reply) { InitializeParam param; Reflect(reader, param); - if (!param.rootUri) + if (!param.rootUri) { + reply.Error(ErrorCode::InvalidRequest, "expected rootUri"); return; + } Initialize(this, param, reply); } @@ -355,8 +354,7 @@ void StandaloneInitialize(MessageHandler &handler, const std::string &root) { } void MessageHandler::shutdown(EmptyParam &, ReplyOnce &reply) { - JsonNull result; - reply(result); + reply(JsonNull{}); } void MessageHandler::exit(EmptyParam &) { diff --git a/src/messages/textDocument_formatting.cc b/src/messages/textDocument_formatting.cc index 211eac78..271d1a1d 100644 --- a/src/messages/textDocument_formatting.cc +++ b/src/messages/textDocument_formatting.cc @@ -70,15 +70,11 @@ std::vector ReplacementsToEdits(std::string_view code, void Format(ReplyOnce &reply, WorkingFile *wfile, tooling::Range range) { std::string_view code = wfile->buffer_content; auto ReplsOrErr = FormatCode(code, wfile->filename, range); - if (ReplsOrErr) { - auto result = ReplacementsToEdits(code, *ReplsOrErr); - reply(result); - } else { - ResponseError err; - err.code = ErrorCode::UnknownErrorCode; - err.message = llvm::toString(ReplsOrErr.takeError()); - reply.Error(err); - } + if (ReplsOrErr) + reply(ReplacementsToEdits(code, *ReplsOrErr)); + else + reply.Error(ErrorCode::UnknownErrorCode, + llvm::toString(ReplsOrErr.takeError())); } } // namespace