1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
//===-- LSPClient.h - Helper for ClangdLSPServer tests ----------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include <condition_variable>
#include <deque>
#include <llvm/ADT/Optional.h>
#include <llvm/Support/Error.h>
#include <llvm/Support/JSON.h>
#include <mutex>
namespace clang {
namespace clangd {
class Transport;
// A client library for talking to ClangdLSPServer in tests.
// Manages serialization of messages, pairing requests/repsonses, and implements
// the Transport abstraction.
class LSPClient {
class TransportImpl;
std::unique_ptr<TransportImpl> T;
public:
// Represents the result of an LSP call: a promise for a result or error.
class CallResult {
public:
~CallResult();
// Blocks up to 10 seconds for the result to be ready.
// Records a test failure if there was no reply.
llvm::Expected<llvm::json::Value> take();
// Like take(), but records a test failure if the result was an error.
llvm::json::Value takeValue();
private:
// Should be called once to provide the value.
void set(llvm::Expected<llvm::json::Value> V);
llvm::Optional<llvm::Expected<llvm::json::Value>> Value;
std::mutex Mu;
std::condition_variable CV;
friend TransportImpl; // Calls set().
};
LSPClient();
~LSPClient();
LSPClient(LSPClient &&) = delete;
LSPClient &operator=(LSPClient &&) = delete;
// Enqueue an LSP method call, returns a promise for the reply. Threadsafe.
CallResult &call(llvm::StringRef Method, llvm::json::Value Params);
// Enqueue an LSP notification. Threadsafe.
void notify(llvm::StringRef Method, llvm::json::Value Params);
// Returns matching notifications since the last call to takeNotifications.
std::vector<llvm::json::Value> takeNotifications(llvm::StringRef Method);
// The transport is shut down after all pending messages are sent.
void stop();
// Shorthand for common LSP methods. Relative paths are passed to testPath().
static llvm::json::Value uri(llvm::StringRef Path);
static llvm::json::Value documentID(llvm::StringRef Path);
void didOpen(llvm::StringRef Path, llvm::StringRef Content);
void didChange(llvm::StringRef Path, llvm::StringRef Content);
void didClose(llvm::StringRef Path);
// Blocks until the server is idle (using the 'sync' protocol extension).
void sync();
// sync()s to ensure pending diagnostics arrive, and returns the newest set.
llvm::Optional<std::vector<llvm::json::Value>>
diagnostics(llvm::StringRef Path);
// Get the transport used to connect this client to a ClangdLSPServer.
Transport &transport();
private:
};
} // namespace clangd
} // namespace clang
|