From 741d8f2130becef7b80b6c85824200851f60defb 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 ba423d94..ce319eb9 100644 --- a/src/lsp.hh +++ b/src/lsp.hh @@ -50,15 +50,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 375791d7..cc5fc28f 100644 --- a/src/message_handler.cc +++ b/src/message_handler.cc @@ -195,21 +195,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); @@ -248,14 +240,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 c81e9f99..f1240e12 100644 --- a/src/message_handler.hh +++ b/src/message_handler.hh @@ -182,17 +182,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 bf59c85f..84341457 100644 --- a/src/messages/ccls_call.cc +++ b/src/messages/ccls_call.cc @@ -204,9 +204,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 c164bbcc..35f9a640 100644 --- a/src/messages/ccls_inheritance.cc +++ b/src/messages/ccls_inheritance.cc @@ -149,10 +149,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 1ae3470c..f14e4b89 100644 --- a/src/messages/ccls_member.cc +++ b/src/messages/ccls_member.cc @@ -297,9 +297,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 bd772773..30648c82 100644 --- a/src/messages/initialize.cc +++ b/src/messages/initialize.cc @@ -280,10 +280,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); @@ -330,8 +327,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); } @@ -343,8 +342,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 19f99dc0..c82b4f9b 100644 --- a/src/messages/textDocument_formatting.cc +++ b/src/messages/textDocument_formatting.cc @@ -58,15 +58,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