blob: 7d905bc82b3e2a630dcc351f44918caa1ef9d1eb [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 McCallff8b8742017-11-30 21:32:29 +000024// FooParams should have a fromJSON function.
Sam McCall8a5dded2017-10-12 13:29:58 +000025struct HandlerRegisterer {
26 template <typename Param>
27 void operator()(StringRef Method,
Ilya Biryukov940901e2017-12-13 12:51:22 +000028 void (ProtocolCallbacks::*Handler)(Context, Param)) {
Sam McCall8a5dded2017-10-12 13:29:58 +000029 // Capture pointers by value, as the lambda will outlive this object.
Sam McCall8a5dded2017-10-12 13:29:58 +000030 auto *Callbacks = this->Callbacks;
31 Dispatcher.registerHandler(
Ilya Biryukov940901e2017-12-13 12:51:22 +000032 Method, [=](Context C, const json::Expr &RawParams) {
Sam McCallff8b8742017-11-30 21:32:29 +000033 typename std::remove_reference<Param>::type P;
34 if (fromJSON(RawParams, P)) {
35 (Callbacks->*Handler)(std::move(C), P);
Sam McCall8a5dded2017-10-12 13:29:58 +000036 } else {
Ilya Biryukov940901e2017-12-13 12:51:22 +000037 log(C, "Failed to decode " + Method + " request.");
Sam McCall8a5dded2017-10-12 13:29:58 +000038 }
39 });
Krasimir Georgiev561ba5e2017-04-10 13:31:39 +000040 }
41
Sam McCall8a5dded2017-10-12 13:29:58 +000042 JSONRPCDispatcher &Dispatcher;
43 JSONOutput *Out;
44 ProtocolCallbacks *Callbacks;
Marc-Andre Laperlebf114242017-10-02 18:00:37 +000045};
46
Ilya Biryukovafb55542017-05-16 14:40:30 +000047} // namespace
48
Sam McCallef41c342017-09-29 16:41:23 +000049void clangd::registerCallbackHandlers(JSONRPCDispatcher &Dispatcher,
Ilya Biryukov3847be52017-10-10 14:21:04 +000050 JSONOutput &Out,
51 ProtocolCallbacks &Callbacks) {
Sam McCall8a5dded2017-10-12 13:29:58 +000052 HandlerRegisterer Register{Dispatcher, &Out, &Callbacks};
53
54 Register("initialize", &ProtocolCallbacks::onInitialize);
55 Register("shutdown", &ProtocolCallbacks::onShutdown);
Ilya Biryukov0d9b8a32017-10-25 08:45:41 +000056 Register("exit", &ProtocolCallbacks::onExit);
Sam McCall8a5dded2017-10-12 13:29:58 +000057 Register("textDocument/didOpen", &ProtocolCallbacks::onDocumentDidOpen);
58 Register("textDocument/didClose", &ProtocolCallbacks::onDocumentDidClose);
59 Register("textDocument/didChange", &ProtocolCallbacks::onDocumentDidChange);
60 Register("textDocument/rangeFormatting",
61 &ProtocolCallbacks::onDocumentRangeFormatting);
62 Register("textDocument/onTypeFormatting",
63 &ProtocolCallbacks::onDocumentOnTypeFormatting);
64 Register("textDocument/formatting", &ProtocolCallbacks::onDocumentFormatting);
65 Register("textDocument/codeAction", &ProtocolCallbacks::onCodeAction);
66 Register("textDocument/completion", &ProtocolCallbacks::onCompletion);
67 Register("textDocument/signatureHelp", &ProtocolCallbacks::onSignatureHelp);
68 Register("textDocument/definition", &ProtocolCallbacks::onGoToDefinition);
69 Register("textDocument/switchSourceHeader",
70 &ProtocolCallbacks::onSwitchSourceHeader);
Haojian Wu345099c2017-11-09 11:30:04 +000071 Register("textDocument/rename", &ProtocolCallbacks::onRename);
Sam McCall8a5dded2017-10-12 13:29:58 +000072 Register("workspace/didChangeWatchedFiles", &ProtocolCallbacks::onFileEvent);
Marc-Andre Laperlee7ec16a2017-11-03 13:39:15 +000073 Register("workspace/executeCommand", &ProtocolCallbacks::onCommand);
Ilya Biryukov0e6a51f2017-12-12 12:27:47 +000074 Register("textDocument/documentHighlight",
75 &ProtocolCallbacks::onDocumentHighlight);
Krasimir Georgiev6d2131a2017-04-04 09:46:39 +000076}