Skip to content

Commit f4b0cfa

Browse files
committed
Parse and analyze "run keywords" with arguments using upper case AND. close #14
1 parent cce9bdc commit f4b0cfa

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

robotcode/language_server/robotframework/diagnostics/namespace.py

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
Token,
4040
is_non_variable_token,
4141
range_from_node,
42+
range_from_token,
4243
range_from_token_or_node,
4344
tokenize_variables,
4445
)
@@ -610,9 +611,32 @@ async def _analyse_run_keyword(
610611
await self._analyze_keyword_call(argument_tokens[1].value, node, argument_tokens[1], argument_tokens[2:])
611612
return argument_tokens[2:]
612613
elif keyword_doc.is_run_keywords():
613-
for t in argument_tokens:
614-
if is_non_variable_token(t):
615-
await self._analyze_keyword_call(t.value, node, t, [])
614+
615+
while argument_tokens:
616+
# TODO: Parse "run keywords" with arguments using upper case AND
617+
t = argument_tokens[0]
618+
argument_tokens = argument_tokens[1:]
619+
if t.value == "AND":
620+
self._results.append(
621+
Diagnostic(
622+
range=range_from_token(t),
623+
message=f"Incorrect use of {t.value}",
624+
severity=DiagnosticSeverity.ERROR,
625+
source=DIAGNOSTICS_SOURCE_NAME,
626+
)
627+
)
628+
continue
629+
630+
if not is_non_variable_token(t):
631+
continue
632+
633+
and_token = next((e for e in argument_tokens if e.value == "AND"), None)
634+
args = []
635+
if and_token is not None:
636+
args = argument_tokens[: argument_tokens.index(and_token)]
637+
argument_tokens = argument_tokens[argument_tokens.index(and_token) + 1 :]
638+
639+
await self._analyze_keyword_call(t.value, node, t, args)
616640

617641
return []
618642

@@ -875,7 +899,9 @@ def __init__(
875899
self.invalidated_callback = invalidated_callback
876900
self._document = weakref.ref(document) if document is not None else None
877901
self._libraries: OrderedDict[str, LibraryEntry] = OrderedDict()
902+
self._libraries_matchers: Optional[List[KeywordMatcher]] = None
878903
self._resources: OrderedDict[str, ResourceEntry] = OrderedDict()
904+
self._resources_matchers: Optional[List[KeywordMatcher]] = None
879905
self._variables: OrderedDict[str, VariablesEntry] = OrderedDict()
880906
self._initialized = False
881907
self._initialize_lock = asyncio.Lock()
@@ -922,12 +948,26 @@ async def get_libraries(self) -> OrderedDict[str, LibraryEntry]:
922948

923949
return self._libraries
924950

951+
async def get_libraries_matchers(self) -> List[KeywordMatcher]:
952+
if self._libraries_matchers is None:
953+
self._libraries_matchers = [
954+
KeywordMatcher(v.alias or v.name or v.import_name) for v in (await self.get_libraries()).values()
955+
]
956+
return self._libraries_matchers
957+
925958
@_logger.call
926959
async def get_resources(self) -> OrderedDict[str, ResourceEntry]:
927960
await self.ensure_initialized()
928961

929962
return self._resources
930963

964+
async def get_resources_matchers(self) -> List[KeywordMatcher]:
965+
if self._resources_matchers is None:
966+
self._resources_matchers = [
967+
KeywordMatcher(v.alias or v.name or v.import_name) for v in (await self.get_resources()).values()
968+
]
969+
return self._resources_matchers
970+
931971
async def get_library_doc(self) -> LibraryDoc:
932972
from ..parts.documents_cache import DocumentType
933973

@@ -1203,7 +1243,7 @@ async def _import(value: Import) -> Optional[LibraryEntry]:
12031243
]
12041244

12051245
if not allready_imported_resources and entry.library_doc.source != self.source:
1206-
self._resources[entry.import_name] = entry
1246+
self._resources[entry.alias or entry.name or entry.import_name] = entry
12071247
try:
12081248
await self._import_imports(
12091249
entry.imports,
@@ -1235,7 +1275,7 @@ async def _import(value: Import) -> Optional[LibraryEntry]:
12351275
)
12361276
)
12371277
elif allready_imported_resources and allready_imported_resources[0].library_doc.source:
1238-
self._resources[entry.import_name] = entry
1278+
self._resources[entry.alias or entry.name or entry.import_name] = entry
12391279

12401280
self._diagnostics.append(
12411281
Diagnostic(

robotcode/language_server/robotframework/parts/model_helper.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,21 @@ async def get_run_keyword_keyworddoc_and_token_from_position(
3939

4040
elif keyword_doc.is_run_keywords():
4141
while argument_tokens:
42+
# TODO: Parse "run keywords" with arguments using upper case AND
4243
t = argument_tokens[0]
4344
argument_tokens = argument_tokens[1:]
45+
if t.value == "AND":
46+
continue
4447

45-
if position.is_in_range(range_from_token(t)) and is_non_variable_token(t):
48+
if is_non_variable_token(t) and position.is_in_range(range_from_token(t)):
4649
result = await self.get_keyworddoc_and_token_from_position(t.value, t, [], namespace, position)
4750

4851
return result, argument_tokens
52+
53+
and_token = next((e for e in argument_tokens if e.value == "AND"), None)
54+
if and_token is not None:
55+
argument_tokens = argument_tokens[argument_tokens.index(and_token) + 1 :]
56+
4957
return None, []
5058
elif keyword_doc.is_run_keyword_if() and len(argument_tokens) > 1 and is_non_variable_token(argument_tokens[1]):
5159

0 commit comments

Comments
 (0)