9#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_LSPBINDER_H
10#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_LSPBINDER_H
15#include "llvm/ADT/FunctionExtras.h"
16#include "llvm/ADT/StringMap.h"
17#include "llvm/Support/JSON.h"
36 using JSON = llvm::json::Value;
39 template <
typename HandlerT>
40 using HandlerMap = llvm::StringMap<llvm::unique_function<HandlerT>>;
60 template <
typename Param,
typename Result,
typename ThisT>
68 template <
typename Param,
typename ThisT>
70 void (ThisT::*Handler)(
const Param &));
76 template <
typename Param,
typename Result,
typename ThisT>
77 void command(llvm::StringLiteral Command, ThisT *This,
80 template <
typename P,
typename R>
100 template <
typename T>
101 static llvm::Expected<T> parse(
const llvm::json::Value &Raw,
102 llvm::StringRef PayloadName,
103 llvm::StringRef PayloadKind);
104 static llvm::Error handleParseError(
const llvm::json::Value &Raw,
105 llvm::StringRef PayloadName,
106 llvm::StringRef PayloadKind,
107 const llvm::json::Path::Root &Root);
114llvm::Expected<T> LSPBinder::parse(
const llvm::json::Value &Raw,
115 llvm::StringRef PayloadName,
116 llvm::StringRef PayloadKind) {
118 llvm::json::Path::Root Root;
120 return handleParseError(Raw, PayloadName, PayloadKind, Root);
121 return std::move(Result);
124template <
typename Param,
typename Result,
typename ThisT>
126 void (ThisT::*Handler)(
const Param &,
130 auto P = LSPBinder::parse<Param>(RawParams,
Method,
"request");
132 return Reply(P.takeError());
133 (This->*Handler)(*P, std::move(Reply));
137template <
typename Param,
typename ThisT>
139 void (ThisT::*Handler)(
const Param &)) {
140 Raw.NotificationHandlers[
Method] = [
Method, Handler, This](
JSON RawParams) {
141 llvm::Expected<Param> P =
142 LSPBinder::parse<Param>(RawParams,
Method,
"request");
144 return llvm::consumeError(P.takeError());
145 (This->*Handler)(*P);
149template <
typename Param,
typename Result,
typename ThisT>
151 void (ThisT::*Handler)(
const Param &,
155 auto P = LSPBinder::parse<Param>(RawParams,
Method,
"command");
157 return Reply(P.takeError());
158 (This->*Handler)(*P, std::move(Reply));
163 llvm::StringLiteral Method;
165 UntypedOutgoingNotification(llvm::StringLiteral Method,
RawOutgoing *Out)
166 :
Method(Method), Out(Out) {}
167 friend UntypedOutgoingNotification
173 [
Method(Method), Out(Out)](Request R) { Out->notify(Method,
JSON(R)); };
183 llvm::StringLiteral Method;
185 UntypedOutgoingMethod(llvm::StringLiteral Method,
RawOutgoing *Out)
186 :
Method(Method), Out(Out) {}
190 template <
typename Request,
typename Response>
197 Method](llvm::Expected<JSON> RawRsp)
mutable {
199 return Reply(RawRsp.takeError());
200 Reply(LSPBinder::parse<Response>(std::move(*RawRsp), Method,
static const Context & current()
Returns the context for the current thread, creating it if needed.
virtual void callMethod(llvm::StringRef Method, JSON Params, Callback< JSON > Reply)=0
virtual ~RawOutgoing()=default
virtual void notify(llvm::StringRef Method, JSON Params)=0
llvm::unique_function< void(const P &)> OutgoingNotification
LSPBinder(RawHandlers &Raw, RawOutgoing &Out)
UntypedOutgoingMethod outgoingMethod(llvm::StringLiteral Method)
Bind a function object to be used for outgoing method calls.
void method(llvm::StringLiteral Method, ThisT *This, void(ThisT::*Handler)(const Param &, Callback< Result >))
Bind a handler for an LSP method.
void notification(llvm::StringLiteral Method, ThisT *This, void(ThisT::*Handler)(const Param &))
Bind a handler for an LSP notification.
UntypedOutgoingNotification outgoingNotification(llvm::StringLiteral Method)
Bind a function object to be used for outgoing notifications.
llvm::unique_function< void(const P &, Callback< R >)> OutgoingMethod
void command(llvm::StringLiteral Command, ThisT *This, void(ThisT::*Handler)(const Param &, Callback< Result >))
Bind a handler for an LSP command.
FIXME: Skip testing on windows temporarily due to the different escaping code mode.
llvm::unique_function< void(llvm::Expected< T >)> Callback
A Callback<T> is a void function that accepts Expected<T>.
bool fromJSON(const llvm::json::Value &Parameters, FuzzyFindRequest &Request, llvm::json::Path P)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
llvm::StringMap< llvm::unique_function< HandlerT > > HandlerMap
HandlerMap< void(JSON)> NotificationHandlers
HandlerMap< void(JSON, Callback< JSON >)> CommandHandlers
HandlerMap< void(JSON, Callback< JSON >)> MethodHandlers