language_server.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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/diagnostics/diagnostic_emitter.h"
  10. #include "toolchain/language_server/context.h"
  11. #include "toolchain/language_server/incoming_messages.h"
  12. #include "toolchain/language_server/outgoing_messages.h"
  13. namespace Carbon::LanguageServer {
  14. auto Run(FILE* input_stream, llvm::raw_ostream& output_stream,
  15. llvm::raw_ostream& error_stream, DiagnosticConsumer& consumer)
  16. -> bool {
  17. // TODO: Consider implementing a custom logger that splits vlog to
  18. // vlog_stream when provided. For now, this disables verbose logging.
  19. clang::clangd::StreamLogger logger(error_stream, clang::clangd::Logger::Info);
  20. clang::clangd::LoggingSession logging_session(logger);
  21. // Set up the connection.
  22. std::unique_ptr<clang::clangd::Transport> transport(
  23. clang::clangd::newJSONTransport(input_stream, output_stream,
  24. /*InMirror=*/nullptr,
  25. /*Pretty=*/true));
  26. Context context;
  27. // TODO: Use error_stream in IncomingMessages to report dropped errors.
  28. IncomingMessages incoming(transport.get(), &context);
  29. OutgoingMessages outgoing(transport.get());
  30. // Run the server loop.
  31. llvm::Error err = transport->loop(incoming);
  32. if (err) {
  33. RawStringOstream out;
  34. out << err;
  35. CARBON_DIAGNOSTIC(LanguageServerTransportError, Error, "{0}", std::string);
  36. NoLocDiagnosticEmitter emitter(&consumer);
  37. emitter.Emit(LanguageServerTransportError, out.TakeStr());
  38. return false;
  39. }
  40. return true;
  41. }
  42. } // namespace Carbon::LanguageServer