aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreterbase/interpreterbase.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/interpreterbase/interpreterbase.py')
-rw-r--r--mesonbuild/interpreterbase/interpreterbase.py13
1 files changed, 13 insertions, 0 deletions
diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py
index da64f68..c8ef303 100644
--- a/mesonbuild/interpreterbase/interpreterbase.py
+++ b/mesonbuild/interpreterbase/interpreterbase.py
@@ -26,6 +26,7 @@ from .baseobjects import (
InterpreterObjectTypeVar,
ObjectHolder,
IterableObject,
+ ContextManagerObject,
HoldableTypes,
)
@@ -231,6 +232,8 @@ class InterpreterBase:
raise ContinueRequest()
elif isinstance(cur, mparser.BreakNode):
raise BreakRequest()
+ elif isinstance(cur, mparser.TestCaseClauseNode):
+ return self.evaluate_testcase(cur)
else:
raise InvalidCode("Unknown statement.")
return None
@@ -294,6 +297,16 @@ class InterpreterBase:
self.evaluate_codeblock(node.elseblock)
return None
+ def evaluate_testcase(self, node: mparser.TestCaseClauseNode) -> T.Optional[Disabler]:
+ result = self.evaluate_statement(node.condition)
+ if isinstance(result, Disabler):
+ return result
+ if not isinstance(result, ContextManagerObject):
+ raise InvalidCode(f'testcase clause {result!r} does not evaluate to a context manager.')
+ with result:
+ self.evaluate_codeblock(node.block)
+ return None
+
def evaluate_comparison(self, node: mparser.ComparisonNode) -> InterpreterObject:
val1 = self.evaluate_statement(node.left)
if val1 is None: