77import java .util .Map ;
88import java .util .Set ;
99
10+ import static graphql .Assert .assertFalse ;
1011import static graphql .Assert .assertNotNull ;
12+ import static graphql .Assert .assertNull ;
1113import static graphql .Assert .assertTrue ;
1214
1315@ Internal
1416public class DefaultTraverserContext <T > implements TraverserContext <T > {
1517
1618 private final T curNode ;
1719 private T newNode ;
20+ private boolean nodeDeleted ;
21+
1822 private final TraverserContext <T > parent ;
1923 private final Set <T > visited ;
2024 private final Map <Class <?>, Object > vars ;
@@ -53,20 +57,36 @@ public static <T> DefaultTraverserContext<T> simple(T node) {
5357
5458 @ Override
5559 public T thisNode () {
60+ assertFalse (this .nodeDeleted , "node is deleted" );
5661 if (newNode != null ) {
5762 return newNode ;
5863 }
5964 return curNode ;
6065 }
6166
67+ @ Override
68+ public T originalThisNode () {
69+ return curNode ;
70+ }
6271
6372 @ Override
6473 public void changeNode (T newNode ) {
6574 assertNotNull (newNode );
66- assertTrue (this .newNode == null , "node can only be changed once" );
75+ assertTrue (this .newNode == null && ! this . nodeDeleted , "node can only be changed or deleted once" );
6776 this .newNode = newNode ;
6877 }
6978
79+ @ Override
80+ public void deleteNode () {
81+ assertNull (this .newNode , "node can only be changed or deleted once" );
82+ assertFalse (this .nodeDeleted , "node can only be changed or deleted once" );
83+ this .nodeDeleted = true ;
84+ }
85+
86+ @ Override
87+ public boolean isDeleted () {
88+ return this .nodeDeleted ;
89+ }
7090
7191 @ Override
7292 public TraverserContext <T > getParentContext () {
@@ -84,6 +104,14 @@ public List<T> getParentNodes() {
84104 return result ;
85105 }
86106
107+ @ Override
108+ public T getParentNode () {
109+ if (parent == null ) {
110+ return null ;
111+ }
112+ return parent .thisNode ();
113+ }
114+
87115 @ Override
88116 public Set <T > visitedNodes () {
89117 return visited ;
0 commit comments