11#include "mlir/Tools/lsp-server-support/Protocol.h"
12#include "mlir/Tools/lsp-server-support/Transport.h"
15#define DEBUG_TYPE "circt-verilog-lsp-server"
27 : server(server), transport(transport) {}
33 void onInitialize(
const InitializeParams ¶ms,
34 Callback<llvm::json::Value> reply);
35 void onInitialized(
const InitializedParams ¶ms);
36 void onShutdown(
const NoParams ¶ms, Callback<std::nullptr_t> reply);
42 void onDocumentDidOpen(
const DidOpenTextDocumentParams ¶ms);
43 void onDocumentDidClose(
const DidCloseTextDocumentParams ¶ms);
44 void onDocumentDidChange(
const DidChangeTextDocumentParams ¶ms);
51 JSONTransport &transport;
55 OutgoingNotification<PublishDiagnosticsParams> publishDiagnostics;
59 bool shutdownRequestReceived =
false;
67void LSPServer::onInitialize(
const InitializeParams ¶ms,
68 Callback<llvm::json::Value> reply) {
70 llvm::json::Object serverCaps{
74 {
"change", (int)TextDocumentSyncKind::Incremental},
78 llvm::json::Object result{
79 {{
"serverInfo", llvm::json::Object{{
"name",
"circt-verilog-lsp-server"},
80 {
"version",
"0.0.1"}}},
81 {
"capabilities", std::move(serverCaps)}}};
82 reply(std::move(result));
84void LSPServer::onInitialized(
const InitializedParams &) {}
85void LSPServer::onShutdown(
const NoParams &, Callback<std::nullptr_t> reply) {
86 shutdownRequestReceived =
true;
94void LSPServer::onDocumentDidOpen(
const DidOpenTextDocumentParams ¶ms) {
95 PublishDiagnosticsParams diagParams(params.textDocument.uri,
96 params.textDocument.version);
97 server.addDocument(params.textDocument.uri, params.textDocument.text,
98 params.textDocument.version, diagParams.diagnostics);
101 publishDiagnostics(diagParams);
104void LSPServer::onDocumentDidClose(
const DidCloseTextDocumentParams ¶ms) {
105 std::optional<int64_t> version =
106 server.removeDocument(params.textDocument.uri);
114 PublishDiagnosticsParams(params.textDocument.uri, *version));
117void LSPServer::onDocumentDidChange(
const DidChangeTextDocumentParams ¶ms) {
118 PublishDiagnosticsParams diagParams(params.textDocument.uri,
119 params.textDocument.version);
120 server.updateDocument(params.textDocument.uri, params.contentChanges,
121 params.textDocument.version, diagParams.diagnostics);
124 publishDiagnostics(diagParams);
132 JSONTransport &transport) {
133 LSPServer lspServer(
server, transport);
134 MessageHandler messageHandler(transport);
137 messageHandler.method(
"initialize", &lspServer, &LSPServer::onInitialize);
138 messageHandler.notification(
"initialized", &lspServer,
139 &LSPServer::onInitialized);
140 messageHandler.method(
"shutdown", &lspServer, &LSPServer::onShutdown);
143 messageHandler.notification(
"textDocument/didOpen", &lspServer,
144 &LSPServer::onDocumentDidOpen);
145 messageHandler.notification(
"textDocument/didClose", &lspServer,
146 &LSPServer::onDocumentDidClose);
147 messageHandler.notification(
"textDocument/didChange", &lspServer,
148 &LSPServer::onDocumentDidChange);
151 lspServer.publishDiagnostics =
152 messageHandler.outgoingNotification<PublishDiagnosticsParams>(
153 "textDocument/publishDiagnostics");
156 if (llvm::Error error = transport.run(messageHandler)) {
157 Logger::error(
"Transport error: {0}", error);
158 llvm::consumeError(std::move(error));
162 return success(lspServer.shutdownRequestReceived);
static std::unique_ptr< RpcServer > server
This class implements all of the Verilog related functionality necessary for a language server.
llvm::LogicalResult runVerilogLSPServer(VerilogServer &server, mlir::lsp::JSONTransport &transport)
Run the main loop of the LSP server using the given Verilog server and transport.