mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-04 14:17:07 +00:00 
			
		
		
		
	Refactor ReplyOnce; error if InitializeParams.rootUri is null
This commit is contained in:
		
							parent
							
								
									8f442c6c35
								
							
						
					
					
						commit
						741d8f2130
					
				@ -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<D> data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
constexpr char ccls_xref[] = "ccls.xref";
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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 <typename Res>
 | 
			
		||||
using Callback = std::function<void(Res*)>;
 | 
			
		||||
 | 
			
		||||
struct ReplyOnce {
 | 
			
		||||
  RequestId id;
 | 
			
		||||
  template <typename Res> void operator()(Res &result) const {
 | 
			
		||||
  template <typename Res> void operator()(Res &&result) const {
 | 
			
		||||
    if (id.Valid())
 | 
			
		||||
      pipeline::Reply(id, [&](Writer &w) { Reflect(w, result); });
 | 
			
		||||
  }
 | 
			
		||||
  template <typename Err> 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); });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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 &) {
 | 
			
		||||
 | 
			
		||||
@ -58,15 +58,11 @@ std::vector<TextEdit> 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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user