jak-project/lsp/protocol/document_diagnostics.cpp
Tyler Wilding 01c70368e3
LSP: initial LSP implementation for IR files to assist with decompilation (#1647)
* lsp: json-rpc example is working, a decent place to start...

* lsp: vendor library

* lsp: cleanup and time to get started

* lsp: commit what i got so far

* lsp: example `initialize` payload

* lsp: switch to `stdio`

* stash

* modularize the lsp implementation

* lsp: implement first actual LSP feature - function names in outline

* lsp: produce document diagnostics

* lsp: remove unused third-party lib

* lsp: support hovering MIPS instructions in IR files

* lsp: basic go-to all-types definition

* stash

* lsp: cleanup code, just need to add it to the release artifacts

* fix some project configuration

* fix linux build

* lsp: add lsp to PR artifacts and release assets

* lsp: address feedback
2022-07-18 18:26:57 -04:00

75 lines
2.3 KiB
C++

#include "document_diagnostics.h"
void LSPSpec::to_json(json& j, const CodeDescription& obj) {
j = json{{"href", obj.m_href}};
}
void LSPSpec::from_json(const json& j, CodeDescription& obj) {
j.at("href").get_to(obj.m_href);
}
void LSPSpec::to_json(json& j, const DiangosticRelatedInformation& obj) {
j = json{{"location", obj.m_location}, {"message", obj.m_message}};
}
void LSPSpec::from_json(const json& j, DiangosticRelatedInformation& obj) {
j.at("location").get_to(obj.m_location);
j.at("message").get_to(obj.m_message);
}
void LSPSpec::to_json(json& j, const Diagnostic& obj) {
j = json{{"range", obj.m_range}, {"severity", obj.m_severity}, {"message", obj.m_message}};
if (obj.m_code) {
j["code"] = obj.m_code.value();
}
if (obj.m_codeDescription) {
j["codeDescription"] = obj.m_codeDescription.value();
}
if (obj.m_source) {
j["source"] = obj.m_source.value();
}
if (obj.m_tags) {
j["tags"] = obj.m_tags.value();
}
if (obj.m_relatedInformation) {
j["relatedInformation"] = obj.m_relatedInformation.value();
}
}
void LSPSpec::from_json(const json& j, Diagnostic& obj) {
j.at("range").get_to(obj.m_range);
j.at("severity").get_to(obj.m_severity);
j.at("message").get_to(obj.m_message);
if (j.contains("code")) {
obj.m_code = std::make_optional(j.at("code").get<std::string>());
}
if (j.contains("codeDescription")) {
obj.m_codeDescription = std::make_optional(j.at("codeDescription").get<CodeDescription>());
}
if (j.contains("source")) {
obj.m_source = std::make_optional(j.at("source").get<std::string>());
}
if (j.contains("tags")) {
obj.m_tags = std::make_optional(j.at("tags").get<std::vector<DiagnosticTag>>());
}
if (j.contains("relatedInformation")) {
obj.m_relatedInformation = std::make_optional(
j.at("relatedInformation").get<std::vector<DiangosticRelatedInformation>>());
}
}
void LSPSpec::to_json(json& j, const PublishDiagnosticParams& obj) {
j = json{{"uri", obj.m_uri}, {"diagnostics", obj.m_diagnostics}};
if (obj.m_version) {
j["version"] = obj.m_version.value();
}
}
void LSPSpec::from_json(const json& j, PublishDiagnosticParams& obj) {
j.at("uri").get_to(obj.m_uri);
j.at("diagnostics").get_to(obj.m_diagnostics);
if (j.contains("version")) {
obj.m_version = std::make_optional(j.at("version").get<int32_t>());
}
}