1414
1515package dev .cel .common .navigation ;
1616
17+ import static com .google .common .base .Preconditions .checkState ;
18+
1719import dev .cel .common .ast .Expression ;
1820import dev .cel .common .ast .Expression .List ;
19- import dev .cel .common .navigation .ExprPropertyCalculator .ExprProperty ;
2021import java .util .stream .Stream ;
2122
2223/** Visitor implementation to navigate an AST. */
@@ -28,16 +29,6 @@ final class CelNavigableExprVisitor<E extends Expression, T extends BaseNavigabl
2829 private final TraversalOrder traversalOrder ;
2930 private final int maxDepth ;
3031
31- private CelNavigableExprVisitor (
32- int maxDepth ,
33- ExprPropertyCalculator <E > exprPropertyCalculator ,
34- TraversalOrder traversalOrder ) {
35- this .maxDepth = maxDepth ;
36- this .exprPropertyCalculator = exprPropertyCalculator ;
37- this .traversalOrder = traversalOrder ;
38- this .streamBuilder = Stream .builder ();
39- }
40-
4132 /**
4233 * Returns a stream containing all the nodes using the specified traversal order. Note that the
4334 * collection occurs eagerly.
@@ -81,23 +72,24 @@ static <E extends Expression, T extends BaseNavigableExpr<E>> Stream<T> collect(
8172 */
8273 static <E extends Expression , T extends BaseNavigableExpr <E >> Stream <T > collect (
8374 T navigableExpr , int maxDepth , TraversalOrder traversalOrder ) {
84- ExprPropertyCalculator <E > exprHeightCalculator =
85- new ExprPropertyCalculator <>(navigableExpr .expr ());
8675 CelNavigableExprVisitor <E , T > visitor =
87- new CelNavigableExprVisitor <>(maxDepth , exprHeightCalculator , traversalOrder );
76+ new CelNavigableExprVisitor <>(
77+ maxDepth , navigableExpr .exprPropertyCalculator (), traversalOrder );
8878
8979 visitor .visit (navigableExpr );
9080
9181 return visitor .streamBuilder .build ();
9282 }
9383
9484 private void visit (T navigableExpr ) {
95- if (navigableExpr .depth () > MAX_DESCENDANTS_RECURSION_DEPTH - 1 ) {
96- throw new IllegalStateException ("Max recursion depth reached." );
85+ checkState (
86+ navigableExpr .depth () <= MAX_DESCENDANTS_RECURSION_DEPTH - 1 ,
87+ "Max recursion depth reached." );
88+ if (navigableExpr .depth () > maxDepth ) {
89+ return ;
9790 }
9891
99- boolean addToStream = navigableExpr .depth () <= maxDepth ;
100- if (addToStream && traversalOrder .equals (TraversalOrder .PRE_ORDER )) {
92+ if (traversalOrder .equals (TraversalOrder .PRE_ORDER )) {
10193 streamBuilder .add (navigableExpr );
10294 }
10395
@@ -124,7 +116,7 @@ private void visit(T navigableExpr) {
124116 break ;
125117 }
126118
127- if (addToStream && traversalOrder .equals (TraversalOrder .POST_ORDER )) {
119+ if (traversalOrder .equals (TraversalOrder .POST_ORDER )) {
128120 streamBuilder .add (navigableExpr );
129121 }
130122 }
@@ -177,15 +169,19 @@ private void visitExprList(java.util.List<E> list, T parent) {
177169 }
178170
179171 private T newNavigableChild (T parent , E expr ) {
180- ExprProperty exprProperty = exprPropertyCalculator .getProperty (expr .id ());
181-
182- return parent
183- .<T >builderFromInstance ()
184- .setExpr (expr )
185- .setDepth (parent .depth () + 1 )
186- .setHeight (exprProperty .height ())
187- .setMaxId (exprProperty .maxId ())
188- .setParent (parent )
189- .build ();
172+ return BaseNavigableExpr .buildWithProperties (
173+ parent .<T >builderFromInstance ().setDepth (parent .depth () + 1 ).setParent (parent ),
174+ expr ,
175+ exprPropertyCalculator );
176+ }
177+
178+ private CelNavigableExprVisitor (
179+ int maxDepth ,
180+ ExprPropertyCalculator <E > exprPropertyCalculator ,
181+ TraversalOrder traversalOrder ) {
182+ this .maxDepth = maxDepth ;
183+ this .exprPropertyCalculator = exprPropertyCalculator ;
184+ this .traversalOrder = traversalOrder ;
185+ this .streamBuilder = Stream .builder ();
190186 }
191187}
0 commit comments