blob: b505c4f13ea24f3a4af2f2bac9fe7a975a83483a [file] [log] [blame]
//===-- 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