21
21
from robotcode .core .utils .net import find_free_port
22
22
from robotcode .jsonrpc2 .protocol import rpc_method
23
23
from robotcode .language_server .common .decorators import code_action_kinds , language_id
24
- from robotcode .language_server .common .lsp_types import CodeAction , CodeActionContext , CodeActionKind , Command , Range
24
+ from robotcode .language_server .common .lsp_types import (
25
+ CodeAction ,
26
+ CodeActionContext ,
27
+ CodeActionKind ,
28
+ Command ,
29
+ Range ,
30
+ )
25
31
from robotcode .language_server .common .text_document import TextDocument
26
- from robotcode .language_server .robotframework .configuration import DocumentationServerConfig
32
+ from robotcode .language_server .robotframework .configuration import (
33
+ DocumentationServerConfig ,
34
+ )
27
35
from robotcode .language_server .robotframework .diagnostics .library_doc import (
28
36
get_library_doc ,
29
37
get_robot_library_html_doc_str ,
30
38
resolve_robot_variables ,
31
39
)
32
- from robotcode .language_server .robotframework .diagnostics .namespace import LibraryEntry , Namespace
33
- from robotcode .language_server .robotframework .utils .ast_utils import Token , get_node_at_position , range_from_token
40
+ from robotcode .language_server .robotframework .diagnostics .namespace import (
41
+ LibraryEntry ,
42
+ Namespace ,
43
+ )
44
+ from robotcode .language_server .robotframework .utils .ast_utils import (
45
+ Token ,
46
+ get_node_at_position ,
47
+ range_from_token ,
48
+ )
34
49
35
50
from .model_helper import ModelHelperMixin
36
51
from .protocol_part import RobotLanguageServerProtocolPart
37
52
38
53
if TYPE_CHECKING :
39
- from robotcode .language_server .robotframework .protocol import RobotLanguageServerProtocol # pragma: no cover
54
+ from robotcode .language_server .robotframework .protocol import (
55
+ RobotLanguageServerProtocol ,
56
+ )
40
57
41
58
42
59
@dataclass (repr = False )
@@ -110,7 +127,9 @@ def do_GET(self) -> None: # noqa: N802
110
127
try :
111
128
if type_ in ["md" , "markdown" ]:
112
129
libdoc = get_library_doc (
113
- name , tuple (args .split ("::" ) if args else ()), base_dir = basedir if basedir else "."
130
+ name ,
131
+ tuple (args .split ("::" ) if args else ()),
132
+ base_dir = basedir if basedir else "." ,
114
133
)
115
134
116
135
def calc_md () -> str :
@@ -149,7 +168,9 @@ def calc_md() -> str:
149
168
self .wfile .write (
150
169
bytes (
151
170
HTML_ERROR_TEMPLATE .substitute (
152
- type = type (e ).__qualname__ , message = str (e ), stacktrace = "" .join (traceback .format_exc ())
171
+ type = type (e ).__qualname__ ,
172
+ message = str (e ),
173
+ stacktrace = "" .join (traceback .format_exc ()),
153
174
),
154
175
"utf-8" ,
155
176
)
@@ -167,7 +188,7 @@ def server_bind(self) -> None:
167
188
return super ().server_bind ()
168
189
169
190
170
- CODEACTIONKINDS_SOURCE_OPENDOCUMENTATION = f"{ CodeActionKind .SOURCE } .openDocumentation"
191
+ CODEACTIONKINDS_SOURCE_OPENDOCUMENTATION = f"{ CodeActionKind .SOURCE . value } .openDocumentation"
171
192
172
193
173
194
class RobotCodeActionDocumentationProtocolPart (RobotLanguageServerProtocolPart , ModelHelperMixin ):
@@ -229,7 +250,11 @@ async def _ensure_http_server_started(self) -> None:
229
250
)
230
251
@_logger .call
231
252
async def collect (
232
- self , sender : Any , document : TextDocument , range : Range , context : CodeActionContext
253
+ self ,
254
+ sender : Any ,
255
+ document : TextDocument ,
256
+ range : Range ,
257
+ context : CodeActionContext ,
233
258
) -> Optional [List [Union [Command , CodeAction ]]]:
234
259
from robot .parsing .lexer import Token as RobotToken
235
260
from robot .parsing .model .statements import (
@@ -248,9 +273,14 @@ async def collect(
248
273
node = await get_node_at_position (model , range .start )
249
274
250
275
if context .only and isinstance (node , (LibraryImport , ResourceImport )):
251
- if CodeActionKind .SOURCE in context .only and range in range_from_token (node .get_token (RobotToken .NAME )):
276
+ if CodeActionKind .SOURCE .value in context .only and range in range_from_token (
277
+ node .get_token (RobotToken .NAME )
278
+ ):
252
279
url = await self .build_url (
253
- node .name , node .args if isinstance (node , LibraryImport ) else (), document , namespace
280
+ node .name ,
281
+ node .args if isinstance (node , LibraryImport ) else (),
282
+ document ,
283
+ namespace ,
254
284
)
255
285
256
286
return [self .open_documentation_code_action (url )]
@@ -264,7 +294,10 @@ async def collect(
264
294
else node .keyword
265
295
if isinstance (node , KeywordCall )
266
296
else node .name ,
267
- cast (Token , node .get_token (RobotToken .KEYWORD if isinstance (node , KeywordCall ) else RobotToken .NAME )),
297
+ cast (
298
+ Token ,
299
+ node .get_token (RobotToken .KEYWORD if isinstance (node , KeywordCall ) else RobotToken .NAME ),
300
+ ),
268
301
[cast (Token , t ) for t in node .get_tokens (RobotToken .ARGUMENT )],
269
302
namespace ,
270
303
range .start ,
@@ -277,7 +310,7 @@ async def collect(
277
310
kw_doc , _ = result
278
311
279
312
if kw_doc is not None :
280
- if context .only and CodeActionKind .SOURCE in context .only :
313
+ if context .only and CodeActionKind .SOURCE . value in context .only :
281
314
entry : Optional [LibraryEntry ] = None
282
315
283
316
if kw_doc .libtype == "LIBRARY" :
@@ -302,19 +335,35 @@ async def collect(
302
335
303
336
self_libdoc = await namespace .get_library_doc ()
304
337
if entry is None and self_libdoc .digest == kw_doc .parent :
305
- entry = LibraryEntry (self_libdoc .name , str (document .uri .to_path ().name ), self_libdoc )
338
+ entry = LibraryEntry (
339
+ self_libdoc .name ,
340
+ str (document .uri .to_path ().name ),
341
+ self_libdoc ,
342
+ )
306
343
307
344
if entry is None :
308
345
return None
309
346
310
- url = await self .build_url (entry .import_name , entry .args , document , namespace , kw_doc .name )
347
+ url = await self .build_url (
348
+ entry .import_name ,
349
+ entry .args ,
350
+ document ,
351
+ namespace ,
352
+ kw_doc .name ,
353
+ )
311
354
312
355
return [self .open_documentation_code_action (url )]
313
356
314
357
if isinstance (node , KeywordName ):
315
358
name_token = node .get_token (RobotToken .KEYWORD_NAME )
316
359
if name_token is not None and range in range_from_token (name_token ):
317
- url = await self .build_url (str (document .uri .to_path ().name ), (), document , namespace , name_token .value )
360
+ url = await self .build_url (
361
+ str (document .uri .to_path ().name ),
362
+ (),
363
+ document ,
364
+ namespace ,
365
+ name_token .value ,
366
+ )
318
367
319
368
return [self .open_documentation_code_action (url )]
320
369
@@ -366,7 +415,14 @@ async def build_url(
366
415
url_args = "::" .join (args ) if args else ""
367
416
368
417
base_url = f"http://localhost:{ self ._documentation_server_port } "
369
- params = urllib .parse .urlencode ({"name" : name , "args" : url_args , "basedir" : str (base_dir ), "theme" : "${theme}" })
418
+ params = urllib .parse .urlencode (
419
+ {
420
+ "name" : name ,
421
+ "args" : url_args ,
422
+ "basedir" : str (base_dir ),
423
+ "theme" : "${theme}" ,
424
+ }
425
+ )
370
426
371
427
return f"{ base_url } /?&{ params } { f'#{ target } ' if target else '' } "
372
428
0 commit comments