Problem
workspace.workspaceFolders.changeNotifications may be a string: per LSP 3.18 it is then the id under which the notification is registered, "and can be used to unregister for these notifications". kakehashi treats Right(id) as capable for the connection's lifetime (supports_workspace_folder_changes(&ServerCapabilities)), and the id never enters DynamicCapabilityRegistry, so a client/unregisterCapability { id, method: "workspace/didChangeWorkspaceFolders" } withdraws nothing and folder changes keep being forwarded.
Pre-existing; #1107 (#968) made dynamic registrations count and honors their unregistration, and documents that a static id is not covered.
Fix shape
At handshake, when changeNotifications is Right(id), seed the registry with Registration { id, method: "workspace/didChangeWorkspaceFolders" } and let the static predicate count only Left(true), so the live registry read decides for both.
Problem
workspace.workspaceFolders.changeNotificationsmay be a string: per LSP 3.18 it is then the id under which the notification is registered, "and can be used to unregister for these notifications". kakehashi treatsRight(id)as capable for the connection's lifetime (supports_workspace_folder_changes(&ServerCapabilities)), and the id never entersDynamicCapabilityRegistry, so aclient/unregisterCapability { id, method: "workspace/didChangeWorkspaceFolders" }withdraws nothing and folder changes keep being forwarded.Pre-existing; #1107 (#968) made dynamic registrations count and honors their unregistration, and documents that a static id is not covered.
Fix shape
At handshake, when
changeNotificationsisRight(id), seed the registry withRegistration { id, method: "workspace/didChangeWorkspaceFolders" }and let the static predicate count onlyLeft(true), so the live registry read decides for both.