Skip to content

Commit 951e9c9

Browse files
committed
Enhance completion for RF 5.1
1 parent 598dc9a commit 951e9c9

File tree

3 files changed

+76
-16
lines changed

3 files changed

+76
-16
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,8 @@
416416
},
417417
"robotcode.syntax.sectionStyle": {
418418
"type": "string",
419-
"default": "*** {name}s ***",
420-
"description": "Defines the section style format.",
419+
"default": null,
420+
"description": "Defines the section style format. If not defined ```*** section ***``` is used.",
421421
"scope": "resource"
422422
},
423423
"robotcode.run.openReportAfterRun": {

robotcode/language_server/robotframework/configuration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def get_rpa_mode(self) -> Optional[bool]:
4848
@config_section("robotcode.syntax")
4949
@dataclass
5050
class SyntaxConfig(ConfigBase):
51-
section_style: str = "*** {name}s ***"
51+
section_style: Optional[str] = None
5252

5353

5454
@config_section("robotcode.robocop")

robotcode/language_server/robotframework/parts/completion.py

Lines changed: 73 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
Awaitable,
1313
Callable,
1414
Dict,
15+
Iterable,
1516
Iterator,
1617
List,
1718
Optional,
@@ -47,7 +48,7 @@
4748
KeywordDoc,
4849
KeywordMatcher,
4950
)
50-
from ..diagnostics.namespace import Namespace
51+
from ..diagnostics.namespace import DocumentType, Namespace
5152
from ..utils.ast_utils import (
5253
HasTokens,
5354
Token,
@@ -66,6 +67,9 @@
6667

6768
from .protocol_part import RobotLanguageServerProtocolPart
6869

70+
DEFAULT_SECTIONS_STYLE = "*** {name}s ***"
71+
DEFAULT_SECTIONS_STYLE_NEW = "*** {name} ***"
72+
6973

7074
class 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

145150
SECTIONS = ["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+
168173
TESTCASE_SETTINGS = ["Documentation", "Tags", "Setup", "Teardown", "Template", "Timeout"]
169174
KEYWORD_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

Comments
 (0)