[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / clang-tools-extra / clangd / unittests / LSPClient.h
blob3d459076321acaf5d832599bfa23918b6c97d5d3
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 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_LSPCLIENT_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_LSPCLIENT_H
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>
21 namespace clang {
22 namespace clangd {
23 class Transport;
25 // A client library for talking to ClangdLSPServer in tests.
26 // Manages serialization of messages, pairing requests/repsonses, and implements
27 // the Transport abstraction.
28 class LSPClient {
29 class TransportImpl;
30 std::unique_ptr<TransportImpl> T;
32 public:
33 // Represents the result of an LSP call: a promise for a result or error.
34 class CallResult {
35 public:
36 ~CallResult();
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();
43 private:
44 // Should be called once to provide the value.
45 void set(llvm::Expected<llvm::json::Value> V);
47 std::optional<llvm::Expected<llvm::json::Value>> Value;
48 std::mutex Mu;
49 std::condition_variable CV;
51 friend TransportImpl; // Calls set().
54 LSPClient();
55 ~LSPClient();
56 LSPClient(LSPClient &&) = delete;
57 LSPClient &operator=(LSPClient &&) = delete;
59 // Enqueue an LSP method call, returns a promise for the reply. Threadsafe.
60 CallResult &call(llvm::StringRef Method, llvm::json::Value Params);
61 // Enqueue an LSP notification. Threadsafe.
62 void notify(llvm::StringRef Method, llvm::json::Value Params);
63 // Returns matching notifications since the last call to takeNotifications.
64 std::vector<llvm::json::Value> takeNotifications(llvm::StringRef Method);
65 // The transport is shut down after all pending messages are sent.
66 void stop();
68 // Shorthand for common LSP methods. Relative paths are passed to testPath().
69 static llvm::json::Value uri(llvm::StringRef Path);
70 static llvm::json::Value documentID(llvm::StringRef Path);
71 void didOpen(llvm::StringRef Path, llvm::StringRef Content);
72 void didChange(llvm::StringRef Path, llvm::StringRef Content);
73 void didClose(llvm::StringRef Path);
74 // Blocks until the server is idle (using the 'sync' protocol extension).
75 void sync();
76 // sync()s to ensure pending diagnostics arrive, and returns the newest set.
77 std::optional<std::vector<llvm::json::Value>>
78 diagnostics(llvm::StringRef Path);
80 // Get the transport used to connect this client to a ClangdLSPServer.
81 Transport &transport();
83 private:
86 } // namespace clangd
87 } // namespace clang
89 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_LSPCLIENT_H