Skip to content

Commit b76eb0f

Browse files
committed
refactor(langserver): remove HasExtendCapabilities protocol and implement the method directly, extend threaded decorator
1 parent 2fae8e3 commit b76eb0f

30 files changed

+98
-130
lines changed

packages/core/src/robotcode/core/utils/threading.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import inspect
22
from concurrent.futures import CancelledError, Future
33
from threading import Thread, current_thread, local
4-
from typing import Any, Callable, Dict, Generic, Optional, Tuple, TypeVar, cast
4+
from typing import Any, Callable, Dict, Generic, Optional, Tuple, TypeVar, cast, overload
55

66
_F = TypeVar("_F", bound=Callable[..., Any])
77
_TResult = TypeVar("_TResult")
@@ -22,11 +22,24 @@ def result(self, timeout: Optional[float] = None) -> _TResult:
2222
return cast(_TResult, super().result(timeout))
2323

2424

25-
def threaded(enabled: bool = True) -> Callable[[_F], _F]:
25+
@overload
26+
def threaded(__func: _F) -> _F:
27+
...
28+
29+
30+
@overload
31+
def threaded(*, enabled: bool = True) -> Callable[[_F], _F]:
32+
...
33+
34+
35+
def threaded(__func: _F = None, *, enabled: bool = True) -> Callable[[_F], _F]:
2636
def decorator(func: _F) -> _F:
2737
setattr(func, __THREADED_MARKER, enabled)
2838
return func
2939

40+
if __func is not None:
41+
return decorator(__func)
42+
3043
return decorator
3144

3245

packages/language_server/src/robotcode/language_server/common/has_extend_capabilities.py

Lines changed: 0 additions & 11 deletions
This file was deleted.

packages/language_server/src/robotcode/language_server/common/parts/code_action.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@
1919
from robotcode.core.utils.threading import threaded
2020
from robotcode.jsonrpc2.protocol import rpc_method
2121
from robotcode.language_server.common.decorators import CODE_ACTION_KINDS_ATTR, HasCodeActionKinds, language_id_filter
22-
from robotcode.language_server.common.has_extend_capabilities import HasExtendCapabilities
2322
from robotcode.language_server.common.parts.protocol_part import LanguageServerProtocolPart
2423
from robotcode.language_server.common.text_document import TextDocument
2524

2625
if TYPE_CHECKING:
2726
from robotcode.language_server.common.protocol import LanguageServerProtocol
2827

2928

30-
class CodeActionProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
29+
class CodeActionProtocolPart(LanguageServerProtocolPart):
3130
_logger: Final = LoggingDescriptor()
3231

3332
def __init__(self, parent: LanguageServerProtocol) -> None:
@@ -61,7 +60,7 @@ def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
6160
)
6261

6362
@rpc_method(name="textDocument/codeAction", param_type=CodeActionParams)
64-
@threaded()
63+
@threaded
6564
async def _text_document_code_action(
6665
self,
6766
text_document: TextDocumentIdentifier,
@@ -102,7 +101,7 @@ async def _text_document_code_action(
102101
return results
103102

104103
@rpc_method(name="codeAction/resolve", param_type=CodeAction)
105-
@threaded()
104+
@threaded
106105
async def _text_document_code_action_resolve(
107106
self,
108107
params: CodeAction,

packages/language_server/src/robotcode/language_server/common/parts/code_lens.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from robotcode.core.utils.threading import threaded
1717
from robotcode.jsonrpc2.protocol import rpc_method
1818
from robotcode.language_server.common.decorators import language_id_filter
19-
from robotcode.language_server.common.has_extend_capabilities import HasExtendCapabilities
2019
from robotcode.language_server.common.text_document import TextDocument
2120

2221
from .protocol_part import LanguageServerProtocolPart
@@ -25,7 +24,7 @@
2524
from robotcode.language_server.common.protocol import LanguageServerProtocol
2625

2726

28-
class CodeLensProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
27+
class CodeLensProtocolPart(LanguageServerProtocolPart):
2928
_logger: Final = LoggingDescriptor()
3029

3130
def __init__(self, parent: LanguageServerProtocol) -> None:
@@ -45,7 +44,7 @@ def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
4544
capabilities.code_lens_provider = CodeLensOptions(resolve_provider=True if len(self.resolve) > 0 else None)
4645

4746
@rpc_method(name="textDocument/codeLens", param_type=CodeLensParams)
48-
@threaded()
47+
@threaded
4948
async def _text_document_code_lens(
5049
self, text_document: TextDocumentIdentifier, *args: Any, **kwargs: Any
5150
) -> Optional[List[CodeLens]]:
@@ -71,7 +70,7 @@ async def _text_document_code_lens(
7170
return results
7271

7372
@rpc_method(name="codeLens/resolve", param_type=CodeLens)
74-
@threaded()
73+
@threaded
7574
async def _code_lens_resolve(self, params: CodeLens, *args: Any, **kwargs: Any) -> CodeLens:
7675
results: List[CodeLens] = []
7776

packages/language_server/src/robotcode/language_server/common/parts/commands.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from robotcode.core.utils.threading import threaded
1919
from robotcode.jsonrpc2.protocol import JsonRPCErrorException, rpc_method
2020
from robotcode.language_server.common.decorators import get_command_id, is_command
21-
from robotcode.language_server.common.has_extend_capabilities import HasExtendCapabilities
2221
from robotcode.language_server.common.parts.protocol_part import LanguageServerProtocolPart
2322

2423
if TYPE_CHECKING:
@@ -34,7 +33,7 @@ class CommandEntry:
3433
callback: _FUNC_TYPE
3534

3635

37-
class CommandsProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
36+
class CommandsProtocolPart(LanguageServerProtocolPart):
3837
_logger: Final = LoggingDescriptor()
3938

4039
PREFIX: Final = f"{uuid.uuid4()}"
@@ -72,7 +71,7 @@ def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
7271
capabilities.execute_command_provider = ExecuteCommandOptions(list(self.commands.keys()))
7372

7473
@rpc_method(name="workspace/executeCommand", param_type=ExecuteCommandParams)
75-
@threaded()
74+
@threaded
7675
async def _workspace_execute_command(
7776
self, command: str, arguments: Optional[List[LSPAny]], *args: Any, **kwargs: Any
7877
) -> Optional[LSPAny]:

packages/language_server/src/robotcode/language_server/common/parts/completion.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,14 @@
3030
HasTriggerCharacters,
3131
language_id_filter,
3232
)
33-
from robotcode.language_server.common.has_extend_capabilities import HasExtendCapabilities
3433
from robotcode.language_server.common.parts.protocol_part import LanguageServerProtocolPart
3534
from robotcode.language_server.common.text_document import TextDocument
3635

3736
if TYPE_CHECKING:
3837
from robotcode.language_server.common.protocol import LanguageServerProtocol
3938

4039

41-
class CompletionProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
40+
class CompletionProtocolPart(LanguageServerProtocolPart):
4241
_logger: Final = LoggingDescriptor()
4342

4443
def __init__(self, parent: LanguageServerProtocol) -> None:
@@ -84,7 +83,7 @@ def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
8483
)
8584

8685
@rpc_method(name="textDocument/completion", param_type=CompletionParams)
87-
@threaded()
86+
@threaded
8887
async def _text_document_completion(
8988
self,
9089
text_document: TextDocumentIdentifier,
@@ -155,7 +154,7 @@ def update_completion_item_to_utf16(self, document: TextDocument, item: Completi
155154
item.text_edit.replace = document.range_to_utf16(item.text_edit.replace)
156155

157156
@rpc_method(name="completionItem/resolve", param_type=CompletionItem)
158-
@threaded()
157+
@threaded
159158
async def _completion_item_resolve(
160159
self,
161160
params: CompletionItem,

packages/language_server/src/robotcode/language_server/common/parts/declaration.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from asyncio import CancelledError
44
from typing import TYPE_CHECKING, Any, Final, List, Optional, Union
55

6-
from robotcode.core.async_tools import async_tasking_event
6+
from robotcode.core.event import event
77
from robotcode.core.lsp.types import (
88
DeclarationParams,
99
Location,
@@ -13,28 +13,25 @@
1313
TextDocumentIdentifier,
1414
)
1515
from robotcode.core.utils.logging import LoggingDescriptor
16-
from robotcode.core.utils.threading import threaded
16+
from robotcode.core.utils.threading import check_thread_canceled, threaded
1717
from robotcode.jsonrpc2.protocol import rpc_method
1818
from robotcode.language_server.common.decorators import language_id_filter
19-
from robotcode.language_server.common.has_extend_capabilities import (
20-
HasExtendCapabilities,
21-
)
2219
from robotcode.language_server.common.parts.protocol_part import LanguageServerProtocolPart
2320
from robotcode.language_server.common.text_document import TextDocument
2421

2522
if TYPE_CHECKING:
2623
from robotcode.language_server.common.protocol import LanguageServerProtocol
2724

2825

29-
class DeclarationProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
26+
class DeclarationProtocolPart(LanguageServerProtocolPart):
3027
_logger: Final = LoggingDescriptor()
3128

3229
def __init__(self, parent: LanguageServerProtocol) -> None:
3330
super().__init__(parent)
3431
self.link_support = False
3532

36-
@async_tasking_event
37-
async def collect(
33+
@event
34+
def collect(
3835
sender, document: TextDocument, position: Position # NOSONAR
3936
) -> Union[Location, List[Location], List[LocationLink], None]:
4037
...
@@ -51,8 +48,8 @@ def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
5148
capabilities.declaration_provider = True
5249

5350
@rpc_method(name="textDocument/declaration", param_type=DeclarationParams)
54-
@threaded()
55-
async def _text_document_declaration(
51+
@threaded
52+
def _text_document_declaration(
5653
self,
5754
text_document: TextDocumentIdentifier,
5855
position: Position,
@@ -66,7 +63,9 @@ async def _text_document_declaration(
6663
if document is None:
6764
return None
6865

69-
for result in await self.collect(self, document, position, callback_filter=language_id_filter(document)):
66+
for result in self.collect(self, document, position, callback_filter=language_id_filter(document)):
67+
check_thread_canceled()
68+
7069
if isinstance(result, BaseException):
7170
if not isinstance(result, CancelledError):
7271
self._logger.exception(result, exc_info=result)

packages/language_server/src/robotcode/language_server/common/parts/definition.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616
from robotcode.core.utils.threading import check_thread_canceled, threaded
1717
from robotcode.jsonrpc2.protocol import rpc_method
1818
from robotcode.language_server.common.decorators import language_id_filter
19-
from robotcode.language_server.common.has_extend_capabilities import HasExtendCapabilities
2019
from robotcode.language_server.common.parts.protocol_part import LanguageServerProtocolPart
2120
from robotcode.language_server.common.text_document import TextDocument
2221

2322
if TYPE_CHECKING:
2423
from robotcode.language_server.common.protocol import LanguageServerProtocol
2524

2625

27-
class DefinitionProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
26+
class DefinitionProtocolPart(LanguageServerProtocolPart):
2827
_logger: Final = LoggingDescriptor()
2928

3029
def __init__(self, parent: LanguageServerProtocol) -> None:
@@ -49,7 +48,7 @@ def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
4948
capabilities.definition_provider = True
5049

5150
@rpc_method(name="textDocument/definition", param_type=DefinitionParams)
52-
@threaded()
51+
@threaded
5352
def _text_document_definition(
5453
self, text_document: TextDocumentIdentifier, position: Position, *args: Any, **kwargs: Any
5554
) -> Optional[Union[Location, List[Location], List[LocationLink]]]:

packages/language_server/src/robotcode/language_server/common/parts/diagnostics.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
from robotcode.core.utils.threading import threaded
3939
from robotcode.jsonrpc2.protocol import JsonRPCErrorException, rpc_method
4040
from robotcode.language_server.common.decorators import language_id_filter
41-
from robotcode.language_server.common.has_extend_capabilities import HasExtendCapabilities
4241
from robotcode.language_server.common.parts.protocol_part import LanguageServerProtocolPart
4342
from robotcode.language_server.common.text_document import TextDocument
4443

@@ -107,7 +106,7 @@ def _cancel_all_tasks(loop: asyncio.AbstractEventLoop) -> None:
107106
)
108107

109108

110-
class DiagnosticsProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
109+
class DiagnosticsProtocolPart(LanguageServerProtocolPart):
111110
_logger: Final = LoggingDescriptor()
112111

113112
def __init__(self, protocol: LanguageServerProtocol) -> None:
@@ -279,7 +278,7 @@ async def force_refresh_document(self, document: TextDocument, refresh: bool = T
279278
await self.refresh()
280279

281280
@_logger.call
282-
@threaded()
281+
@threaded
283282
def on_did_close(self, sender: Any, document: TextDocument) -> None:
284283
create_sub_task(self._close_diagnostics_for_document(document), loop=self.diagnostics_loop)
285284

@@ -500,7 +499,7 @@ def update_document_diagnostics(self, sender: Any, document: TextDocument) -> No
500499
self.create_document_diagnostics_task(document, True)
501500

502501
@rpc_method(name="textDocument/diagnostic", param_type=DocumentDiagnosticParams)
503-
@threaded()
502+
@threaded
504503
async def _text_document_diagnostic(
505504
self,
506505
text_document: TextDocumentIdentifier,
@@ -536,7 +535,7 @@ def get_diagnostics_data(self, document: TextDocument) -> DiagnosticsData:
536535
return data
537536

538537
@rpc_method(name="workspace/diagnostic", param_type=WorkspaceDiagnosticParams)
539-
@threaded()
538+
@threaded
540539
async def _workspace_diagnostic(
541540
self,
542541
identifier: Optional[str],

packages/language_server/src/robotcode/language_server/common/parts/document_highlight.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616
from robotcode.core.utils.threading import threaded
1717
from robotcode.jsonrpc2.protocol import rpc_method
1818
from robotcode.language_server.common.decorators import language_id_filter
19-
from robotcode.language_server.common.has_extend_capabilities import HasExtendCapabilities
2019
from robotcode.language_server.common.parts.protocol_part import LanguageServerProtocolPart
2120
from robotcode.language_server.common.text_document import TextDocument
2221

2322
if TYPE_CHECKING:
2423
from robotcode.language_server.common.protocol import LanguageServerProtocol
2524

2625

27-
class DocumentHighlightProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
26+
class DocumentHighlightProtocolPart(LanguageServerProtocolPart):
2827
_logger: Final = LoggingDescriptor()
2928

3029
def __init__(self, parent: LanguageServerProtocol) -> None:
@@ -41,7 +40,7 @@ async def collect(
4140
...
4241

4342
@rpc_method(name="textDocument/documentHighlight", param_type=DocumentHighlightParams)
44-
@threaded()
43+
@threaded
4544
async def _text_document_document_highlight(
4645
self,
4746
text_document: TextDocumentIdentifier,

0 commit comments

Comments
 (0)