summaryrefslogtreecommitdiff
path: root/clang-tools-extra/clangd/tool/ClangdMain.cpp
diff options
context:
space:
mode:
authorJan Korous <jkorous@apple.com>2019-01-16 00:24:22 +0000
committerJan Korous <jkorous@apple.com>2019-01-16 00:24:22 +0000
commitde3bade227c6caf680cebb3fa995d017ad99a771 (patch)
treefeb25812c37ed5e408643d851fe177f5710160fc /clang-tools-extra/clangd/tool/ClangdMain.cpp
parentd6ecaee1815084cc81ec145677f085d1fa591afc (diff)
[clangd] XPC transport layer
- New transport layer for macOS. - XPC Framework - Test client Framework and client were written by Alex Lorenz. Differential Revision: https://reviews.llvm.org/D54428
Diffstat (limited to 'clang-tools-extra/clangd/tool/ClangdMain.cpp')
-rw-r--r--clang-tools-extra/clangd/tool/ClangdMain.cpp32
1 files changed, 25 insertions, 7 deletions
diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp
index 3d338aec8f0..0a7d561ea0a 100644
--- a/clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -7,6 +7,7 @@
//
//===----------------------------------------------------------------------===//
+#include "Features.inc"
#include "ClangdLSPServer.h"
#include "Path.h"
#include "Trace.h"
@@ -255,6 +256,11 @@ const char TestScheme::TestDir[] = "/clangd-test";
} // namespace clangd
} // namespace clang
+enum class ErrorResultCode : int {
+ NoShutdownRequest = 1,
+ CantRunAsXPCService = 2
+};
+
int main(int argc, char *argv[]) {
using namespace clang;
using namespace clang::clangd;
@@ -408,14 +414,26 @@ int main(int argc, char *argv[]) {
// Initialize and run ClangdLSPServer.
// Change stdin to binary to not lose \r\n on windows.
llvm::sys::ChangeStdinToBinary();
- auto Transport = newJSONTransport(
- stdin, llvm::outs(),
- InputMirrorStream ? InputMirrorStream.getPointer() : nullptr, PrettyPrint,
- InputStyle);
+
+ std::unique_ptr<Transport> TransportLayer;
+ if (getenv("CLANGD_AS_XPC_SERVICE")) {
+#ifdef CLANGD_BUILD_XPC
+ TransportLayer = newXPCTransport();
+#else
+ errs() << "This clangd binary wasn't built with XPC support.\n";
+ return ErrorResultCode::CantRunAsXPCService;
+#endif
+ } else {
+ TransportLayer = newJSONTransport(
+ stdin, llvm::outs(),
+ InputMirrorStream ? InputMirrorStream.getPointer() : nullptr,
+ PrettyPrint, InputStyle);
+ }
+
ClangdLSPServer LSPServer(
- *Transport, CCOpts, CompileCommandsDirPath,
+ *TransportLayer, CCOpts, CompileCommandsDirPath,
/*UseDirBasedCDB=*/CompileArgsFrom == FilesystemCompileArgs, Opts);
- constexpr int NoShutdownRequestErrorCode = 1;
llvm::set_thread_name("clangd.main");
- return LSPServer.run() ? 0 : NoShutdownRequestErrorCode;
+ return LSPServer.run() ? 0
+ : static_cast<int>(ErrorResultCode::NoShutdownRequest);
}