mirror of
https://github.com/MaskRay/ccls.git
synced 2025-03-22 08:46:20 +00:00
iwp
This commit is contained in:
parent
0037a3e7f5
commit
4bdf8c825b
@ -1027,17 +1027,28 @@ void PreMain() {
|
|||||||
MessageRegistry::instance()->Register<In_WorkspaceSymbolRequest>();
|
MessageRegistry::instance()->Register<In_WorkspaceSymbolRequest>();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct MyMessageType {
|
|
||||||
static const lsMethodId id = lsMethodId::CancelRequest;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
// TODO: real impl
|
// TODO: real impl
|
||||||
const int kQueueSize = 128;
|
const int kQueueSize = 128;
|
||||||
TypedBidiMessageQueue<lsMethodId, MyMessageType> t("foo", kQueueSize);
|
TypedBidiMessageQueue<lsMethodId, lsBaseMessage> t("foo", kQueueSize);
|
||||||
MyMessageType mm;
|
|
||||||
t.SendMessage(&t.for_client, lsMethodId::Initialize, &mm);
|
// TODO: We can make this entire function a template.
|
||||||
t.GetMessages(&t.for_client);
|
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;
|
bool loop = false;
|
||||||
while (loop)
|
while (loop)
|
||||||
|
@ -62,127 +62,6 @@ void Reflect(Reader& visitor, RequestId& id) {
|
|||||||
std::cerr << "Unable to deserialize id" << std::endl;
|
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_;
|
return instance_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct lsBaseMessage {};
|
||||||
|
|
||||||
struct InMessage {
|
struct InMessage : public lsBaseMessage {
|
||||||
const lsMethodId method_id;
|
const lsMethodId method_id;
|
||||||
optional<RequestId> id;
|
optional<RequestId> id;
|
||||||
|
|
||||||
@ -333,6 +213,126 @@ struct InNotificationMessage : public InMessage {
|
|||||||
: InMessage(method, id, reader) {}
|
: 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 {
|
struct Out_DocumentSymbolResponse : public OutResponseMessage {
|
||||||
std::vector<lsSymbolInformation> result;
|
std::vector<lsSymbolInformation> result;
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ struct TypedBidiMessageQueue {
|
|||||||
|
|
||||||
void RegisterId(TId id,
|
void RegisterId(TId id,
|
||||||
const Serializer& serializer,
|
const Serializer& serializer,
|
||||||
const Deserializer& deseriaizer) {
|
const Deserializer& deserializer) {
|
||||||
assert(serializers_.find(id) == serializers_.end() &&
|
assert(serializers_.find(id) == serializers_.end() &&
|
||||||
deserializers_.find(id) == deserializers_.end() &&
|
deserializers_.find(id) == deserializers_.end() &&
|
||||||
"Duplicate registration");
|
"Duplicate registration");
|
||||||
|
Loading…
Reference in New Issue
Block a user