1010import org .slf4j .LoggerFactory ;
1111
1212import java .util .Collection ;
13+ import java .util .Map ;
1314import java .util .Optional ;
1415import java .util .Set ;
1516import java .util .stream .Collectors ;
1617
18+ import static gr .gousiosg .javacg .stat .graph .Utilities .nodeMap ;
19+
1720public class Pruning {
1821 private static final Logger LOGGER = LoggerFactory .getLogger (Pruning .class );
1922
@@ -27,12 +30,11 @@ public static void pruneOriginalGraph(StaticCallgraph callgraph, JacocoCoverage
2730 markConcreteBridgeTargets (callgraph .graph , callgraph .metadata );
2831 pruneBridgeMethods (callgraph .graph , callgraph .metadata );
2932 pruneConcreteMethods (callgraph .graph , callgraph .metadata , coverage );
30- pruneMethodsFromTests (callgraph .graph , callgraph .metadata , testArguments , coverage );
33+ // pruneMethodsFromTests(callgraph.graph, callgraph.metadata, testArguments, coverage);
3134 }
3235
3336 public static void pruneReachabilityGraph (Graph <ColoredNode , DefaultEdge > reachability , JarMetadata metadata , JacocoCoverage coverage , TestArguments testArguments ) {
34- pruneMethodsFromTestsThatAreReachable (reachability , metadata , testArguments , coverage );
35-
37+ // pruneMethodsFromTestsThatAreReachable(reachability, metadata, testArguments, coverage);
3638 }
3739
3840 /**
@@ -167,7 +169,42 @@ private static void pruneMethodsFromTests(Graph<String, DefaultEdge> graph, JarM
167169 * @param metadata the metadata of the graph
168170 */
169171 private static void pruneMethodsFromTestsThatAreReachable (Graph <ColoredNode , DefaultEdge > graph , JarMetadata metadata , TestArguments testArguments , JacocoCoverage coverage ) {
170- // TODO @WCYGAN: similar to the above, this will take the reachability graph and prune all nodes reachable ONLY from
171- // test methods within the reachability graph
172+ Map <String , ColoredNode > nodeMap = nodeMap (graph .vertexSet ());
173+
174+ var testTargetNodes = metadata .testMethods .stream ()
175+ .filter (nodeMap ::containsKey )
176+ .map (target -> graph .outgoingEdgesOf (nodeMap .get (target )))
177+ .flatMap (Collection ::stream )
178+ .map (graph ::getEdgeTarget )
179+ .collect (Collectors .toSet ());
180+
181+ var targetsToRemove = testTargetNodes .stream ()
182+ .filter (graph ::containsVertex )
183+ .filter (targetNode -> {
184+
185+ if (targetNode .covered ()) {
186+ return false ;
187+ }
188+
189+ if (coverage .containsMethod (targetNode .getLabel ())) {
190+ return false ;
191+ }
192+
193+ if (metadata .testMethods .contains (targetNode .getLabel ())) {
194+ return false ;
195+ }
196+
197+ for (var e : graph .incomingEdgesOf (targetNode )) {
198+ if (!metadata .testMethods .contains (graph .getEdgeSource (e ).getLabel ())) {
199+ return false ;
200+ }
201+ }
202+
203+ return true ;
204+ })
205+ .filter (targetNode -> !metadata .testMethods .contains (targetNode .getLabel ()))
206+ .collect (Collectors .toSet ());
207+
208+ targetsToRemove .forEach (graph ::removeVertex );
172209 }
173210}
0 commit comments