language_server.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "toolchain/language_server/language_server.h"
  5. #include "clang-tools-extra/clangd/LSPBinder.h"
  6. #include "clang-tools-extra/clangd/Transport.h"
  7. #include "clang-tools-extra/clangd/support/Logger.h"
  8. #include "common/raw_string_ostream.h"
  9. #include "toolchain/language_server/context.h"
  10. #include "toolchain/language_server/incoming_messages.h"
  11. #include "toolchain/language_server/outgoing_messages.h"
  12. namespace Carbon::LanguageServer {
  13. auto Run(FILE* input_stream, llvm::raw_ostream& output_stream,
  14. llvm::raw_ostream& error_stream) -> ErrorOr<Success> {
  15. // TODO: Consider implementing a custom logger that splits vlog to
  16. // vlog_stream when provided. For now, this disables verbose logging.
  17. clang::clangd::StreamLogger logger(error_stream, clang::clangd::Logger::Info);
  18. clang::clangd::LoggingSession logging_session(logger);
  19. // Set up the connection.
  20. std::unique_ptr<clang::clangd::Transport> transport(
  21. clang::clangd::newJSONTransport(input_stream, output_stream,
  22. /*InMirror=*/nullptr,
  23. /*Pretty=*/true));
  24. Context context;
  25. // TODO: Use error_stream in IncomingMessages to report dropped errors.
  26. IncomingMessages incoming(transport.get(), &context);
  27. OutgoingMessages outgoing(transport.get());
  28. // Run the server loop.
  29. llvm::Error err = transport->loop(incoming);
  30. if (err) {
  31. RawStringOstream out;
  32. out << err;
  33. return Error(out.TakeStr());
  34. } else {
  35. return Success();
  36. }
  37. }
  38. } // namespace Carbon::LanguageServer