From 86ebb2584d4b77c66b2d80fe30dc4477c16c4f82 Mon Sep 17 00:00:00 2001 From: kugesan1105 Date: Wed, 9 Oct 2024 00:15:52 +0530 Subject: [PATCH] fix random visit in traversal --- jac/jaclang/plugin/default.py | 16 ++++++++++------ jac/jaclang/tests/fixtures/visit_order.jac | 20 ++++++++++++++++++++ jac/jaclang/tests/test_language.py | 9 +++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 jac/jaclang/tests/fixtures/visit_order.jac diff --git a/jac/jaclang/plugin/default.py b/jac/jaclang/plugin/default.py index 21bac84e4..9fc1da55e 100644 --- a/jac/jaclang/plugin/default.py +++ b/jac/jaclang/plugin/default.py @@ -877,19 +877,23 @@ def edge_ref( if edges_only: connected_edges: list[EdgeArchitype] = [] for node in node_obj: - connected_edges += Jac.get_edges( + edges = Jac.get_edges( node.__jac__, dir, filter_func, target_obj=targ_obj_set ) - return list(set(connected_edges)) + connected_edges.extend( + edge for edge in edges if edge not in connected_edges + ) + return connected_edges else: connected_nodes: list[NodeArchitype] = [] for node in node_obj: + nodes = Jac.edges_to_nodes( + node.__jac__, dir, filter_func, target_obj=targ_obj_set + ) connected_nodes.extend( - Jac.edges_to_nodes( - node.__jac__, dir, filter_func, target_obj=targ_obj_set - ) + node for node in nodes if node not in connected_nodes ) - return list(set(connected_nodes)) + return connected_nodes @staticmethod @hookimpl diff --git a/jac/jaclang/tests/fixtures/visit_order.jac b/jac/jaclang/tests/fixtures/visit_order.jac new file mode 100644 index 000000000..d7d0af7a5 --- /dev/null +++ b/jac/jaclang/tests/fixtures/visit_order.jac @@ -0,0 +1,20 @@ +node MyNode{ + has Name:str; +} + +edge a{} + +edge b{} + +with entry{ + Start = MyNode("Start"); + End = MyNode("End"); + mid = MyNode("Middle"); + root <+:a:+ Start; + root +:a:+> End; + root +:b:+> mid; + root +:a:+> mid; + + print([root-->]); + +} diff --git a/jac/jaclang/tests/test_language.py b/jac/jaclang/tests/test_language.py index 3a8c5c2da..b1328bd6c 100644 --- a/jac/jaclang/tests/test_language.py +++ b/jac/jaclang/tests/test_language.py @@ -1115,3 +1115,12 @@ def test_entry_exit(self) -> None: self.assertIn( "Exiting at the end of walker: test_node(value=", stdout_value[11] ) + + def test_visit_order(self) -> None: + """Test entry and exit behavior of walker.""" + captured_output = io.StringIO() + sys.stdout = captured_output + jac_import("visit_order", base_path=self.fixture_abs_path("./")) + sys.stdout = sys.__stdout__ + stdout_value = captured_output.getvalue() + self.assertEqual("[MyNode(Name='End'), MyNode(Name='Middle')]\n", stdout_value)