diff options
Diffstat (limited to 'clang-tools-extra/clangd/tool')
-rw-r--r-- | clang-tools-extra/clangd/tool/CMakeLists.txt | 7 | ||||
-rw-r--r-- | clang-tools-extra/clangd/tool/ClangdMain.cpp | 32 |
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); } |