From 61a2fd713da5ef5751298ba927f02d12617b6a58 Mon Sep 17 00:00:00 2001 From: Mr-Pine Date: Fri, 5 Apr 2024 19:57:43 +0200 Subject: [PATCH 1/3] Add test for building CFG for constructor --- .../ForwardFlowBuilderVisitorTest.java | 30 +++++++++++++++++-- .../control-flow/ControlFlowArithmetic.java | 4 +++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/spoon-control-flow/src/test/java/fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java b/spoon-control-flow/src/test/java/fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java index 89f0f387dfd..c3afbfe7aa9 100644 --- a/spoon-control-flow/src/test/java/fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java +++ b/spoon-control-flow/src/test/java/fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java @@ -25,15 +25,17 @@ import org.junit.jupiter.api.Test; import spoon.processing.AbstractProcessor; import spoon.processing.ProcessingManager; +import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtMethod; import spoon.reflect.factory.Factory; import spoon.support.QueueProcessingManager; import java.io.PrintWriter; +import java.net.URISyntaxException; -import static fr.inria.controlflow.BranchKind.BRANCH; -import static fr.inria.controlflow.BranchKind.STATEMENT; +import static fr.inria.controlflow.BranchKind.*; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; /** * Created by marodrig on 14/10/2015. @@ -331,6 +333,30 @@ public void testInvocation() throws Exception { testEdges(graph, 1, 0, 0, null); } + @Test + public void testConstructor() throws URISyntaxException, ClassNotFoundException, IllegalAccessException, InstantiationException { + ControlFlowBuilder visitor = new ControlFlowBuilder(); + + Factory factory = new SpoonMetaFactory().buildNewFactory(this.getClass().getResource("/control-flow").toURI().getPath(), 17); + ProcessingManager pm = new QueueProcessingManager(factory); + pm.addProcessor(new AbstractProcessor>() { + @Override + public void process(CtConstructor element) { + if (!element.getBody().getStatements().isEmpty()) { + visitor.build(element); + } + } + + }); + pm.process(factory.getModel().getRootPackage()); + + ControlFlowGraph graph = visitor.getResult(); + ControlFlowNode entryNode = graph.findNodesOfKind(BEGIN).getFirst(); + ControlFlowNode exitNode = graph.getExitNode(); + + assertFalse(graph.containsEdge(entryNode, exitNode), "Graph is missing statements"); + } + @Test public void testtestCase() throws Exception { //branchCount, stmntCount, totalCount diff --git a/spoon-control-flow/src/test/resources/control-flow/ControlFlowArithmetic.java b/spoon-control-flow/src/test/resources/control-flow/ControlFlowArithmetic.java index 6f369c94a44..776f57bb71b 100644 --- a/spoon-control-flow/src/test/resources/control-flow/ControlFlowArithmetic.java +++ b/spoon-control-flow/src/test/resources/control-flow/ControlFlowArithmetic.java @@ -383,6 +383,10 @@ public int simple(int a) { return 10 * a; } + public ControlFlowArithmetic() { + int a = 1; + } + /////////////////////////////////////////////////////////////////////////////////////////// From 9b688874c3b951868fe25055e60b88c0c691c2fa Mon Sep 17 00:00:00 2001 From: Mr-Pine Date: Fri, 5 Apr 2024 19:57:55 +0200 Subject: [PATCH 2/3] Build CFG for constructor --- .../main/java/fr/inria/controlflow/ControlFlowBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spoon-control-flow/src/main/java/fr/inria/controlflow/ControlFlowBuilder.java b/spoon-control-flow/src/main/java/fr/inria/controlflow/ControlFlowBuilder.java index aef9d87689b..fbf881d0215 100644 --- a/spoon-control-flow/src/main/java/fr/inria/controlflow/ControlFlowBuilder.java +++ b/spoon-control-flow/src/main/java/fr/inria/controlflow/ControlFlowBuilder.java @@ -443,8 +443,8 @@ public void visitCtConditional(CtConditional conditional) { } @Override - public void visitCtConstructor(CtConstructor c) { - + public void visitCtConstructor(CtConstructor constructor) { + constructor.getBody().accept(this); } @Override From ed8e0536f5ed07fc7381747178c47c84f36a4654 Mon Sep 17 00:00:00 2001 From: Mr-Pine Date: Sat, 6 Apr 2024 12:30:05 +0200 Subject: [PATCH 3/3] Use .get(0) instead of getFirst --- .../fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spoon-control-flow/src/test/java/fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java b/spoon-control-flow/src/test/java/fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java index c3afbfe7aa9..2ddc71abbd1 100644 --- a/spoon-control-flow/src/test/java/fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java +++ b/spoon-control-flow/src/test/java/fr/inria/controlflow/ForwardFlowBuilderVisitorTest.java @@ -351,7 +351,7 @@ public void process(CtConstructor element) { pm.process(factory.getModel().getRootPackage()); ControlFlowGraph graph = visitor.getResult(); - ControlFlowNode entryNode = graph.findNodesOfKind(BEGIN).getFirst(); + ControlFlowNode entryNode = graph.findNodesOfKind(BEGIN).get(0); ControlFlowNode exitNode = graph.getExitNode(); assertFalse(graph.containsEdge(entryNode, exitNode), "Graph is missing statements");