Skip to content

Commit 61a7fc5

Browse files
committed
only watch for documents handled by the language server, to prevent unexpected restarts from lsp client
1 parent 7ee34e4 commit 61a7fc5

File tree

5 files changed

+31
-6
lines changed

5 files changed

+31
-6
lines changed

robotcode/language_server/common/parts/documents.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,12 @@ async def _protocol_initialized(self, sender: Any) -> None:
5757
await self._update_filewatchers()
5858

5959
async def _update_filewatchers(self) -> None:
60-
await self.parent.workspace.add_file_watcher(self._file_watcher, "**/*", WatchKind.CHANGE | WatchKind.DELETE)
60+
if self.parent.file_extensions:
61+
await self.parent.workspace.add_file_watcher(
62+
self._file_watcher,
63+
f"**/*.{{{','.join(self.parent.file_extensions)}}}",
64+
WatchKind.CHANGE | WatchKind.DELETE,
65+
)
6166

6267
async def _file_watcher(self, sender: Any, changes: List[FileEvent]) -> None:
6368
to_change: Dict[str, FileEvent] = {}

robotcode/language_server/common/parts/workspace.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,13 @@ def __init__(
159159
self._file_watchers: weakref.WeakSet[FileWatcherEntry] = weakref.WeakSet()
160160
self._file_watchers_lock = Lock()
161161

162+
self.parent.on_shutdown.add(self._on_shutdown)
163+
164+
@_logger.call
165+
async def _on_shutdown(self, sender: Any) -> None:
166+
for e in self._file_watchers.copy():
167+
await self.remove_file_watcher_entry(e)
168+
162169
def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
163170
capabilities.workspace = ServerCapabilitiesWorkspace(
164171
workspace_folders=WorkspaceFoldersServerCapabilities(
@@ -373,6 +380,7 @@ async def add_file_watcher(
373380
) -> FileWatcherEntry:
374381
return await self.add_file_watchers(callback, [(glob_pattern, kind)])
375382

383+
@_logger.call
376384
async def add_file_watchers(
377385
self,
378386
callback: Callable[[Any, List[FileEvent]], Coroutine[Any, Any, None]],
@@ -430,6 +438,7 @@ def remove() -> None:
430438

431439
return entry
432440

441+
@_logger.call
433442
async def remove_file_watcher_entry(self, entry: FileWatcherEntry) -> None:
434443
async with self._file_watchers_lock:
435444
self._file_watchers.remove(entry)

robotcode/language_server/common/protocol.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
import asyncio
4-
from typing import Any, List, Optional, Union, cast
4+
from typing import Any, List, Optional, Set, Union, cast
55

66
from ...jsonrpc2.protocol import (
77
JsonRPCErrorException,
@@ -83,6 +83,8 @@ class LanguageServerProtocol(JsonRPCProtocol):
8383
name: Optional[str] = None
8484
version: Optional[str] = None
8585

86+
file_extensions: Set[str] = set()
87+
8688
def __init__(self, server: JsonRPCServer[Any]):
8789
super().__init__()
8890
self.server = server

robotcode/language_server/robotframework/protocol.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ class RobotLanguageServerProtocol(LanguageServerProtocol):
9393
name = "RobotCode"
9494
version = __version__
9595

96+
file_extensions = {"robot", "resource", "py"}
97+
9698
def __init__(self, server: "RobotLanguageServer"):
9799
super().__init__(server)
98100
self.options = Options()

vscode-client/languageclientsmanger.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,17 @@ export class LanguageClientsManager {
9696
this.clients.clear();
9797

9898
for (const client of clients) {
99-
promises.push(client.stop());
99+
promises.push(client.stop().then((_) => global.gc()));
100100
}
101101

102102
return Promise.all(promises).then(
103-
(r) => r.length > 0,
103+
(r) => {
104+
if (global.gc) {
105+
global.gc();
106+
}
107+
108+
return r.length > 0;
109+
},
104110
(reason) => {
105111
this.outputChannel.appendLine(`can't stop client ${reason}`);
106112
return true;
@@ -262,8 +268,6 @@ export class LanguageClientsManager {
262268
error(_error: Error, _message: Message | undefined, _count: number | undefined): ErrorHandlerResult {
263269
return {
264270
action: ErrorAction.Continue,
265-
266-
message: `har ein error ${_error.message}`,
267271
};
268272
},
269273

@@ -292,6 +296,9 @@ export class LanguageClientsManager {
292296
result.onDidChangeState((e) => {
293297
if (e.newState == State.Running) {
294298
closeHandlerAction = CloseAction.Restart;
299+
} else if (e.newState == State.Stopped) {
300+
if (this.clients.get(workspaceFolder.uri.toString()) !== result)
301+
closeHandlerAction = CloseAction.DoNotRestart;
295302
}
296303

297304
this._onClientStateChangedEmitter.fire({

0 commit comments

Comments
 (0)