summaryrefslogtreecommitdiff
path: root/clang-tools-extra/clangd/tool
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/tool')
-rw-r--r--clang-tools-extra/clangd/tool/CMakeLists.txt7
-rw-r--r--clang-tools-extra/clangd/tool/ClangdMain.cpp32
2 files changed, 32 insertions, 7 deletions
diff --git a/clang-tools-extra/clangd/tool/CMakeLists.txt b/clang-tools-extra/clangd/tool/CMakeLists.txt
index c18876179a0..1ad2ca1bd2a 100644
--- a/clang-tools-extra/clangd/tool/CMakeLists.txt
+++ b/clang-tools-extra/clangd/tool/CMakeLists.txt
@@ -1,4 +1,5 @@
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..)
+include_directories(${CMAKE_CURRENT_BINARY_DIR}/..)
add_clang_tool(clangd
ClangdMain.cpp
@@ -8,6 +9,11 @@ set(LLVM_LINK_COMPONENTS
support
)
+set(CLANGD_XPC_LIBS "")
+if(CLANGD_BUILD_XPC)
+ list(APPEND CLANGD_XPC_LIBS "clangdXpcJsonConversions" "clangdXpcTransport")
+endif()
+
target_link_libraries(clangd
PRIVATE
clangBasic
@@ -17,4 +23,5 @@ target_link_libraries(clangd
clangSema
clangTooling
clangToolingCore
+ ${CLANGD_XPC_LIBS}
)
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);
}