@@ -674,3 +674,115 @@ def leave(self, node, key, parent, *args):
674674 ['break-b' , 'leave' , 'SelectionSet' , None ],
675675 ['break-b' , 'leave' , 'Field' , None ]
676676 ]
677+
678+
679+ def test_visits_in_pararell_allows_for_editing_on_enter ():
680+ visited = []
681+ ast = parse ('{ a, b, c { a, b, c } }' , no_location = True )
682+
683+ class TestVisitor1 (Visitor ):
684+
685+ def enter (self , node , key , parent , * args ):
686+ if type (node ).__name__ == 'Field' and node .name .value == 'b' :
687+ return REMOVE
688+
689+ class TestVisitor2 (Visitor ):
690+
691+ def enter (self , node , key , parent , * args ):
692+ visited .append (
693+ ['enter' , type (node ).__name__ , getattr (node , 'value' , None )])
694+
695+ def leave (self , node , key , parent , * args ):
696+ visited .append (
697+ ['leave' , type (node ).__name__ , getattr (node , 'value' , None )])
698+
699+ edited_ast = visit (ast , ParallelVisitor ([TestVisitor1 (), TestVisitor2 ()]))
700+
701+ assert ast == parse ('{ a, b, c { a, b, c } }' , no_location = True )
702+ assert edited_ast == parse ('{ a, c { a, c } }' , no_location = True )
703+
704+ assert visited == [
705+ ['enter' , 'Document' , None ],
706+ ['enter' , 'OperationDefinition' , None ],
707+ ['enter' , 'SelectionSet' , None ],
708+ ['enter' , 'Field' , None ],
709+ ['enter' , 'Name' , 'a' ],
710+ ['leave' , 'Name' , 'a' ],
711+ ['leave' , 'Field' , None ],
712+ ['enter' , 'Field' , None ],
713+ ['enter' , 'Name' , 'c' ],
714+ ['leave' , 'Name' , 'c' ],
715+ ['enter' , 'SelectionSet' , None ],
716+ ['enter' , 'Field' , None ],
717+ ['enter' , 'Name' , 'a' ],
718+ ['leave' , 'Name' , 'a' ],
719+ ['leave' , 'Field' , None ],
720+ ['enter' , 'Field' , None ],
721+ ['enter' , 'Name' , 'c' ],
722+ ['leave' , 'Name' , 'c' ],
723+ ['leave' , 'Field' , None ],
724+ ['leave' , 'SelectionSet' , None ],
725+ ['leave' , 'Field' , None ],
726+ ['leave' , 'SelectionSet' , None ],
727+ ['leave' , 'OperationDefinition' , None ],
728+ ['leave' , 'Document' , None ]
729+ ]
730+
731+
732+ def test_visits_in_pararell_allows_for_editing_on_leave ():
733+ visited = []
734+ ast = parse ('{ a, b, c { a, b, c } }' , no_location = True )
735+
736+ class TestVisitor1 (Visitor ):
737+
738+ def leave (self , node , key , parent , * args ):
739+ if type (node ).__name__ == 'Field' and node .name .value == 'b' :
740+ return REMOVE
741+
742+ class TestVisitor2 (Visitor ):
743+
744+ def enter (self , node , key , parent , * args ):
745+ visited .append (
746+ ['enter' , type (node ).__name__ , getattr (node , 'value' , None )])
747+
748+ def leave (self , node , key , parent , * args ):
749+ visited .append (
750+ ['leave' , type (node ).__name__ , getattr (node , 'value' , None )])
751+
752+ edited_ast = visit (ast , ParallelVisitor ([TestVisitor1 (), TestVisitor2 ()]))
753+
754+ assert ast == parse ('{ a, b, c { a, b, c } }' , no_location = True )
755+ assert edited_ast == parse ('{ a, c { a, c } }' , no_location = True )
756+
757+ assert visited == [
758+ ['enter' , 'Document' , None ],
759+ ['enter' , 'OperationDefinition' , None ],
760+ ['enter' , 'SelectionSet' , None ],
761+ ['enter' , 'Field' , None ],
762+ ['enter' , 'Name' , 'a' ],
763+ ['leave' , 'Name' , 'a' ],
764+ ['leave' , 'Field' , None ],
765+ ['enter' , 'Field' , None ],
766+ ['enter' , 'Name' , 'b' ],
767+ ['leave' , 'Name' , 'b' ],
768+ ['enter' , 'Field' , None ],
769+ ['enter' , 'Name' , 'c' ],
770+ ['leave' , 'Name' , 'c' ],
771+ ['enter' , 'SelectionSet' , None ],
772+ ['enter' , 'Field' , None ],
773+ ['enter' , 'Name' , 'a' ],
774+ ['leave' , 'Name' , 'a' ],
775+ ['leave' , 'Field' , None ],
776+ ['enter' , 'Field' , None ],
777+ ['enter' , 'Name' , 'b' ],
778+ ['leave' , 'Name' , 'b' ],
779+ ['enter' , 'Field' , None ],
780+ ['enter' , 'Name' , 'c' ],
781+ ['leave' , 'Name' , 'c' ],
782+ ['leave' , 'Field' , None ],
783+ ['leave' , 'SelectionSet' , None ],
784+ ['leave' , 'Field' , None ],
785+ ['leave' , 'SelectionSet' , None ],
786+ ['leave' , 'OperationDefinition' , None ],
787+ ['leave' , 'Document' , None ]
788+ ]
0 commit comments