1
0
Fork 0
Code Issues Pull requests Projects Releases 2 Packages Wiki Activity Actions Pages

Add multi-language logic exploration

This commit is contained in:
Andraxion 2026-07-25 22:29:15 -04:00
parent 9b4258c852
commit 9161889492
18 changed files with 1639 additions and 76 deletions

View file

@ -271,11 +271,15 @@ class _FunctionLogicBuilder:
if statement.orelse
else condition.when_false
)
return self._merge("Branch merge", (*body_tails, *else_tails), statement)
return self._converge(
"Decision convergence",
(*body_tails, *else_tails),
statement,
)
def _while(self, statement: ast.While, incoming: tuple[_Tail, ...]) -> tuple[_Tail, ...]:
condition = self._condition(statement.test, incoming)
after_id = self._node("merge", "After loop", statement)
after_id = self._node("convergence", "Loop exit", statement)
loop = _Loop(continue_id=condition.entry_id, break_id=after_id)
body_tails = self._statements(statement.body, condition.when_true, loop=loop)
for tail in body_tails:
@ -299,7 +303,7 @@ class _FunctionLogicBuilder:
f"{prefix} {_expression(statement.target)} in {_expression(statement.iter)}",
statement,
)
after_id = self._node("merge", "After loop", statement)
after_id = self._node("convergence", "Loop exit", statement)
self._connect(incoming, loop_id)
loop = _Loop(continue_id=loop_id, break_id=after_id)
body_tails = self._statements(
@ -343,7 +347,11 @@ class _FunctionLogicBuilder:
)
)
pending = () if _is_catch_all(case) else (_Tail(case_id, "when_false", "NEXT CASE"),)
return self._merge("Match merge", (*completed, *pending), statement)
return self._converge(
"Case convergence",
(*completed, *pending),
statement,
)
def _try(
self,
@ -365,11 +373,15 @@ class _FunctionLogicBuilder:
handler_id = self._node("except", f"except {exception}", handler)
self._edge(try_id, "exception", handler_id, f"EXCEPT {exception}")
branches.extend(self._statements(handler.body, (_Tail(handler_id),), loop=loop))
merged = self._merge("Try merge", tuple(branches), statement)
converged = self._converge(
"Exception convergence",
tuple(branches),
statement,
)
if not statement.finalbody:
return merged
return converged
finally_id = self._node("finally", "finally", statement.finalbody[0])
self._connect(merged, finally_id)
self._connect(converged, finally_id)
return self._statements(statement.finalbody, (_Tail(finally_id),), loop=loop)
def _condition(
@ -406,7 +418,7 @@ class _FunctionLogicBuilder:
(_Tail(node_id, "when_false", "FALSE"),),
)
def _merge(
def _converge(
self,
label: str,
incoming: tuple[_Tail, ...],
@ -414,9 +426,9 @@ class _FunctionLogicBuilder:
) -> tuple[_Tail, ...]:
if not incoming:
return ()
merge_id = self._node("merge", label, source)
self._connect(incoming, merge_id)
return (_Tail(merge_id),)
convergence_id = self._node("convergence", label, source)
self._connect(incoming, convergence_id)
return (_Tail(convergence_id),)
def _node(self, kind: str, label: str, source: ast.AST) -> str:
if len(self.nodes) >= self.max_nodes: