language_server.h 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. #ifndef CARBON_LANGUAGE_SERVER_LANGUAGE_SERVER_H_
  5. #define CARBON_LANGUAGE_SERVER_LANGUAGE_SERVER_H_
  6. #include <unordered_map>
  7. #include <vector>
  8. #include "clang-tools-extra/clangd/LSPBinder.h"
  9. #include "clang-tools-extra/clangd/Protocol.h"
  10. #include "clang-tools-extra/clangd/Transport.h"
  11. #include "clang-tools-extra/clangd/support/Function.h"
  12. #include "toolchain/lex/tokenized_buffer.h"
  13. #include "toolchain/parse/tree.h"
  14. #include "toolchain/source/source_buffer.h"
  15. namespace Carbon::LS {
  16. class LanguageServer : public clang::clangd::Transport::MessageHandler,
  17. public clang::clangd::LSPBinder::RawOutgoing {
  18. public:
  19. // Start the language server.
  20. static void Start();
  21. // Transport::MessageHandler
  22. // Handlers returns true to keep processing messages, or false to shut down.
  23. // Handler called on notification by client.
  24. auto onNotify(llvm::StringRef method, llvm::json::Value value)
  25. -> bool override;
  26. // Handler called on method call by client.
  27. auto onCall(llvm::StringRef method, llvm::json::Value params,
  28. llvm::json::Value id) -> bool override;
  29. // Handler called on response of Transport::call.
  30. auto onReply(llvm::json::Value id, llvm::Expected<llvm::json::Value> result)
  31. -> bool override;
  32. // LSPBinder::RawOutgoing
  33. // Send method call to client
  34. void callMethod(llvm::StringRef method, llvm::json::Value params,
  35. clang::clangd::Callback<llvm::json::Value> reply) override {
  36. // TODO: implement when needed
  37. }
  38. // Send notification to client
  39. void notify(llvm::StringRef method, llvm::json::Value params) override {
  40. transport_->notify(method, params);
  41. }
  42. private:
  43. const std::unique_ptr<clang::clangd::Transport> transport_;
  44. // content of files managed by the language client.
  45. std::unordered_map<std::string, std::string> files_;
  46. // handlers for client methods and notifications
  47. clang::clangd::LSPBinder::RawHandlers handlers_;
  48. explicit LanguageServer(std::unique_ptr<clang::clangd::Transport> transport)
  49. : transport_(std::move(transport)) {}
  50. // Typed handlers for notifications and method calls by client.
  51. // Client opened a document.
  52. void OnDidOpenTextDocument(
  53. clang::clangd::DidOpenTextDocumentParams const& params);
  54. // Client updated content of a document.
  55. void OnDidChangeTextDocument(
  56. clang::clangd::DidChangeTextDocumentParams const& params);
  57. // Capabilities negotiation
  58. void OnInitialize(clang::clangd::NoParams const& client_capabilities,
  59. clang::clangd::Callback<llvm::json::Object> cb);
  60. // Code outline
  61. void OnDocumentSymbol(
  62. clang::clangd::DocumentSymbolParams const& params,
  63. clang::clangd::Callback<std::vector<clang::clangd::DocumentSymbol>> cb);
  64. };
  65. } // namespace Carbon::LS
  66. #endif // CARBON_LANGUAGE_SERVER_LANGUAGE_SERVER_H_