diff options
Diffstat (limited to 'mesonbuild/interpreterbase/interpreterbase.py')
-rw-r--r-- | mesonbuild/interpreterbase/interpreterbase.py | 13 |
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: |