1212 Awaitable ,
1313 Callable ,
1414 Dict ,
15+ Iterable ,
1516 Iterator ,
1617 List ,
1718 Optional ,
4748 KeywordDoc ,
4849 KeywordMatcher ,
4950)
50- from ..diagnostics .namespace import Namespace
51+ from ..diagnostics .namespace import DocumentType , Namespace
5152from ..utils .ast_utils import (
5253 HasTokens ,
5354 Token ,
6667
6768from .protocol_part import RobotLanguageServerProtocolPart
6869
70+ DEFAULT_SECTIONS_STYLE = "*** {name}s ***"
71+ DEFAULT_SECTIONS_STYLE_NEW = "*** {name} ***"
72+
6973
7074class RobotCompletionProtocolPart (RobotLanguageServerProtocolPart ):
7175 _logger = LoggingDescriptor ()
@@ -79,9 +83,10 @@ def __init__(self, parent: RobotLanguageServerProtocol) -> None:
7983 async def get_section_style (self , document : TextDocument ) -> str :
8084 if (folder := self .parent .workspace .get_workspace_folder (document .uri )) is not None :
8185 config = await self .parent .workspace .get_configuration (SyntaxConfig , folder .uri )
82- return config .section_style or DEFAULT_SECTIONS_STYLE
86+ if config .section_style is not None :
87+ return config .section_style
8388
84- return DEFAULT_SECTIONS_STYLE
89+ return DEFAULT_SECTIONS_STYLE if get_robot_version () < ( 5 , 1 ) else DEFAULT_SECTIONS_STYLE_NEW
8590
8691 @language_id ("robotframework" )
8792 @trigger_characters (
@@ -143,9 +148,8 @@ async def resolve(self, sender: Any, completion_item: CompletionItem) -> Complet
143148]
144149
145150SECTIONS = ["Test Case" , "Setting" , "Variable" , "Keyword" , "Comment" , "Task" ]
146- DEFAULT_SECTIONS_STYLE = "*** {name}s ***"
147151
148- SETTINGS = [
152+ SUITE_SETTINGS = [
149153 "Documentation" ,
150154 "Metadata" ,
151155 "Suite Setup" ,
@@ -165,6 +169,7 @@ async def resolve(self, sender: Any, completion_item: CompletionItem) -> Complet
165169 "Task Timeout" ,
166170]
167171
172+
168173TESTCASE_SETTINGS = ["Documentation" , "Tags" , "Setup" , "Teardown" , "Template" , "Timeout" ]
169174KEYWORD_SETTINGS = ["Documentation" , "Tags" , "Arguments" , "Return" , "Teardown" , "Timeout" ]
170175
@@ -345,12 +350,21 @@ async def resolve(self, completion_item: CompletionItem) -> CompletionItem:
345350
346351 return completion_item
347352
348- async def create_section_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
353+ async def create_headers_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
354+ if self .namespace .languages is None :
355+ headers : Iterable [str ] = SECTIONS
356+ else :
357+ headers = self .namespace .languages .headers .keys ()
358+
349359 return [
350360 CompletionItem (
351361 label = s [0 ],
352362 kind = CompletionItemKind .CLASS ,
353363 detail = "Section" ,
364+ # this is to get the english version in the documentation
365+ documentation = self .namespace .languages .headers .get (s [1 ])
366+ if self .namespace .languages is not None
367+ else None ,
354368 sort_text = f"100_{ s [1 ]} " ,
355369 insert_text_format = InsertTextFormat .PLAINTEXT ,
356370 text_edit = TextEdit (
@@ -360,7 +374,7 @@ async def create_section_completion_items(self, range: Optional[Range]) -> List[
360374 if range is not None
361375 else None ,
362376 )
363- for s in ((self .section_style .format (name = k ), k ) for k in SECTIONS )
377+ for s in ((self .section_style .format (name = k ), k ) for k in headers )
364378 ]
365379
366380 async def create_environment_variables_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
@@ -415,6 +429,25 @@ async def create_variables_completion_items(
415429 ]
416430
417431 async def create_settings_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
432+ from robot .parsing .lexer .settings import (
433+ InitFileSettings ,
434+ ResourceFileSettings ,
435+ TestCaseFileSettings ,
436+ )
437+
438+ doc_type = await self .parent .documents_cache .get_document_type (self .document )
439+
440+ settings_class = TestCaseFileSettings
441+ if doc_type == DocumentType .RESOURCE :
442+ settings_class = ResourceFileSettings
443+ elif doc_type == DocumentType .INIT :
444+ settings_class = InitFileSettings
445+
446+ settings = {* settings_class .names , * settings_class .aliases .keys ()}
447+
448+ if self .namespace .languages is not None :
449+ settings = {k for k , v in self .namespace .languages .settings .items () if v in settings }
450+
418451 return [
419452 CompletionItem (
420453 label = setting ,
@@ -424,7 +457,7 @@ async def create_settings_completion_items(self, range: Optional[Range]) -> List
424457 insert_text_format = InsertTextFormat .PLAINTEXT ,
425458 text_edit = TextEdit (range = range , new_text = setting ) if range is not None else None ,
426459 )
427- for setting in SETTINGS
460+ for setting in settings
428461 ]
429462
430463 async def create_keyword_snippet_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
@@ -442,6 +475,13 @@ async def create_keyword_snippet_completion_items(self, range: Optional[Range])
442475 ]
443476
444477 async def create_testcase_settings_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
478+ from robot .parsing .lexer .settings import TestCaseSettings
479+
480+ settings = {* TestCaseSettings .names , * TestCaseSettings .aliases .keys ()}
481+
482+ if self .namespace .languages is not None :
483+ settings = {k for k , v in self .namespace .languages .settings .items () if v in settings }
484+
445485 return [
446486 CompletionItem (
447487 label = f"[{ setting } ]" ,
@@ -451,10 +491,17 @@ async def create_testcase_settings_completion_items(self, range: Optional[Range]
451491 insert_text_format = InsertTextFormat .PLAINTEXT ,
452492 text_edit = TextEdit (range = range , new_text = f"[{ setting } ]" ) if range is not None else None ,
453493 )
454- for setting in TESTCASE_SETTINGS
494+ for setting in settings
455495 ]
456496
457497 async def create_keyword_settings_completion_items (self , range : Optional [Range ]) -> List [CompletionItem ]:
498+ from robot .parsing .lexer .settings import KeywordSettings
499+
500+ settings = {* KeywordSettings .names , * KeywordSettings .aliases .keys ()}
501+
502+ if self .namespace .languages is not None :
503+ settings = {k for k , v in self .namespace .languages .settings .items () if v in settings }
504+
458505 return [
459506 CompletionItem (
460507 label = f"[{ setting } ]" ,
@@ -464,7 +511,7 @@ async def create_keyword_settings_completion_items(self, range: Optional[Range])
464511 insert_text_format = InsertTextFormat .PLAINTEXT ,
465512 text_edit = TextEdit (range = range , new_text = f"[{ setting } ]" ) if range is not None else None ,
466513 )
467- for setting in KEYWORD_SETTINGS
514+ for setting in settings
468515 ]
469516
470517 def get_keyword_snipped_text (self , kw : KeywordDoc , in_template : bool ) -> str :
@@ -739,18 +786,18 @@ async def complete_default(
739786 and (position .is_in_range (r ))
740787 and (only_stars or value .startswith ("*" ) or position .character == 0 )
741788 ):
742- return await self .create_section_completion_items (r )
789+ return await self .create_headers_completion_items (r )
743790 elif len (statement_node .tokens ) > 1 and only_stars :
744791 r1 = range_from_token (statement_node .tokens [1 ])
745792 ws = whitespace_at_begin_of_token (statement_node .tokens [1 ])
746793 if ws > 0 :
747794 r1 .end .character = r1 .start .character + ws
748795 if position .is_in_range (r1 ):
749796 r .end = r1 .end
750- return await self .create_section_completion_items (r )
797+ return await self .create_headers_completion_items (r )
751798
752799 elif position .character == 0 :
753- return await self .create_section_completion_items (None )
800+ return await self .create_headers_completion_items (None )
754801
755802 if len (nodes_at_position ) > 1 and isinstance (nodes_at_position [0 ], HasTokens ):
756803 node = nodes_at_position [0 ]
@@ -1261,6 +1308,10 @@ async def complete_LibraryImport( # noqa: N802
12611308 import_token = import_node .get_token (RobotToken .LIBRARY )
12621309 if import_token is None :
12631310 return []
1311+
1312+ if position .is_in_range (range_from_token (import_token )):
1313+ return []
1314+
12641315 import_token_index = import_node .tokens .index (import_token )
12651316
12661317 async def complete_import () -> Optional [List [CompletionItem ]]:
@@ -1507,6 +1558,10 @@ async def complete_ResourceImport( # noqa: N802
15071558 import_token = import_node .get_token (Token .RESOURCE )
15081559 if import_token is None :
15091560 return []
1561+
1562+ if position .is_in_range (range_from_token (import_token )):
1563+ return []
1564+
15101565 import_token_index = import_node .tokens .index (import_token )
15111566
15121567 if len (import_node .tokens ) > import_token_index + 2 :
@@ -1606,8 +1661,13 @@ async def complete_VariablesImport( # noqa: N802
16061661
16071662 import_node = cast (VariablesImport , node )
16081663 import_token = import_node .get_token (Token .VARIABLES )
1664+
16091665 if import_token is None :
16101666 return []
1667+
1668+ if position .is_in_range (range_from_token (import_token )):
1669+ return []
1670+
16111671 import_token_index = import_node .tokens .index (import_token )
16121672
16131673 if len (import_node .tokens ) > import_token_index + 2 :
0 commit comments