Skip to content

Commit a2ffdc6

Browse files
committed
feat: New command Clear Cache and Restart Language Servers
Clears all cached data i.e library docs and restarts the language servers.
1 parent 0e7ce69 commit a2ffdc6

File tree

6 files changed

+42
-8
lines changed

6 files changed

+42
-8
lines changed

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,11 @@
711711
"title": "Restart Language Servers",
712712
"category": "RobotCode",
713713
"command": "robotcode.restartLanguageServers"
714+
},
715+
{
716+
"title": "Clear Cache and Restart Language Servers",
717+
"category": "RobotCode",
718+
"command": "robotcode.clearCacheRestartLanguageServers"
714719
}
715720
],
716721
"menus": {

robotcode/jsonrpc2/protocol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ def set_result(f: asyncio.Future[Any], r: Any, ev: threading.Event) -> None:
618618
await asyncio.sleep(0)
619619

620620
else:
621-
self._logger.warning(f"Response {entry:r} loop is not running.")
621+
self._logger.warning(f"Response {repr(entry)} loop is not running.")
622622

623623
except (SystemExit, KeyboardInterrupt):
624624
raise

robotcode/language_server/robotframework/diagnostics/imports_manager.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import asyncio
55
import itertools
66
import os
7+
import shutil
78
import sys
89
import weakref
910
import zlib
@@ -503,9 +504,10 @@ def __init__(self, parent_protocol: RobotLanguageServerProtocol, folder: Uri, co
503504

504505
self._logger.trace(lambda: f"use {cache_base_path} as base for caching")
505506

507+
self.cache_path = cache_base_path / ".robotcode_cache"
508+
506509
self.lib_doc_cache_path = (
507-
cache_base_path
508-
/ ".robotcode_cache"
510+
self.cache_path
509511
/ f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}"
510512
/ get_robot_version_str()
511513
/ "libdoc"
@@ -534,6 +536,11 @@ def __init__(self, parent_protocol: RobotLanguageServerProtocol, folder: Uri, co
534536
def environment(self) -> Mapping[str, str]:
535537
return self._environment
536538

539+
def clear_cache(self) -> None:
540+
if self.cache_path.exists():
541+
shutil.rmtree(self.cache_path)
542+
self._logger.debug(f"Cleared cache {self.cache_path}")
543+
537544
@_logger.call
538545
async def get_command_line_variables(self) -> List[VariableDefinition]:
539546
from robot.utils.text import split_args_from_name_or_path
@@ -940,7 +947,7 @@ async def _get_libdoc() -> LibraryDoc:
940947
spec_file = Path(self.lib_doc_cache_path, meta.filepath_base.with_suffix(".spec.json"))
941948
spec_file.write_text(as_json(result), "utf-8")
942949
else:
943-
self._logger.debug(lambda: f"Skip caching library {name}{args:r}")
950+
self._logger.debug(lambda: f"Skip caching library {name}{repr(args)}")
944951
except (SystemExit, KeyboardInterrupt):
945952
raise
946953
except BaseException as e:

robotcode/language_server/robotframework/parts/documents_cache.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@
1616
cast,
1717
)
1818

19-
from robotcode.language_server.common.lsp_types import MessageType
20-
2119
from ....utils.async_tools import Lock, async_tasking_event, check_canceled_sync
2220
from ....utils.uri import Uri
2321
from ...common.decorators import language_id_filter
22+
from ...common.lsp_types import MessageType
2423
from ...common.parts.workspace import WorkspaceFolder
2524
from ...common.text_document import TextDocument
2625
from ..configuration import RobotCodeConfig, RobotConfig
@@ -435,7 +434,12 @@ async def default_imports_manager(self) -> ImportsManager:
435434
return self._default_imports_manager
436435

437436
async def get_imports_manager(self, document: TextDocument) -> ImportsManager:
438-
folder = self.parent.workspace.get_workspace_folder(document.uri)
437+
return await self.get_imports_manager_for_uri(document.uri)
438+
439+
async def get_imports_manager_for_uri(self, uri: Uri) -> ImportsManager:
440+
return await self.get_imports_manager_for_workspace_folder(self.parent.workspace.get_workspace_folder(uri))
441+
442+
async def get_imports_manager_for_workspace_folder(self, folder: Optional[WorkspaceFolder]) -> ImportsManager:
439443
if folder is None:
440444
if len(self.parent.workspace.workspace_folders) == 1:
441445
folder = self.parent.workspace.workspace_folders[0]

robotcode/language_server/robotframework/parts/robot_workspace.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import time
55
from typing import TYPE_CHECKING, Any, List, Optional
66

7+
from robotcode.jsonrpc2.protocol import rpc_method
8+
79
from ....utils.async_tools import Event, threaded
810
from ....utils.glob_path import iter_files
911
from ....utils.logging import LoggingDescriptor
@@ -149,3 +151,9 @@ async def _load_workspace_documents(self, sender: Any) -> List[WorkspaceDocument
149151
return result
150152
finally:
151153
self._logger.debug(f"Workspace loaded in {time.monotonic() - start}s")
154+
155+
@rpc_method(name="robot/cache/clear")
156+
@threaded()
157+
async def get_tests_from_workspace(self) -> None:
158+
for folder in self.parent.workspace.workspace_folders:
159+
(await self.parent.documents_cache.get_imports_manager_for_workspace_folder(folder)).clear_cache()

vscode-client/languageclientsmanger.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,20 @@ export class LanguageClientsManager {
126126
},
127127
vscode.workspace.onDidChangeWorkspaceFolders(async (_event) => this.refresh()),
128128
vscode.workspace.onDidOpenTextDocument(async (document) => this.getLanguageClientForDocument(document)),
129-
vscode.commands.registerCommand("robotcode.restartLanguageServers", async () => await this.restart())
129+
vscode.commands.registerCommand("robotcode.restartLanguageServers", async () => await this.restart()),
130+
vscode.commands.registerCommand("robotcode.clearCacheRestartLanguageServers", async () => {
131+
await this.clearCaches();
132+
await this.restart();
133+
})
130134
);
131135
}
132136

137+
public async clearCaches(): Promise<void> {
138+
for (const client of this.clients.values()) {
139+
await client.sendRequest("robot/cache/clear");
140+
}
141+
}
142+
133143
public async stopAllClients(): Promise<boolean> {
134144
const promises: Promise<void>[] = [];
135145

0 commit comments

Comments
 (0)