Skip to content

Commit a81695c

Browse files
committed
fix(debugger): fix some things in debugger to better support Robot Framework version 7.0
1 parent 6093387 commit a81695c

File tree

1 file changed

+87
-22
lines changed

1 file changed

+87
-22
lines changed

packages/debugger/src/robotcode/debugger/debugger.py

Lines changed: 87 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,7 @@
7373
)
7474

7575
if get_robot_version() >= (7, 0):
76-
from robot.running.invalidkeyword import (
77-
InvalidKeywordRunner as UserKeywordHandler,
78-
)
76+
from robot.running import UserKeyword as UserKeywordHandler
7977
else:
8078
from robot.running.userkeyword import UserKeywordHandler
8179

@@ -166,7 +164,7 @@ def __init__(
166164
source: Optional[str],
167165
line: Optional[int],
168166
column: Optional[int] = None,
169-
handler: Any = None,
167+
handler: Optional[UserKeywordHandler] = None,
170168
is_file: bool = True,
171169
libname: Optional[str] = None,
172170
kwname: Optional[str] = None,
@@ -248,6 +246,12 @@ class DebugLogger(LoggerApi): # type: ignore[no-redef]
248246
def __init__(self) -> None:
249247
self.steps: List[Any] = []
250248

249+
def start_try(self, data: "running.Try", result: "result.Try") -> None:
250+
self.steps.append(data)
251+
252+
def end_try(self, data: "running.Try", result: "result.Try") -> None:
253+
self.steps.pop()
254+
251255
def start_keyword(self, data: running.Keyword, result: result.Keyword) -> None:
252256
self.steps.append(data)
253257

@@ -967,6 +971,16 @@ def end_test(self, name: str, attributes: Dict[str, Any]) -> None:
967971

968972
self.remove_stackframe_entry(longname, type, source, line_no)
969973

974+
if get_robot_version() >= (7, 0):
975+
976+
def get_current_keyword_handler(self, name: str) -> UserKeywordHandler:
977+
return EXECUTION_CONTEXTS.current.namespace.get_runner(name).keyword
978+
979+
else:
980+
981+
def get_current_keyword_handler(self, name: str) -> UserKeywordHandler:
982+
return EXECUTION_CONTEXTS.current.namespace.get_runner(name)._handler
983+
970984
def start_keyword(self, name: str, attributes: Dict[str, Any]) -> None:
971985
status = attributes.get("status", "")
972986
source = attributes.get("source")
@@ -978,7 +992,7 @@ def start_keyword(self, name: str, attributes: Dict[str, Any]) -> None:
978992
handler: Any = None
979993
if type in ["KEYWORD", "SETUP", "TEARDOWN"]:
980994
try:
981-
handler = EXECUTION_CONTEXTS.current.namespace.get_runner(name)._handler
995+
handler = self.get_current_keyword_handler(name)
982996
except (SystemExit, KeyboardInterrupt):
983997
raise
984998
except BaseException:
@@ -1060,18 +1074,33 @@ def _should_run_except(self, branch: Any, error: str) -> bool:
10601074

10611075
return False
10621076

1077+
if get_robot_version() >= (7, 0):
1078+
1079+
def _get_step_data(self, step: Any) -> Any:
1080+
return step
1081+
1082+
else:
1083+
1084+
def _get_step_data(self, step: Any) -> Any:
1085+
return step.data
1086+
10631087
def is_not_caugthed_by_except(self, message: Optional[str]) -> bool:
10641088
if not message:
10651089
return True
10661090

1067-
if get_robot_version() >= (5, 0) and self.debug_logger:
1068-
from robot.running.model import Try
1069-
1070-
if self.debug_logger.steps:
1071-
for branch in [f.data for f in reversed(self.debug_logger.steps) if isinstance(f.data, Try)]:
1072-
for except_branch in branch.except_branches:
1073-
if self._should_run_except(except_branch, message):
1074-
return False
1091+
if self.debug_logger:
1092+
if get_robot_version() >= (5, 0):
1093+
from robot.running.model import Try
1094+
1095+
if self.debug_logger.steps:
1096+
for branch in [
1097+
self._get_step_data(f)
1098+
for f in reversed(self.debug_logger.steps)
1099+
if isinstance(self._get_step_data(f), Try)
1100+
]:
1101+
for except_branch in branch.except_branches:
1102+
if self._should_run_except(except_branch, message):
1103+
return False
10751104
return True
10761105

10771106
def end_keyword(self, name: str, attributes: Dict[str, Any]) -> None:
@@ -1105,7 +1134,7 @@ def end_keyword(self, name: str, attributes: Dict[str, Any]) -> None:
11051134
handler: Any = None
11061135
if type in ["KEYWORD", "SETUP", "TEARDOWN"]:
11071136
try:
1108-
handler = EXECUTION_CONTEXTS.current.namespace.get_runner(name)._handler
1137+
handler = self.get_current_keyword_handler(name)
11091138
except (SystemExit, KeyboardInterrupt):
11101139
raise
11111140
except BaseException:
@@ -1369,6 +1398,16 @@ def _create_variable(self, name: str, value: Any) -> Variable:
13691398

13701399
return Variable(name=name, value=repr(value), type=repr(type(value)))
13711400

1401+
if get_robot_version() >= (7, 0):
1402+
1403+
def get_handler_args(self, handler: UserKeywordHandler) -> Any:
1404+
return handler.args
1405+
1406+
else:
1407+
1408+
def get_handler_args(self, handler: UserKeywordHandler) -> Any:
1409+
return handler.arguments
1410+
13721411
def get_variables(
13731412
self,
13741413
variables_reference: int,
@@ -1436,8 +1475,8 @@ def get_variables(
14361475
}
14371476
)
14381477

1439-
if entry.handler is not None and entry.handler.arguments:
1440-
for argument in entry.handler.arguments.argument_names:
1478+
if entry.handler is not None and self.get_handler_args(entry.handler):
1479+
for argument in self.get_handler_args(entry.handler).argument_names:
14411480
name = f"${{{argument}}}"
14421481
try:
14431482
value = vars[name]
@@ -1494,6 +1533,16 @@ def get_variables(
14941533
SPLIT_LINE: ClassVar = re.compile(r"(?= {2,}| ?\t)\s*")
14951534
CURRDIR: ClassVar = re.compile(r"(?i)\$\{CURDIR\}")
14961535

1536+
if get_robot_version() >= (7, 0):
1537+
1538+
def _run_keyword(self, kw: Keyword, context: Any) -> Any:
1539+
return kw.run(context.steps[-1][1], context)
1540+
1541+
else:
1542+
1543+
def _run_keyword(self, kw: Keyword, context: Any) -> Any:
1544+
return kw.run(context)
1545+
14971546
def evaluate(
14981547
self,
14991548
expression: str,
@@ -1557,7 +1606,7 @@ def run_kw() -> Any:
15571606
args=tuple(splitted[1:]),
15581607
assign=tuple(variables),
15591608
)
1560-
return kw.run(evaluate_context)
1609+
return self._run_keyword(kw, evaluate_context)
15611610

15621611
result = self.run_in_robot_thread(run_kw)
15631612

@@ -1611,7 +1660,7 @@ def run_kw() -> Any:
16111660
for kw in test.body:
16121661
with LOGGER.delayed_logging:
16131662
try:
1614-
result = kw.run(evaluate_context)
1663+
result = self._run_keyword(kw, evaluate_context)
16151664
except (SystemExit, KeyboardInterrupt):
16161665
raise
16171666
except BaseException as e:
@@ -1793,6 +1842,22 @@ def set_exception_breakpoints(
17931842

17941843
return result or None
17951844

1845+
if get_robot_version() >= (7, 0):
1846+
1847+
def _get_keywords_from_lib(self, lib: Any) -> Any:
1848+
return lib.keywords
1849+
1850+
def _get_short_doc_from_kw(self, kw: Any) -> Any:
1851+
return kw.short_doc
1852+
1853+
else:
1854+
1855+
def _get_keywords_from_lib(self, lib: Any) -> Any:
1856+
return lib.handlers
1857+
1858+
def _get_short_doc_from_kw(self, kw: Any) -> Any:
1859+
return kw.shortdoc
1860+
17961861
def completions(
17971862
self,
17981863
text: str,
@@ -1824,14 +1889,14 @@ def completions(
18241889
type=CompletionItemType.MODULE,
18251890
)
18261891
)
1827-
for kw in library.handlers:
1892+
for kw in self._get_keywords_from_lib(library):
18281893
result.append(
18291894
CompletionItem(
18301895
label=kw.name,
18311896
text=kw.name,
18321897
sort_text=f"001_{kw.name}",
18331898
type=CompletionItemType.FUNCTION,
1834-
detail=kw.shortdoc,
1899+
detail=self._get_short_doc_from_kw(kw),
18351900
)
18361901
)
18371902

@@ -1844,14 +1909,14 @@ def completions(
18441909
type=CompletionItemType.MODULE,
18451910
)
18461911
)
1847-
for kw in resource.handlers:
1912+
for kw in self._get_keywords_from_lib(resource):
18481913
result.append(
18491914
CompletionItem(
18501915
label=kw.name,
18511916
text=kw.name,
18521917
sort_text=f"001_{kw.name}",
18531918
type=CompletionItemType.FUNCTION,
1854-
detail=kw.shortdoc,
1919+
detail=self._get_short_doc_from_kw(kw),
18551920
)
18561921
)
18571922

0 commit comments

Comments
 (0)