diff --git a/LanguageServer.Framework/Protocol/JsonProtocolContext.cs b/LanguageServer.Framework/Protocol/JsonProtocolContext.cs index d010806..84cba0f 100644 --- a/LanguageServer.Framework/Protocol/JsonProtocolContext.cs +++ b/LanguageServer.Framework/Protocol/JsonProtocolContext.cs @@ -77,6 +77,7 @@ namespace EmmyLua.LanguageServer.Framework.Protocol; [JsonSerializable(typeof(MethodMessage))] [JsonSerializable(typeof(RequestMessage))] [JsonSerializable(typeof(ResponseMessage))] +[JsonSerializable(typeof(ShutdownResponseMessage))] [JsonSerializable(typeof(NotificationMessage))] [JsonSerializable(typeof(ResponseError))] [JsonSerializable(typeof(InitializeParams))] diff --git a/LanguageServer.Framework/Protocol/JsonRpc/Message.cs b/LanguageServer.Framework/Protocol/JsonRpc/Message.cs index 5027387..02433d5 100644 --- a/LanguageServer.Framework/Protocol/JsonRpc/Message.cs +++ b/LanguageServer.Framework/Protocol/JsonRpc/Message.cs @@ -74,6 +74,19 @@ public record ResponseMessage( [JsonPropertyName("error")] public ResponseError? Error { get; } = Error; } +public record ShutdownResponseMessage( + StringOrInt Id +) : Message("2.0") +{ + [JsonPropertyName("id")] public StringOrInt Id { get; } = Id; + + [JsonPropertyName("result")] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public JsonDocument? Result { get; } = null; + // - When responding to a "shutdown" message, the result must always be null. + // - The JsonIgnoreCondition.Never attribute is explicitly set to serialize the JSON as null +} + public record NotificationMessage( string Method, JsonDocument? Params diff --git a/LanguageServer.Framework/Server/JsonProtocol/JsonProtocolWriter.cs b/LanguageServer.Framework/Server/JsonProtocol/JsonProtocolWriter.cs index 7c01e53..effbaec 100644 --- a/LanguageServer.Framework/Server/JsonProtocol/JsonProtocolWriter.cs +++ b/LanguageServer.Framework/Server/JsonProtocol/JsonProtocolWriter.cs @@ -32,6 +32,12 @@ public void WriteResponse(StringOrInt id, JsonDocument? document, ResponseError? WriteMessage(response); } + public void WriteShutdownResponse(StringOrInt id) + { + var response = new ShutdownResponseMessage(id); + WriteMessage(response); + } + public void WriteNotification(NotificationMessage message) { WriteMessage(message); diff --git a/LanguageServer.Framework/Server/LanguageServer.cs b/LanguageServer.Framework/Server/LanguageServer.cs index 57da221..abc41f3 100644 --- a/LanguageServer.Framework/Server/LanguageServer.cs +++ b/LanguageServer.Framework/Server/LanguageServer.cs @@ -107,7 +107,7 @@ protected override bool BaseHandle(Message message) } ShutdownEventDelegate?.Invoke(); - Writer.WriteResponse(requestMessage.Id, null); + Writer.WriteShutdownResponse(requestMessage.Id); return true; } }