2017-03-25 23:58:11 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "serializer.h"
|
2017-09-22 01:14:57 +00:00
|
|
|
#include "utils.h"
|
|
|
|
|
2017-03-25 23:58:11 +00:00
|
|
|
#include <string>
|
|
|
|
|
2018-01-19 08:47:52 +00:00
|
|
|
using lsRequestId = std::variant<std::monostate, int64_t, std::string>;
|
|
|
|
|
2017-03-25 23:58:11 +00:00
|
|
|
enum class IpcId : int {
|
|
|
|
// Language server specific requests.
|
|
|
|
CancelRequest = 0,
|
|
|
|
Initialized,
|
2017-05-03 06:45:10 +00:00
|
|
|
Exit,
|
2018-03-02 02:06:48 +00:00
|
|
|
|
2018-03-02 03:07:44 +00:00
|
|
|
#define CASE(x, _) x,
|
2018-03-20 02:51:42 +00:00
|
|
|
#include "methods.inc"
|
2018-03-02 03:07:44 +00:00
|
|
|
#undef CASE
|
2018-02-28 07:07:53 +00:00
|
|
|
|
2017-03-25 23:58:11 +00:00
|
|
|
// Internal implementation detail.
|
2017-12-04 08:16:19 +00:00
|
|
|
Unknown,
|
2017-03-25 23:58:11 +00:00
|
|
|
};
|
|
|
|
MAKE_ENUM_HASHABLE(IpcId)
|
2018-01-30 00:35:01 +00:00
|
|
|
MAKE_REFLECT_TYPE_PROXY(IpcId)
|
2017-03-25 23:58:11 +00:00
|
|
|
const char* IpcIdToString(IpcId id);
|
|
|
|
|
|
|
|
struct BaseIpcMessage {
|
|
|
|
const IpcId method_id;
|
|
|
|
BaseIpcMessage(IpcId method_id);
|
2017-06-09 06:20:29 +00:00
|
|
|
virtual ~BaseIpcMessage();
|
2017-09-22 01:32:55 +00:00
|
|
|
|
2018-01-19 18:00:06 +00:00
|
|
|
virtual lsRequestId GetRequestId();
|
|
|
|
|
2017-09-22 01:32:55 +00:00
|
|
|
template <typename T>
|
|
|
|
T* As() {
|
|
|
|
assert(method_id == T::kIpcId);
|
|
|
|
return static_cast<T*>(this);
|
|
|
|
}
|
2017-03-25 23:58:11 +00:00
|
|
|
};
|
|
|
|
|
2018-01-19 08:47:52 +00:00
|
|
|
template <typename T>
|
|
|
|
struct RequestMessage : public BaseIpcMessage {
|
|
|
|
// number | string, actually no null
|
|
|
|
lsRequestId id;
|
|
|
|
RequestMessage() : BaseIpcMessage(T::kIpcId) {}
|
2018-01-19 18:00:06 +00:00
|
|
|
|
2018-01-30 00:27:43 +00:00
|
|
|
lsRequestId GetRequestId() override { return id; }
|
2018-01-19 08:47:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// NotificationMessage does not have |id|.
|
|
|
|
template <typename T>
|
|
|
|
struct NotificationMessage : public BaseIpcMessage {
|
|
|
|
NotificationMessage() : BaseIpcMessage(T::kIpcId) {}
|
|
|
|
};
|