Skip to content

Commit 0e27215

Browse files
committed
implement common linked editing ranges support
1 parent 620621e commit 0e27215

File tree

4 files changed

+98
-4
lines changed

4 files changed

+98
-4
lines changed

robotcode/language_server/common/lsp_types.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -941,6 +941,18 @@ class DocumentHighlightRegistrationOptions(TextDocumentRegistrationOptions, Docu
941941
pass
942942

943943

944+
@dataclass(repr=False)
945+
class LinkedEditingRangeOptions(WorkDoneProgressOptions):
946+
pass
947+
948+
949+
@dataclass(repr=False)
950+
class LinkedEditingRangeRegistrationOptions(
951+
TextDocumentRegistrationOptions, LinkedEditingRangeOptions, StaticRegistrationOptions
952+
):
953+
pass
954+
955+
944956
@dataclass(repr=False)
945957
class ServerCapabilities(Model):
946958
text_document_sync: Union[TextDocumentSyncOptions, TextDocumentSyncKind, None] = None
@@ -964,9 +976,9 @@ class ServerCapabilities(Model):
964976
folding_range_provider: Union[bool, FoldingRangeOptions, FoldingRangeRegistrationOptions, None] = None
965977
execute_command_provider: Optional[ExecuteCommandOptions] = None
966978
# TODO selection_range_provider: Union[bool, SelectionRangeOptions, SelectionRangeRegistrationOptions, None] = None
967-
# TODO linked_editing_range_provider: Union[
968-
# boolean, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions, None
969-
# ] = None
979+
linked_editing_range_provider: Union[
980+
bool, LinkedEditingRangeOptions, LinkedEditingRangeRegistrationOptions, None
981+
] = None
970982
# TODO call_hierarchy_provider: Union[boolean, CallHierarchyOptions, CallHierarchyRegistrationOptions, None] = None
971983
semantic_tokens_provider: Union[SemanticTokensOptions, SemanticTokensRegistrationOptions, None] = None
972984
# TODO moniker_provider: Union[bool, MonikerOptions, MonikerRegistrationOptions, None] = None
@@ -1877,3 +1889,14 @@ class DocumentHighlightKind(Enum):
18771889
class DocumentHighlight(Model):
18781890
range: Range
18791891
kind: Optional[DocumentHighlightKind] = None
1892+
1893+
1894+
@dataclass(repr=False)
1895+
class LinkedEditingRangeParams(WorkDoneProgressParams, TextDocumentPositionParams):
1896+
pass
1897+
1898+
1899+
@dataclass(repr=False)
1900+
class LinkedEditingRanges(Model):
1901+
ranges: List[Range]
1902+
word_pattern: Optional[str] = None
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from __future__ import annotations
2+
3+
from asyncio import CancelledError
4+
from typing import TYPE_CHECKING, Any, List, Optional
5+
6+
from ....jsonrpc2.protocol import rpc_method
7+
from ....utils.async_tools import async_tasking_event
8+
from ....utils.logging import LoggingDescriptor
9+
from ..decorators import language_id_filter
10+
from ..has_extend_capabilities import HasExtendCapabilities
11+
from ..lsp_types import (
12+
LinkedEditingRangeOptions,
13+
LinkedEditingRangeParams,
14+
LinkedEditingRanges,
15+
Position,
16+
Range,
17+
ServerCapabilities,
18+
TextDocumentIdentifier,
19+
)
20+
from ..text_document import TextDocument
21+
22+
if TYPE_CHECKING:
23+
from ..protocol import LanguageServerProtocol
24+
25+
from .protocol_part import LanguageServerProtocolPart
26+
27+
28+
class LinkedEditingRangeProtocolPart(LanguageServerProtocolPart, HasExtendCapabilities):
29+
30+
_logger = LoggingDescriptor()
31+
32+
def __init__(self, parent: LanguageServerProtocol) -> None:
33+
super().__init__(parent)
34+
35+
def extend_capabilities(self, capabilities: ServerCapabilities) -> None:
36+
if len(self.collect):
37+
capabilities.linked_editing_range_provider = LinkedEditingRangeOptions(work_done_progress=True)
38+
39+
@async_tasking_event
40+
async def collect(sender, document: TextDocument, position: Position) -> Optional[LinkedEditingRanges]: # NOSONAR
41+
...
42+
43+
@rpc_method(name="textDocument/linkedEditingRange", param_type=LinkedEditingRangeParams)
44+
async def _text_document_linked_editing_range(
45+
self,
46+
text_document: TextDocumentIdentifier,
47+
position: Position,
48+
*args: Any,
49+
**kwargs: Any,
50+
) -> Optional[LinkedEditingRanges]:
51+
52+
linked_ranges: List[Range] = []
53+
word_pattern: Optional[str] = None
54+
55+
document = await self.parent.documents.get(text_document.uri)
56+
if document is None:
57+
return None
58+
59+
for result in await self.collect(self, document, position, callback_filter=language_id_filter(document)):
60+
if isinstance(result, BaseException):
61+
if not isinstance(result, CancelledError):
62+
self._logger.exception(result, exc_info=result)
63+
else:
64+
if result is not None:
65+
linked_ranges.extend(result.ranges)
66+
if result.word_pattern is not None:
67+
word_pattern = result.word_pattern
68+
69+
return LinkedEditingRanges(linked_ranges, word_pattern)

robotcode/language_server/common/protocol.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
from .parts.formatting import FormattingProtocolPart
4949
from .parts.hover import HoverProtocolPart
5050
from .parts.implementation import ImplementationProtocolPart
51+
from .parts.linked_editing_ranges import LinkedEditingRangeProtocolPart
5152
from .parts.references import ReferencesProtocolPart
5253
from .parts.semantic_tokens import SemanticTokensProtocolPart
5354
from .parts.signature_help import SignatureHelpProtocolPart
@@ -81,6 +82,7 @@ class LanguageServerProtocol(JsonRPCProtocol):
8182
semantic_tokens = ProtocolPartDescriptor(SemanticTokensProtocolPart)
8283
references = ProtocolPartDescriptor(ReferencesProtocolPart)
8384
document_highlight = ProtocolPartDescriptor(DocumentHighlightProtocolPart)
85+
linked_editing_range = ProtocolPartDescriptor(LinkedEditingRangeProtocolPart)
8486

8587
name: Optional[str] = None
8688
version: Optional[str] = None

robotcode/language_server/robotframework/protocol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class RobotLanguageServerProtocol(LanguageServerProtocol):
8787
robot_workspace = ProtocolPartDescriptor(RobotWorkspaceProtocolPart)
8888

8989
robot_discovering = ProtocolPartDescriptor(DiscoveringProtocolPart)
90-
robot_debuggin_utils = ProtocolPartDescriptor(RobotDebuggingUtilsProtocolPart)
90+
robot_debugging_utils = ProtocolPartDescriptor(RobotDebuggingUtilsProtocolPart)
9191

9292
name = "RobotCode"
9393
version = __version__

0 commit comments

Comments
 (0)