From 46a91bc16e174c810ee8380a20ca1f7bead69aa9 Mon Sep 17 00:00:00 2001
From: Alex Carney <alcarneyme@gmail.com>
Date: Sat, 10 Feb 2024 19:02:18 +0000
Subject: [PATCH] lsp: Allow features to register shutdown handlers

---
 lib/esbonio/esbonio/server/feature.py | 3 +++
 lib/esbonio/esbonio/server/server.py  | 3 +++
 lib/esbonio/esbonio/server/setup.py   | 5 +++++
 3 files changed, 11 insertions(+)

diff --git a/lib/esbonio/esbonio/server/feature.py b/lib/esbonio/esbonio/server/feature.py
index c2fb0d5cd..517c7a9f7 100644
--- a/lib/esbonio/esbonio/server/feature.py
+++ b/lib/esbonio/esbonio/server/feature.py
@@ -57,6 +57,9 @@ def initialize(self, params: types.InitializeParams):
     def initialized(self, params: types.InitializedParams):
         """Called when the ``initialized`` notification is received."""
 
+    def shutdown(self, params: None):
+        """Called when the server is instructed to ``shutdown`` by the client."""
+
     def document_change(self, params: types.DidChangeTextDocumentParams):
         """Called when a text document is changed."""
 
diff --git a/lib/esbonio/esbonio/server/server.py b/lib/esbonio/esbonio/server/server.py
index 03d20ac94..ff2c7adbd 100644
--- a/lib/esbonio/esbonio/server/server.py
+++ b/lib/esbonio/esbonio/server/server.py
@@ -123,6 +123,9 @@ async def initialized(self, params: types.InitializedParams):
         )
         self._ready.set_result(True)
 
+    def lsp_shutdown(self, params: None):
+        """Called when the server is instructed to ``shutdown`` by the client."""
+
     def load_extension(self, name: str, setup: Callable):
         """Load the given setup function as an extension.
 
diff --git a/lib/esbonio/esbonio/server/setup.py b/lib/esbonio/esbonio/server/setup.py
index ff15e0987..b2ea77596 100644
--- a/lib/esbonio/esbonio/server/setup.py
+++ b/lib/esbonio/esbonio/server/setup.py
@@ -57,6 +57,11 @@ async def on_initialized(
         await ls.initialized(params)
         await call_features(ls, "initialized", params)
 
+    @server.feature(types.SHUTDOWN)
+    async def on_shutdown(ls: EsbonioLanguageServer, params: None):
+        ls.lsp_shutdown(params)
+        await call_features(ls, "shutdown", params)
+
     @server.feature(types.TEXT_DOCUMENT_DID_CHANGE)
     async def on_document_change(
         ls: EsbonioLanguageServer, params: types.DidChangeTextDocumentParams