clang-tools  7.0.0
ProtocolHandlers.cpp
Go to the documentation of this file.
1 //===--- ProtocolHandlers.cpp - LSP callbacks -----------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "ProtocolHandlers.h"
11 #include "ClangdLSPServer.h"
12 #include "ClangdServer.h"
13 #include "DraftStore.h"
14 #include "Trace.h"
15 
16 using namespace clang;
17 using namespace clang::clangd;
18 using namespace llvm;
19 
20 namespace {
21 
22 // Helper for attaching ProtocolCallbacks methods to a JSONRPCDispatcher.
23 // Invoke like: Registerer("foo", &ProtocolCallbacks::onFoo)
24 // onFoo should be: void onFoo(Ctx &C, FooParams &Params)
25 // FooParams should have a fromJSON function.
26 struct HandlerRegisterer {
27  template <typename Param>
28  void operator()(StringRef Method, void (ProtocolCallbacks::*Handler)(Param)) {
29  // Capture pointers by value, as the lambda will outlive this object.
30  auto *Callbacks = this->Callbacks;
31  Dispatcher.registerHandler(Method, [=](const json::Value &RawParams) {
32  typename std::remove_reference<Param>::type P;
33  if (fromJSON(RawParams, P)) {
34  (Callbacks->*Handler)(P);
35  } else {
36  elog("Failed to decode {0} request.", Method);
37  }
38  });
39  }
40 
41  JSONRPCDispatcher &Dispatcher;
42  ProtocolCallbacks *Callbacks;
43 };
44 
45 } // namespace
46 
48  ProtocolCallbacks &Callbacks) {
49  HandlerRegisterer Register{Dispatcher, &Callbacks};
50 
51  Register("initialize", &ProtocolCallbacks::onInitialize);
52  Register("shutdown", &ProtocolCallbacks::onShutdown);
53  Register("exit", &ProtocolCallbacks::onExit);
54  Register("textDocument/didOpen", &ProtocolCallbacks::onDocumentDidOpen);
55  Register("textDocument/didClose", &ProtocolCallbacks::onDocumentDidClose);
56  Register("textDocument/didChange", &ProtocolCallbacks::onDocumentDidChange);
57  Register("textDocument/rangeFormatting",
59  Register("textDocument/onTypeFormatting",
61  Register("textDocument/formatting", &ProtocolCallbacks::onDocumentFormatting);
62  Register("textDocument/codeAction", &ProtocolCallbacks::onCodeAction);
63  Register("textDocument/completion", &ProtocolCallbacks::onCompletion);
64  Register("textDocument/signatureHelp", &ProtocolCallbacks::onSignatureHelp);
65  Register("textDocument/definition", &ProtocolCallbacks::onGoToDefinition);
66  Register("textDocument/switchSourceHeader",
68  Register("textDocument/rename", &ProtocolCallbacks::onRename);
69  Register("textDocument/hover", &ProtocolCallbacks::onHover);
70  Register("textDocument/documentSymbol", &ProtocolCallbacks::onDocumentSymbol);
71  Register("workspace/didChangeWatchedFiles", &ProtocolCallbacks::onFileEvent);
72  Register("workspace/executeCommand", &ProtocolCallbacks::onCommand);
73  Register("textDocument/documentHighlight",
75  Register("workspace/didChangeConfiguration",
77  Register("workspace/symbol", &ProtocolCallbacks::onWorkspaceSymbol);
78 }
virtual void onDocumentFormatting(DocumentFormattingParams &Params)=0
virtual void onFileEvent(DidChangeWatchedFilesParams &Params)=0
virtual void onSignatureHelp(TextDocumentPositionParams &Params)=0
virtual void onChangeConfiguration(DidChangeConfigurationParams &Params)=0
Some operations such as code completion produce a set of candidates.
virtual void onGoToDefinition(TextDocumentPositionParams &Params)=0
virtual void onDocumentDidOpen(DidOpenTextDocumentParams &Params)=0
virtual void onCodeAction(CodeActionParams &Params)=0
virtual void onDocumentDidClose(DidCloseTextDocumentParams &Params)=0
void elog(const char *Fmt, Ts &&... Vals)
Definition: Logger.h:56
virtual void onCompletion(TextDocumentPositionParams &Params)=0
virtual void onDocumentHighlight(TextDocumentPositionParams &Params)=0
void registerCallbackHandlers(JSONRPCDispatcher &Dispatcher, ProtocolCallbacks &Callbacks)
virtual void onSwitchSourceHeader(TextDocumentIdentifier &Params)=0
virtual void onDocumentOnTypeFormatting(DocumentOnTypeFormattingParams &Params)=0
virtual void onRename(RenameParams &Parames)=0
virtual void onInitialize(InitializeParams &Params)=0
virtual void onWorkspaceSymbol(WorkspaceSymbolParams &Params)=0
virtual void onDocumentRangeFormatting(DocumentRangeFormattingParams &Params)=0
virtual void onHover(TextDocumentPositionParams &Params)=0
Main JSONRPC entry point.
virtual void onDocumentSymbol(DocumentSymbolParams &Params)=0
virtual void onDocumentDidChange(DidChangeTextDocumentParams &Params)=0
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
virtual void onCommand(ExecuteCommandParams &Params)=0
virtual void onExit(ExitParams &Params)=0
virtual void onShutdown(ShutdownParams &Params)=0
bool fromJSON(const json::Value &E, URIForFile &R)
Definition: Protocol.cpp:33