mirror of
https://github.com/MaskRay/ccls.git
synced 2025-03-22 00:36:13 +00:00
iwp
This commit is contained in:
parent
0037a3e7f5
commit
4bdf8c825b
@ -1027,17 +1027,28 @@ void PreMain() {
|
||||
MessageRegistry::instance()->Register<In_WorkspaceSymbolRequest>();
|
||||
}
|
||||
|
||||
struct MyMessageType {
|
||||
static const lsMethodId id = lsMethodId::CancelRequest;
|
||||
};
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
// TODO: real impl
|
||||
const int kQueueSize = 128;
|
||||
TypedBidiMessageQueue<lsMethodId, MyMessageType> t("foo", kQueueSize);
|
||||
MyMessageType mm;
|
||||
t.SendMessage(&t.for_client, lsMethodId::Initialize, &mm);
|
||||
t.GetMessages(&t.for_client);
|
||||
TypedBidiMessageQueue<lsMethodId, lsBaseMessage> t("foo", kQueueSize);
|
||||
|
||||
// TODO: We can make this entire function a template.
|
||||
t.RegisterId(In_DocumentSymbolRequest::kMethod,
|
||||
[](Writer& visitor, lsBaseMessage& message) {
|
||||
In_DocumentSymbolRequest& m = static_cast<In_DocumentSymbolRequest&>(message);
|
||||
Reflect(visitor, m);
|
||||
}, [](Reader& visitor) {
|
||||
auto m = MakeUnique<In_DocumentSymbolRequest>();
|
||||
Reflect(visitor, *m);
|
||||
return m;
|
||||
});
|
||||
|
||||
//struct In_DocumentSymbolRequest : public InRequestMessage {
|
||||
// const static lsMethodId kMethod = lsMethodId::TextDocumentDocumentSymbol;
|
||||
|
||||
//MyMessageType mm;
|
||||
//t.SendMessage(&t.for_client, lsMethodId::Initialize, &mm);
|
||||
//t.GetMessages(&t.for_client);
|
||||
|
||||
bool loop = false;
|
||||
while (loop)
|
||||
|
@ -62,127 +62,6 @@ void Reflect(Reader& visitor, RequestId& id) {
|
||||
std::cerr << "Unable to deserialize id" << std::endl;
|
||||
}
|
||||
|
||||
struct OutMessage {
|
||||
// Write out the body of the message. The writer expects object key/value
|
||||
// pairs.
|
||||
virtual void WriteMessageBody(Writer& writer) = 0;
|
||||
|
||||
// Send the message to the language client by writing it to stdout.
|
||||
void Send() {
|
||||
rapidjson::StringBuffer output;
|
||||
Writer writer(output);
|
||||
writer.StartObject();
|
||||
writer.Key("jsonrpc");
|
||||
writer.String("2.0");
|
||||
WriteMessageBody(writer);
|
||||
writer.EndObject();
|
||||
|
||||
std::cout << "Content-Length: " << output.GetSize();
|
||||
std::cout << (char)13 << char(10) << char(13) << char(10);
|
||||
std::cout << output.GetString();
|
||||
std::cout.flush();
|
||||
}
|
||||
};
|
||||
|
||||
struct OutRequestMessage : public OutMessage {
|
||||
RequestId id;
|
||||
|
||||
virtual std::string Method() = 0;
|
||||
virtual void SerializeParams(Writer& visitor) = 0;
|
||||
|
||||
// Message:
|
||||
void WriteMessageBody(Writer& visitor) override {
|
||||
auto& value = *this;
|
||||
auto method = Method();
|
||||
|
||||
REFLECT_MEMBER(id);
|
||||
REFLECT_MEMBER2("method", method);
|
||||
|
||||
visitor.Key("params");
|
||||
SerializeParams(visitor);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct lsResponseError {
|
||||
struct Data {
|
||||
virtual void Write(Writer& writer) = 0;
|
||||
};
|
||||
|
||||
enum class lsErrorCodes : int {
|
||||
ParseError = -32700,
|
||||
InvalidRequest = -32600,
|
||||
MethodNotFound = -32601,
|
||||
InvalidParams = -32602,
|
||||
InternalError = -32603,
|
||||
serverErrorStart = -32099,
|
||||
serverErrorEnd = -32000,
|
||||
ServerNotInitialized = -32002,
|
||||
UnknownErrorCode = -32001
|
||||
};
|
||||
|
||||
lsErrorCodes code;
|
||||
// Short description.
|
||||
std::string message;
|
||||
std::unique_ptr<Data> data;
|
||||
|
||||
void Write(Writer& visitor) {
|
||||
auto& value = *this;
|
||||
int code = static_cast<int>(this->code);
|
||||
|
||||
visitor.StartObject();
|
||||
REFLECT_MEMBER2("code", code);
|
||||
REFLECT_MEMBER(message);
|
||||
if (data) {
|
||||
visitor.Key("data");
|
||||
data->Write(visitor);
|
||||
}
|
||||
visitor.EndObject();
|
||||
}
|
||||
};
|
||||
|
||||
struct OutResponseMessage : public OutMessage {
|
||||
RequestId id;
|
||||
|
||||
virtual optional<lsResponseError> Error() {
|
||||
return nullopt;
|
||||
}
|
||||
virtual void WriteResult(Writer& visitor) = 0;
|
||||
|
||||
// Message:
|
||||
void WriteMessageBody(Writer& visitor) override {
|
||||
auto& value = *this;
|
||||
|
||||
REFLECT_MEMBER(id);
|
||||
|
||||
optional<lsResponseError> error = Error();
|
||||
if (error) {
|
||||
visitor.Key("error");
|
||||
error->Write(visitor);
|
||||
}
|
||||
else {
|
||||
visitor.Key("result");
|
||||
WriteResult(visitor);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct OutNotificationMessage : public OutMessage {
|
||||
virtual std::string Method() = 0;
|
||||
virtual void SerializeParams(Writer& writer) = 0;
|
||||
|
||||
// Message:
|
||||
void WriteMessageBody(Writer& visitor) override {
|
||||
visitor.Key("method");
|
||||
std::string method = Method();
|
||||
::Reflect(visitor, method);
|
||||
|
||||
visitor.Key("params");
|
||||
SerializeParams(visitor);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -313,8 +192,9 @@ MessageRegistry* MessageRegistry::instance() {
|
||||
return instance_;
|
||||
}
|
||||
|
||||
struct lsBaseMessage {};
|
||||
|
||||
struct InMessage {
|
||||
struct InMessage : public lsBaseMessage {
|
||||
const lsMethodId method_id;
|
||||
optional<RequestId> id;
|
||||
|
||||
@ -333,6 +213,126 @@ struct InNotificationMessage : public InMessage {
|
||||
: InMessage(method, id, reader) {}
|
||||
};
|
||||
|
||||
struct OutMessage : public lsBaseMessage {
|
||||
// Write out the body of the message. The writer expects object key/value
|
||||
// pairs.
|
||||
virtual void WriteMessageBody(Writer& writer) = 0;
|
||||
|
||||
// Send the message to the language client by writing it to stdout.
|
||||
void Send() {
|
||||
rapidjson::StringBuffer output;
|
||||
Writer writer(output);
|
||||
writer.StartObject();
|
||||
writer.Key("jsonrpc");
|
||||
writer.String("2.0");
|
||||
WriteMessageBody(writer);
|
||||
writer.EndObject();
|
||||
|
||||
std::cout << "Content-Length: " << output.GetSize();
|
||||
std::cout << (char)13 << char(10) << char(13) << char(10);
|
||||
std::cout << output.GetString();
|
||||
std::cout.flush();
|
||||
}
|
||||
};
|
||||
|
||||
struct OutRequestMessage : public OutMessage {
|
||||
RequestId id;
|
||||
|
||||
virtual std::string Method() = 0;
|
||||
virtual void SerializeParams(Writer& visitor) = 0;
|
||||
|
||||
// Message:
|
||||
void WriteMessageBody(Writer& visitor) override {
|
||||
auto& value = *this;
|
||||
auto method = Method();
|
||||
|
||||
REFLECT_MEMBER(id);
|
||||
REFLECT_MEMBER2("method", method);
|
||||
|
||||
visitor.Key("params");
|
||||
SerializeParams(visitor);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct lsResponseError {
|
||||
struct Data {
|
||||
virtual void Write(Writer& writer) = 0;
|
||||
};
|
||||
|
||||
enum class lsErrorCodes : int {
|
||||
ParseError = -32700,
|
||||
InvalidRequest = -32600,
|
||||
MethodNotFound = -32601,
|
||||
InvalidParams = -32602,
|
||||
InternalError = -32603,
|
||||
serverErrorStart = -32099,
|
||||
serverErrorEnd = -32000,
|
||||
ServerNotInitialized = -32002,
|
||||
UnknownErrorCode = -32001
|
||||
};
|
||||
|
||||
lsErrorCodes code;
|
||||
// Short description.
|
||||
std::string message;
|
||||
std::unique_ptr<Data> data;
|
||||
|
||||
void Write(Writer& visitor) {
|
||||
auto& value = *this;
|
||||
int code = static_cast<int>(this->code);
|
||||
|
||||
visitor.StartObject();
|
||||
REFLECT_MEMBER2("code", code);
|
||||
REFLECT_MEMBER(message);
|
||||
if (data) {
|
||||
visitor.Key("data");
|
||||
data->Write(visitor);
|
||||
}
|
||||
visitor.EndObject();
|
||||
}
|
||||
};
|
||||
|
||||
struct OutResponseMessage : public OutMessage {
|
||||
RequestId id;
|
||||
|
||||
virtual optional<lsResponseError> Error() {
|
||||
return nullopt;
|
||||
}
|
||||
virtual void WriteResult(Writer& visitor) = 0;
|
||||
|
||||
// Message:
|
||||
void WriteMessageBody(Writer& visitor) override {
|
||||
auto& value = *this;
|
||||
|
||||
REFLECT_MEMBER(id);
|
||||
|
||||
optional<lsResponseError> error = Error();
|
||||
if (error) {
|
||||
visitor.Key("error");
|
||||
error->Write(visitor);
|
||||
}
|
||||
else {
|
||||
visitor.Key("result");
|
||||
WriteResult(visitor);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct OutNotificationMessage : public OutMessage {
|
||||
virtual std::string Method() = 0;
|
||||
virtual void SerializeParams(Writer& writer) = 0;
|
||||
|
||||
// Message:
|
||||
void WriteMessageBody(Writer& visitor) override {
|
||||
visitor.Key("method");
|
||||
std::string method = Method();
|
||||
::Reflect(visitor, method);
|
||||
|
||||
visitor.Key("params");
|
||||
SerializeParams(visitor);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1358,6 +1358,11 @@ struct In_DocumentSymbolRequest : public InRequestMessage {
|
||||
}
|
||||
};
|
||||
|
||||
template<typename TVisitor>
|
||||
void Reflect(TVisitor& visitor, In_DocumentSymbolRequest& value) {
|
||||
Reflect(visitor, value.params);
|
||||
}
|
||||
|
||||
struct Out_DocumentSymbolResponse : public OutResponseMessage {
|
||||
std::vector<lsSymbolInformation> result;
|
||||
|
||||
|
@ -26,7 +26,7 @@ struct TypedBidiMessageQueue {
|
||||
|
||||
void RegisterId(TId id,
|
||||
const Serializer& serializer,
|
||||
const Deserializer& deseriaizer) {
|
||||
const Deserializer& deserializer) {
|
||||
assert(serializers_.find(id) == serializers_.end() &&
|
||||
deserializers_.find(id) == deserializers_.end() &&
|
||||
"Duplicate registration");
|
||||
|
Loading…
Reference in New Issue
Block a user