This commit is contained in:
Jacob Dufault 2017-03-24 00:59:47 -07:00
parent 0037a3e7f5
commit 4bdf8c825b
3 changed files with 147 additions and 131 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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");