xref: /aosp_15_r20/external/guava/refactorings/TraverserRewrite.java (revision fb5080426417cab6bd44d0ed3f37e47d42859579)
1*fb508042SAndroid Build Coastguard Worker /*
2*fb508042SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Guava Authors
3*fb508042SAndroid Build Coastguard Worker  *
4*fb508042SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*fb508042SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*fb508042SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*fb508042SAndroid Build Coastguard Worker  *
8*fb508042SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
9*fb508042SAndroid Build Coastguard Worker  *
10*fb508042SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*fb508042SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*fb508042SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*fb508042SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*fb508042SAndroid Build Coastguard Worker  * limitations under the License.
15*fb508042SAndroid Build Coastguard Worker  */
16*fb508042SAndroid Build Coastguard Worker 
17*fb508042SAndroid Build Coastguard Worker import com.google.common.collect.TreeTraverser;
18*fb508042SAndroid Build Coastguard Worker import com.google.common.graph.Traverser;
19*fb508042SAndroid Build Coastguard Worker import com.google.errorprone.refaster.annotation.AfterTemplate;
20*fb508042SAndroid Build Coastguard Worker import com.google.errorprone.refaster.annotation.BeforeTemplate;
21*fb508042SAndroid Build Coastguard Worker import com.google.errorprone.refaster.annotation.Placeholder;
22*fb508042SAndroid Build Coastguard Worker 
23*fb508042SAndroid Build Coastguard Worker /**
24*fb508042SAndroid Build Coastguard Worker  * Refaster rules to rewrite usages of {@code com.google.common.collect.TreeTraverser} in terms of
25*fb508042SAndroid Build Coastguard Worker  * {@code com.google.common.graph.Traverser}.
26*fb508042SAndroid Build Coastguard Worker  */
27*fb508042SAndroid Build Coastguard Worker @SuppressWarnings("DefaultPackage")
28*fb508042SAndroid Build Coastguard Worker public class TraverserRewrite {
29*fb508042SAndroid Build Coastguard Worker   abstract class TreeTraverserPreOrder<N> {
30*fb508042SAndroid Build Coastguard Worker     @Placeholder
getChildren(N node)31*fb508042SAndroid Build Coastguard Worker     abstract Iterable<N> getChildren(N node);
32*fb508042SAndroid Build Coastguard Worker 
33*fb508042SAndroid Build Coastguard Worker     @BeforeTemplate
before1(N root)34*fb508042SAndroid Build Coastguard Worker     Iterable<N> before1(N root) {
35*fb508042SAndroid Build Coastguard Worker       return TreeTraverser.using((N node) -> getChildren(node)).preOrderTraversal(root);
36*fb508042SAndroid Build Coastguard Worker     }
37*fb508042SAndroid Build Coastguard Worker 
38*fb508042SAndroid Build Coastguard Worker     @BeforeTemplate
before2(N root)39*fb508042SAndroid Build Coastguard Worker     Iterable<N> before2(N root) {
40*fb508042SAndroid Build Coastguard Worker       return new TreeTraverser<N>() {
41*fb508042SAndroid Build Coastguard Worker         @Override
42*fb508042SAndroid Build Coastguard Worker         public Iterable<N> children(N node) {
43*fb508042SAndroid Build Coastguard Worker           return getChildren(node);
44*fb508042SAndroid Build Coastguard Worker         }
45*fb508042SAndroid Build Coastguard Worker       }.preOrderTraversal(root);
46*fb508042SAndroid Build Coastguard Worker     }
47*fb508042SAndroid Build Coastguard Worker 
48*fb508042SAndroid Build Coastguard Worker     @AfterTemplate
after(N root)49*fb508042SAndroid Build Coastguard Worker     Iterable<N> after(N root) {
50*fb508042SAndroid Build Coastguard Worker       return Traverser.forTree((N node) -> getChildren(node)).depthFirstPreOrder(root);
51*fb508042SAndroid Build Coastguard Worker     }
52*fb508042SAndroid Build Coastguard Worker   }
53*fb508042SAndroid Build Coastguard Worker 
54*fb508042SAndroid Build Coastguard Worker   abstract class TreeTraverserPostOrder<N> {
55*fb508042SAndroid Build Coastguard Worker     @Placeholder
56*fb508042SAndroid Build Coastguard Worker     abstract Iterable<N> getChildren(N node);
57*fb508042SAndroid Build Coastguard Worker 
58*fb508042SAndroid Build Coastguard Worker     @BeforeTemplate
59*fb508042SAndroid Build Coastguard Worker     Iterable<N> before1(N root) {
60*fb508042SAndroid Build Coastguard Worker       return TreeTraverser.using((N node) -> getChildren(node)).postOrderTraversal(root);
61*fb508042SAndroid Build Coastguard Worker     }
62*fb508042SAndroid Build Coastguard Worker 
63*fb508042SAndroid Build Coastguard Worker     @BeforeTemplate
64*fb508042SAndroid Build Coastguard Worker     Iterable<N> before2(N root) {
65*fb508042SAndroid Build Coastguard Worker       return new TreeTraverser<N>() {
66*fb508042SAndroid Build Coastguard Worker         @Override
67*fb508042SAndroid Build Coastguard Worker         public Iterable<N> children(N node) {
68*fb508042SAndroid Build Coastguard Worker           return getChildren(node);
69*fb508042SAndroid Build Coastguard Worker         }
70*fb508042SAndroid Build Coastguard Worker       }.postOrderTraversal(root);
71*fb508042SAndroid Build Coastguard Worker     }
72*fb508042SAndroid Build Coastguard Worker 
73*fb508042SAndroid Build Coastguard Worker     @AfterTemplate
74*fb508042SAndroid Build Coastguard Worker     Iterable<N> after(N root) {
75*fb508042SAndroid Build Coastguard Worker       return Traverser.forTree((N node) -> getChildren(node)).depthFirstPostOrder(root);
76*fb508042SAndroid Build Coastguard Worker     }
77*fb508042SAndroid Build Coastguard Worker   }
78*fb508042SAndroid Build Coastguard Worker 
79*fb508042SAndroid Build Coastguard Worker   abstract class TreeTraverserBreadthFirst<N> {
80*fb508042SAndroid Build Coastguard Worker     @Placeholder
81*fb508042SAndroid Build Coastguard Worker     abstract Iterable<N> getChildren(N node);
82*fb508042SAndroid Build Coastguard Worker 
83*fb508042SAndroid Build Coastguard Worker     @BeforeTemplate
84*fb508042SAndroid Build Coastguard Worker     Iterable<N> before1(N root) {
85*fb508042SAndroid Build Coastguard Worker       return TreeTraverser.using((N node) -> getChildren(node)).breadthFirstTraversal(root);
86*fb508042SAndroid Build Coastguard Worker     }
87*fb508042SAndroid Build Coastguard Worker 
88*fb508042SAndroid Build Coastguard Worker     @BeforeTemplate
89*fb508042SAndroid Build Coastguard Worker     Iterable<N> before2(N root) {
90*fb508042SAndroid Build Coastguard Worker       return new TreeTraverser<N>() {
91*fb508042SAndroid Build Coastguard Worker         @Override
92*fb508042SAndroid Build Coastguard Worker         public Iterable<N> children(N node) {
93*fb508042SAndroid Build Coastguard Worker           return getChildren(node);
94*fb508042SAndroid Build Coastguard Worker         }
95*fb508042SAndroid Build Coastguard Worker       }.breadthFirstTraversal(root);
96*fb508042SAndroid Build Coastguard Worker     }
97*fb508042SAndroid Build Coastguard Worker 
98*fb508042SAndroid Build Coastguard Worker     @AfterTemplate
99*fb508042SAndroid Build Coastguard Worker     Iterable<N> after(N root) {
100*fb508042SAndroid Build Coastguard Worker       return Traverser.forTree((N node) -> getChildren(node)).breadthFirst(root);
101*fb508042SAndroid Build Coastguard Worker     }
102*fb508042SAndroid Build Coastguard Worker   }
103*fb508042SAndroid Build Coastguard Worker }
104