blob: ff7dae2c469aaac72360c55f9e50058a0fc4dcb9 [file] [log] [blame]
Benjamin Kramerbb1cdb62017-02-07 10:28:20 +00001//===--- 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"
Ilya Biryukovafb55542017-05-16 14:40:30 +000011#include "ClangdLSPServer.h"
Ilya Biryukov38d79772017-05-16 09:38:59 +000012#include "ClangdServer.h"
13#include "DraftStore.h"
Sam McCall8567cb32017-11-02 09:21:51 +000014#include "Trace.h"
Sam McCall8a5dded2017-10-12 13:29:58 +000015
Benjamin Kramerbb1cdb62017-02-07 10:28:20 +000016using namespace clang;
Sam McCall8a5dded2017-10-12 13:29:58 +000017using namespace clang::clangd;
Benjamin Kramerbb1cdb62017-02-07 10:28:20 +000018
Ilya Biryukovafb55542017-05-16 14:40:30 +000019namespace {
Benjamin Kramerbb1cdb62017-02-07 10:28:20 +000020
Sam McCall8a5dded2017-10-12 13:29:58 +000021// Helper for attaching ProtocolCallbacks methods to a JSONRPCDispatcher.
22// Invoke like: Registerer("foo", &ProtocolCallbacks::onFoo)
23// onFoo should be: void onFoo(Ctx &C, FooParams &Params)
Sam McCallec109022017-11-28 09:37:43 +000024// FooParams should have a static factory method: parse(const json::Expr&).
Sam McCall8a5dded2017-10-12 13:29:58 +000025struct HandlerRegisterer {
26 template <typename Param>
27 void operator()(StringRef Method,
28 void (ProtocolCallbacks::*Handler)(RequestContext, Param)) {
29 // Capture pointers by value, as the lambda will outlive this object.
30 auto *Out = this->Out;
31 auto *Callbacks = this->Callbacks;
32 Dispatcher.registerHandler(
Sam McCallec109022017-11-28 09:37:43 +000033 Method, [=](RequestContext C, const json::Expr &RawParams) {
Sam McCall8567cb32017-11-02 09:21:51 +000034 if (auto P = [&] {
35 trace::Span Tracer("Parse");
Sam McCallec109022017-11-28 09:37:43 +000036 return std::decay<Param>::type::parse(RawParams);
Sam McCall8567cb32017-11-02 09:21:51 +000037 }()) {
Sam McCall8a5dded2017-10-12 13:29:58 +000038 (Callbacks->*Handler)(std::move(C), *P);
39 } else {
40 Out->log("Failed to decode " + Method + " request.\n");
41 }
42 });
Krasimir Georgiev561ba5e2017-04-10 13:31:39 +000043 }
44
Sam McCall8a5dded2017-10-12 13:29:58 +000045 JSONRPCDispatcher &Dispatcher;
46 JSONOutput *Out;
47 ProtocolCallbacks *Callbacks;
Marc-Andre Laperlebf114242017-10-02 18:00:37 +000048};
49
Ilya Biryukovafb55542017-05-16 14:40:30 +000050} // namespace
51
Sam McCallef41c342017-09-29 16:41:23 +000052void clangd::registerCallbackHandlers(JSONRPCDispatcher &Dispatcher,
Ilya Biryukov3847be52017-10-10 14:21:04 +000053 JSONOutput &Out,
54 ProtocolCallbacks &Callbacks) {
Sam McCall8a5dded2017-10-12 13:29:58 +000055 HandlerRegisterer Register{Dispatcher, &Out, &Callbacks};
56
57 Register("initialize", &ProtocolCallbacks::onInitialize);
58 Register("shutdown", &ProtocolCallbacks::onShutdown);
Ilya Biryukov0d9b8a32017-10-25 08:45:41 +000059 Register("exit", &ProtocolCallbacks::onExit);
Sam McCall8a5dded2017-10-12 13:29:58 +000060 Register("textDocument/didOpen", &ProtocolCallbacks::onDocumentDidOpen);
61 Register("textDocument/didClose", &ProtocolCallbacks::onDocumentDidClose);
62 Register("textDocument/didChange", &ProtocolCallbacks::onDocumentDidChange);
63 Register("textDocument/rangeFormatting",
64 &ProtocolCallbacks::onDocumentRangeFormatting);
65 Register("textDocument/onTypeFormatting",
66 &ProtocolCallbacks::onDocumentOnTypeFormatting);
67 Register("textDocument/formatting", &ProtocolCallbacks::onDocumentFormatting);
68 Register("textDocument/codeAction", &ProtocolCallbacks::onCodeAction);
69 Register("textDocument/completion", &ProtocolCallbacks::onCompletion);
70 Register("textDocument/signatureHelp", &ProtocolCallbacks::onSignatureHelp);
71 Register("textDocument/definition", &ProtocolCallbacks::onGoToDefinition);
72 Register("textDocument/switchSourceHeader",
73 &ProtocolCallbacks::onSwitchSourceHeader);
Haojian Wu345099c2017-11-09 11:30:04 +000074 Register("textDocument/rename", &ProtocolCallbacks::onRename);
Sam McCall8a5dded2017-10-12 13:29:58 +000075 Register("workspace/didChangeWatchedFiles", &ProtocolCallbacks::onFileEvent);
Marc-Andre Laperlee7ec16a2017-11-03 13:39:15 +000076 Register("workspace/executeCommand", &ProtocolCallbacks::onCommand);
Krasimir Georgiev6d2131a2017-04-04 09:46:39 +000077}