11import uuid
2- from typing import List , Optional
2+ from typing import Any , Dict , List , Optional
3+
4+ from robotcode .jsonrpc2 .protocol import rpc_method
35
46from ..lsp_types import (
57 URI ,
@@ -54,6 +56,8 @@ async def show_document(
5456 )
5557 ).success
5658
59+ __progress_tokens : Dict [ProgressToken , bool ] = {}
60+
5761 async def create_progress (self ) -> Optional [ProgressToken ]:
5862
5963 if (
@@ -63,10 +67,28 @@ async def create_progress(self) -> Optional[ProgressToken]:
6367 ):
6468 token = str (uuid .uuid4 ())
6569 await self .parent .send_request_async ("window/workDoneProgress/create" , WorkDoneProgressCreateParams (token ))
70+ self .__progress_tokens [token ] = False
6671 return token
6772
6873 return None
6974
75+ @rpc_method (name = "window/workDoneProgress/cancel" , param_type = WorkDoneProgressCancelParams )
76+ async def _window_work_done_progress_cancel (
77+ self ,
78+ token : ProgressToken ,
79+ * args : Any ,
80+ ** kwargs : Any ,
81+ ) -> None :
82+
83+ if token in self .__progress_tokens :
84+ self .__progress_tokens [token ] = True
85+
86+ def progress_is_canceled (self , token : Optional [ProgressToken ]) -> bool :
87+ if token is None :
88+ return False
89+
90+ return token in self .__progress_tokens and self .__progress_tokens .get (token , False )
91+
7092 def progress_cancel (self , token : Optional [ProgressToken ]) -> None :
7193 if (
7294 token is not None
@@ -104,7 +126,10 @@ def progress_begin(
104126 self ._progress (
105127 token ,
106128 WorkDoneProgressBegin (
107- title or self .parent .name or self ._default_title , message , percentage , cancellable
129+ title or self .parent .short_name or self .parent .name or self ._default_title ,
130+ message ,
131+ percentage ,
132+ cancellable ,
108133 ),
109134 )
110135
@@ -125,7 +150,10 @@ def progress_report(
125150 self ._progress (
126151 token ,
127152 WorkDoneProgressReport (
128- title or self .parent .name or self ._default_title , message , percentage , cancellable
153+ title or self .parent .short_name or self .parent .name or self ._default_title ,
154+ message ,
155+ percentage ,
156+ cancellable ,
129157 ),
130158 )
131159
@@ -140,4 +168,8 @@ def progress_end(
140168 and self .parent .client_capabilities .window
141169 and self .parent .client_capabilities .window .work_done_progress
142170 ):
143- self ._progress (token , WorkDoneProgressEnd (message ))
171+ try :
172+ self ._progress (token , WorkDoneProgressEnd (message ))
173+ finally :
174+ if token in self .__progress_tokens :
175+ self .__progress_tokens .pop (token )
0 commit comments