#include "Protocol.h"
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/JSON.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
using namespace mlir;
using namespace mlir::lsp;
template <typename T>
static bool mapOptOrNull(const llvm::json::Value ¶ms,
llvm::StringLiteral prop, T &out,
llvm::json::Path path) {
const llvm::json::Object *o = params.getAsObject();
assert(o);
auto *v = o->get(prop);
if (!v || v->getAsNull())
return true;
return fromJSON(*v, out, path.field(prop));
}
bool mlir::lsp::fromJSON(const llvm::json::Value &value,
PDLLViewOutputKind &result, llvm::json::Path path) {
if (std::optional<StringRef> str = value.getAsString()) {
if (*str == "ast") {
result = PDLLViewOutputKind::AST;
return true;
}
if (*str == "mlir") {
result = PDLLViewOutputKind::MLIR;
return true;
}
if (*str == "cpp") {
result = PDLLViewOutputKind::CPP;
return true;
}
}
return false;
}
bool mlir::lsp::fromJSON(const llvm::json::Value &value,
PDLLViewOutputParams &result, llvm::json::Path path) {
llvm::json::ObjectMapper o(value, path);
return o && o.map("uri", result.uri) && o.map("kind", result.kind);
}
llvm::json::Value mlir::lsp::toJSON(const PDLLViewOutputResult &value) {
return llvm::json::Object{{"output", value.output}};
}