clang-tools 20.0.0git
LSPClient.h
Go to the documentation of this file.
1//===-- LSPClient.h - Helper for ClangdLSPServer tests ----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_LSPCLIENT_H
10#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_LSPCLIENT_H
11
12#include "llvm/ADT/StringRef.h"
13#include <condition_variable>
14#include <llvm/Support/Error.h>
15#include <llvm/Support/JSON.h>
16#include <memory>
17#include <mutex>
18#include <optional>
19#include <vector>
20
21namespace clang {
22namespace clangd {
23class Transport;
24
25// A client library for talking to ClangdLSPServer in tests.
26// Manages serialization of messages, pairing requests/repsonses, and implements
27// the Transport abstraction.
28class LSPClient {
29 class TransportImpl;
30 std::unique_ptr<TransportImpl> T;
31
32public:
33 // Represents the result of an LSP call: a promise for a result or error.
34 class CallResult {
35 public:
37 // Blocks up to 60 seconds for the result to be ready.
38 // Records a test failure if there was no reply.
39 llvm::Expected<llvm::json::Value> take();
40 // Like take(), but records a test failure if the result was an error.
41 llvm::json::Value takeValue();
42
43 private:
44 // Should be called once to provide the value.
45 void set(llvm::Expected<llvm::json::Value> V);
46
47 std::optional<llvm::Expected<llvm::json::Value>> Value;
48 std::mutex Mu;
49 std::condition_variable CV;
50
51 friend TransportImpl; // Calls set().
52 };
53
54 LSPClient();
56 LSPClient(LSPClient &&) = delete;
58
59 // Enqueue an LSP method call, returns a promise for the reply. Threadsafe.
60 CallResult &call(llvm::StringRef Method, llvm::json::Value Params);
61 // Normally, any call from the server to the client will be marked as a test
62 // failure. Use this to allow a call to pass through, use takeCallParams() to
63 // retrieve it.
64 void expectServerCall(llvm::StringRef Method);
65 // Enqueue an LSP notification. Threadsafe.
66 void notify(llvm::StringRef Method, llvm::json::Value Params);
67 // Returns matching notifications since the last call to takeNotifications.
68 std::vector<llvm::json::Value> takeNotifications(llvm::StringRef Method);
69 // Returns matching parameters since the last call to takeCallParams.
70 std::vector<llvm::json::Value> takeCallParams(llvm::StringRef Method);
71 // The transport is shut down after all pending messages are sent.
72 void stop();
73
74 // Shorthand for common LSP methods. Relative paths are passed to testPath().
75 static llvm::json::Value uri(llvm::StringRef Path);
76 static llvm::json::Value documentID(llvm::StringRef Path);
77 void didOpen(llvm::StringRef Path, llvm::StringRef Content);
78 void didChange(llvm::StringRef Path, llvm::StringRef Content);
79 void didClose(llvm::StringRef Path);
80 // Blocks until the server is idle (using the 'sync' protocol extension).
81 void sync();
82 // sync()s to ensure pending diagnostics arrive, and returns the newest set.
83 std::optional<std::vector<llvm::json::Value>>
84 diagnostics(llvm::StringRef Path);
85
86 // Get the transport used to connect this client to a ClangdLSPServer.
88
89private:
90};
91
92} // namespace clangd
93} // namespace clang
94
95#endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_LSPCLIENT_H
llvm::Expected< llvm::json::Value > take()
Definition: LSPClient.cpp:39
CallResult & call(llvm::StringRef Method, llvm::json::Value Params)
Definition: LSPClient.cpp:180
LSPClient(LSPClient &&)=delete
LSPClient & operator=(LSPClient &&)=delete
std::vector< llvm::json::Value > takeNotifications(llvm::StringRef Method)
Definition: LSPClient.cpp:204
static llvm::json::Value uri(llvm::StringRef Path)
Definition: LSPClient.cpp:219
std::vector< llvm::json::Value > takeCallParams(llvm::StringRef Method)
Definition: LSPClient.cpp:209
static llvm::json::Value documentID(llvm::StringRef Path)
Definition: LSPClient.cpp:225
void didClose(llvm::StringRef Path)
Definition: LSPClient.cpp:240
void notify(llvm::StringRef Method, llvm::json::Value Params)
Definition: LSPClient.cpp:195
void expectServerCall(llvm::StringRef Method)
Definition: LSPClient.cpp:191
void didOpen(llvm::StringRef Path, llvm::StringRef Content)
Definition: LSPClient.cpp:229
void didChange(llvm::StringRef Path, llvm::StringRef Content)
Definition: LSPClient.cpp:235
std::optional< std::vector< llvm::json::Value > > diagnostics(llvm::StringRef Path)
Definition: LSPClient.cpp:247
Transport & transport()
Definition: LSPClient.cpp:215
std::string Path
A typedef to represent a file path.
Definition: Path.h:26
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//