diff --git a/jac/jaclang/plugin/default.py b/jac/jaclang/plugin/default.py index 21bac84e4d..9fc1da55ec 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 0000000000..d7d0af7a56 --- /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 a517959b64..e24da0b131 100644 --- a/jac/jaclang/tests/test_language.py +++ b/jac/jaclang/tests/test_language.py @@ -1147,3 +1147,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)