Skip to content

Commit ffa9bdb

Browse files
committed
feat(langserver): resolve variable in hover for documentation settings in testcases and keywords
closes #326
1 parent 63f3e4a commit ffa9bdb

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

Diff for: packages/language_server/src/robotcode/language_server/robotframework/parts/hover.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,19 @@ def _hover_default(self, nodes: List[ast.AST], document: TextDocument, position:
184184
)
185185

186186
if found_range is not None:
187-
result.append((found_range, kw.to_markdown()))
187+
txt = kw.to_markdown()
188+
if kw.libtype == "RESOURCE":
189+
txt = namespace.imports_manager.replace_variables_scalar(
190+
txt,
191+
str(document.uri.to_path().parent),
192+
namespace.get_resolvable_variables(nodes, position),
193+
)
194+
result.append((found_range, txt))
188195
if result:
189196
r = result[0][0]
190197
if all(r == i[0] for i in result):
191198
doc = "\n\n---\n\n".join(i[1] for i in result)
199+
192200
return Hover(
193201
contents=MarkupContent(kind=MarkupKind.MARKDOWN, value=doc),
194202
range=r,
@@ -233,6 +241,7 @@ def hover_TestCase( # noqa: N802
233241
document: TextDocument,
234242
position: Position,
235243
) -> Optional[Hover]:
244+
namespace = self.parent.documents_cache.get_namespace(document)
236245
test_case = cast(TestCase, node)
237246

238247
if not position.is_in_range(range_from_node(test_case.header)):
@@ -259,6 +268,11 @@ def hover_TestCase( # noqa: N802
259268
txt += "\n*Tags*: "
260269
txt += f"{', '.join(tags.values)}\n"
261270

271+
txt = namespace.imports_manager.replace_variables_scalar(
272+
txt,
273+
str(document.uri.to_path().parent),
274+
namespace.get_resolvable_variables(nodes, position),
275+
)
262276
return Hover(
263277
contents=MarkupContent(kind=MarkupKind.MARKDOWN, value=MarkDownFormatter().format(txt)),
264278
range=range_from_token(name_token),

Diff for: packages/robot/src/robotcode/robot/diagnostics/imports_manager.py

+15
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
get_variables_doc,
6565
is_library_by_path,
6666
is_variables_by_path,
67+
replace_variables_scalar,
6768
resolve_args,
6869
resolve_variable,
6970
)
@@ -1572,3 +1573,17 @@ def resolve_variable(
15721573
self.get_resolvable_command_line_variables(),
15731574
variables,
15741575
)
1576+
1577+
def replace_variables_scalar(
1578+
self,
1579+
scalar: str,
1580+
base_dir: str = ".",
1581+
variables: Optional[Dict[str, Any]] = None,
1582+
) -> Any:
1583+
return replace_variables_scalar(
1584+
scalar,
1585+
str(self.root_folder),
1586+
base_dir,
1587+
self.get_resolvable_command_line_variables(),
1588+
variables,
1589+
)

Diff for: packages/robot/src/robotcode/robot/diagnostics/library_doc.py

+25-8
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,8 @@
4545
from robot.parsing.lexer.tokens import Token as RobotToken
4646
from robot.parsing.model.blocks import Keyword
4747
from robot.parsing.model.statements import Arguments, KeywordName
48-
from robot.running.arguments.argumentresolver import (
49-
ArgumentResolver,
50-
DictToKwargs,
51-
NamedArgumentResolver,
52-
VariableReplacer,
53-
)
48+
from robot.running.arguments.argumentresolver import ArgumentResolver, DictToKwargs, NamedArgumentResolver
49+
from robot.running.arguments.argumentresolver import VariableReplacer as ArgumentsVariableReplacer
5450
from robot.running.arguments.argumentspec import ArgInfo
5551
from robot.running.arguments.argumentspec import (
5652
ArgumentSpec as RobotArgumentSpec,
@@ -64,6 +60,7 @@
6460
from robot.variables import Variables
6561
from robot.variables.filesetter import PythonImporter, YamlImporter
6662
from robot.variables.finders import VariableFinder
63+
from robot.variables.replacer import VariableReplacer
6764
from robot.variables.search import contains_variable
6865
from robotcode.core.lsp.types import Position, Range
6966
from robotcode.core.utils.path import normalized_path
@@ -578,9 +575,9 @@ def _raise_positional_after_named(self) -> None:
578575

579576
positional, named = MyNamedArgumentResolver(self.__robot_arguments).resolve(arguments, variables)
580577
if get_robot_version() < (7, 0):
581-
positional, named = VariableReplacer(resolve_variables_until).replace(positional, named, variables)
578+
positional, named = ArgumentsVariableReplacer(resolve_variables_until).replace(positional, named, variables)
582579
else:
583-
positional, named = VariableReplacer(self.__robot_arguments, resolve_variables_until).replace(
580+
positional, named = ArgumentsVariableReplacer(self.__robot_arguments, resolve_variables_until).replace(
584581
positional, named, variables
585582
)
586583
positional, named = DictToKwargs(self.__robot_arguments, dict_to_kwargs).handle(positional, named)
@@ -1585,6 +1582,26 @@ def resolve_variable(
15851582
return name.replace("\\", "\\\\")
15861583

15871584

1585+
def replace_variables_scalar(
1586+
scalar: str,
1587+
working_dir: str = ".",
1588+
base_dir: str = ".",
1589+
command_line_variables: Optional[Dict[str, Optional[Any]]] = None,
1590+
variables: Optional[Dict[str, Optional[Any]]] = None,
1591+
) -> Any:
1592+
1593+
_update_env(working_dir)
1594+
1595+
if contains_variable(scalar, "$@&%"):
1596+
robot_variables = resolve_robot_variables(working_dir, base_dir, command_line_variables, variables)
1597+
if get_robot_version() >= (6, 1):
1598+
return VariableReplacer(robot_variables).replace_scalar(scalar.replace("\\", "\\\\"))
1599+
1600+
return VariableReplacer(robot_variables.store).replace_scalar(scalar.replace("\\", "\\\\"))
1601+
1602+
return scalar.replace("\\", "\\\\")
1603+
1604+
15881605
@contextmanager
15891606
def _std_capture() -> Iterator[io.StringIO]:
15901607
old__stdout__ = sys.__stdout__

0 commit comments

Comments
 (0)