Skip to content

Commit b4e9f03

Browse files
committed
fix: completion and diagnostics for import statements for RF >= 6.1
1 parent 9db5ba0 commit b4e9f03

File tree

5 files changed

+95
-63
lines changed

5 files changed

+95
-63
lines changed

packages/language_server/src/robotcode/language_server/robotframework/diagnostics/analyzer.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,3 +902,33 @@ async def visit_Tags(self, node: ast.AST) -> None: # noqa: N802
902902
tags=[DiagnosticTag.DEPRECATED],
903903
code="DeprecatedHyphenTag",
904904
)
905+
906+
def _check_import_name(self, value: Optional[str], node: ast.AST, type: str) -> None:
907+
if not value:
908+
self.append_diagnostics(
909+
range=range_from_node(node),
910+
message=f"{type} setting requires value.",
911+
severity=DiagnosticSeverity.ERROR,
912+
code="ImportNeedsName",
913+
)
914+
915+
async def visit_VariablesImport(self, node: ast.AST) -> None: # noqa: N802
916+
if get_robot_version() >= (6, 1):
917+
from robot.parsing.model.statements import VariablesImport
918+
919+
import_node = cast(VariablesImport, node)
920+
self._check_import_name(import_node.name, node, "Variables")
921+
922+
async def visit_ResourceImport(self, node: ast.AST) -> None: # noqa: N802
923+
if get_robot_version() >= (6, 1):
924+
from robot.parsing.model.statements import ResourceImport
925+
926+
import_node = cast(ResourceImport, node)
927+
self._check_import_name(import_node.name, node, "Resource")
928+
929+
async def visit_LibraryImport(self, node: ast.AST) -> None: # noqa: N802
930+
if get_robot_version() >= (6, 1):
931+
from robot.parsing.model.statements import LibraryImport
932+
933+
import_node = cast(LibraryImport, node)
934+
self._check_import_name(import_node.name, node, "Library")

packages/language_server/src/robotcode/language_server/robotframework/diagnostics/namespace.py

Lines changed: 60 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -419,28 +419,28 @@ def visit_LibraryImport(self, node: ast.AST) -> None: # noqa: N802
419419
last_data_token = cast(
420420
RobotToken, next(v for v in reversed(n.tokens) if v.type not in RobotToken.NON_DATA_TOKENS)
421421
)
422-
423-
self._results.append(
424-
LibraryImport(
425-
name=n.name,
426-
name_token=name if name is not None else None,
427-
args=n.args,
428-
alias=n.alias,
429-
line_no=node.lineno,
430-
col_offset=node.col_offset,
431-
end_line_no=last_data_token.lineno
432-
if last_data_token is not None
433-
else node.end_lineno
434-
if node.end_lineno is not None
435-
else -1,
436-
end_col_offset=last_data_token.end_col_offset
437-
if last_data_token is not None
438-
else node.end_col_offset
439-
if node.end_col_offset is not None
440-
else -1,
441-
source=self.source,
422+
if n.name:
423+
self._results.append(
424+
LibraryImport(
425+
name=n.name,
426+
name_token=name if name is not None else None,
427+
args=n.args,
428+
alias=n.alias,
429+
line_no=node.lineno,
430+
col_offset=node.col_offset,
431+
end_line_no=last_data_token.lineno
432+
if last_data_token is not None
433+
else node.end_lineno
434+
if node.end_lineno is not None
435+
else -1,
436+
end_col_offset=last_data_token.end_col_offset
437+
if last_data_token is not None
438+
else node.end_col_offset
439+
if node.end_col_offset is not None
440+
else -1,
441+
source=self.source,
442+
)
442443
)
443-
)
444444

445445
def visit_ResourceImport(self, node: ast.AST) -> None: # noqa: N802
446446
from robot.parsing.lexer.tokens import Token as RobotToken
@@ -452,25 +452,26 @@ def visit_ResourceImport(self, node: ast.AST) -> None: # noqa: N802
452452
last_data_token = cast(
453453
RobotToken, next(v for v in reversed(n.tokens) if v.type not in RobotToken.NON_DATA_TOKENS)
454454
)
455-
self._results.append(
456-
ResourceImport(
457-
name=n.name,
458-
name_token=name if name is not None else None,
459-
line_no=node.lineno,
460-
col_offset=node.col_offset,
461-
end_line_no=last_data_token.lineno
462-
if last_data_token is not None
463-
else node.end_lineno
464-
if node.end_lineno is not None
465-
else -1,
466-
end_col_offset=last_data_token.end_col_offset
467-
if last_data_token is not None
468-
else node.end_col_offset
469-
if node.end_col_offset is not None
470-
else -1,
471-
source=self.source,
455+
if n.name:
456+
self._results.append(
457+
ResourceImport(
458+
name=n.name,
459+
name_token=name if name is not None else None,
460+
line_no=node.lineno,
461+
col_offset=node.col_offset,
462+
end_line_no=last_data_token.lineno
463+
if last_data_token is not None
464+
else node.end_lineno
465+
if node.end_lineno is not None
466+
else -1,
467+
end_col_offset=last_data_token.end_col_offset
468+
if last_data_token is not None
469+
else node.end_col_offset
470+
if node.end_col_offset is not None
471+
else -1,
472+
source=self.source,
473+
)
472474
)
473-
)
474475

475476
def visit_VariablesImport(self, node: ast.AST) -> None: # noqa: N802
476477
from robot.parsing.lexer.tokens import Token as RobotToken
@@ -482,26 +483,27 @@ def visit_VariablesImport(self, node: ast.AST) -> None: # noqa: N802
482483
last_data_token = cast(
483484
RobotToken, next(v for v in reversed(n.tokens) if v.type not in RobotToken.NON_DATA_TOKENS)
484485
)
485-
self._results.append(
486-
VariablesImport(
487-
name=n.name,
488-
name_token=name if name is not None else None,
489-
args=n.args,
490-
line_no=node.lineno,
491-
col_offset=node.col_offset,
492-
end_line_no=last_data_token.lineno
493-
if last_data_token is not None
494-
else node.end_lineno
495-
if node.end_lineno is not None
496-
else -1,
497-
end_col_offset=last_data_token.end_col_offset
498-
if last_data_token is not None
499-
else node.end_col_offset
500-
if node.end_col_offset is not None
501-
else -1,
502-
source=self.source,
486+
if n.name:
487+
self._results.append(
488+
VariablesImport(
489+
name=n.name,
490+
name_token=name if name is not None else None,
491+
args=n.args,
492+
line_no=node.lineno,
493+
col_offset=node.col_offset,
494+
end_line_no=last_data_token.lineno
495+
if last_data_token is not None
496+
else node.end_lineno
497+
if node.end_lineno is not None
498+
else -1,
499+
end_col_offset=last_data_token.end_col_offset
500+
if last_data_token is not None
501+
else node.end_col_offset
502+
if node.end_col_offset is not None
503+
else -1,
504+
source=self.source,
505+
)
503506
)
504-
)
505507

506508

507509
@dataclass

packages/language_server/src/robotcode/language_server/robotframework/parts/completion.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,7 +1536,7 @@ async def complete_import() -> Optional[List[CompletionItem]]:
15361536

15371537
async def complete_arguments() -> Optional[List[CompletionItem]]:
15381538
if (
1539-
import_node.name is None
1539+
not import_node.name
15401540
or position <= range_from_token(import_node.get_token(RobotToken.NAME)).extend(end_character=1).end
15411541
):
15421542
return None
@@ -1868,7 +1868,7 @@ async def complete_import() -> Optional[List[CompletionItem]]:
18681868

18691869
async def complete_arguments() -> Optional[List[CompletionItem]]:
18701870
if (
1871-
import_node.name is None
1871+
not import_node.name
18721872
or position <= range_from_token(import_node.get_token(RobotToken.NAME)).extend(end_character=1).end
18731873
):
18741874
return None

packages/language_server/src/robotcode/language_server/robotframework/parts/semantic_tokens.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ async def _collect_internal(
770770
async def get_tokens() -> AsyncIterator[Tuple[Token, ast.AST]]:
771771
async for node in async_ast.iter_nodes(model):
772772
if isinstance(node, HasTokens):
773-
if isinstance(node, LibraryImport):
773+
if isinstance(node, LibraryImport) and node.name:
774774
lib_doc = await namespace.get_imported_library_libdoc(node.name, node.args, node.alias)
775775
kw_doc = lib_doc.inits.keywords[0] if lib_doc and lib_doc.inits else None
776776
if lib_doc is not None:
@@ -807,7 +807,7 @@ async def get_tokens() -> AsyncIterator[Tuple[Token, ast.AST]]:
807807

808808
yield token, node
809809
continue
810-
if isinstance(node, VariablesImport):
810+
if isinstance(node, VariablesImport) and node.name:
811811
lib_doc = await namespace.get_imported_variables_libdoc(node.name, node.args)
812812
kw_doc = lib_doc.inits.keywords[0] if lib_doc and lib_doc.inits else None
813813
if lib_doc is not None:

packages/language_server/src/robotcode/language_server/robotframework/parts/signature_help.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ async def signature_help_LibraryImport( # noqa: N802
217217
library_node = cast(LibraryImport, node)
218218

219219
if (
220-
library_node.name is None
220+
not library_node.name
221221
or position <= range_from_token(library_node.get_token(RobotToken.NAME)).extend(end_character=1).end
222222
):
223223
return None

0 commit comments

Comments
 (0)