From b70644f35c061a68e48f0c3fb8bcb70c14da4811 Mon Sep 17 00:00:00 2001 From: Maxime CLEMENT Date: Tue, 8 Dec 2015 17:45:56 +0100 Subject: [PATCH 1/2] Fix bug related to "insertBefore()" and "getSignature()" --- .../support/reflect/code/CtStatementImpl.java | 8 +++++++- .../spoon/support/visitor/SignaturePrinter.java | 3 +++ .../spoon/test/processing/ProcessingTest.java | 17 +++++++++++++++++ .../test/processing/SampleForInsertBefore.java | 13 +++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/spoon/support/reflect/code/CtStatementImpl.java b/src/main/java/spoon/support/reflect/code/CtStatementImpl.java index f46f27954a1..687833353b0 100644 --- a/src/main/java/spoon/support/reflect/code/CtStatementImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtStatementImpl.java @@ -183,7 +183,13 @@ void insert(CtBlock block, CtStatementList statementsToBeInserted) { @Override void insertFromFirstStatement(CtBlock block, CtStatement target, CtStatementList statementsToBeInserted) { - int indexOfTargetElement = block.getStatements().indexOf(target); + int indexOfTargetElement = -1; + for (int i = 0; i < block.getStatements().size(); i++) { + if (block.getStatements().get(i) == target) { + indexOfTargetElement = i; + break; + } + } for (CtStatement s : statementsToBeInserted) { s.setParent(block); block.getStatements().add(indexOfTargetElement++, s); diff --git a/src/main/java/spoon/support/visitor/SignaturePrinter.java b/src/main/java/spoon/support/visitor/SignaturePrinter.java index fd8a290cd53..b2da78aa776 100644 --- a/src/main/java/spoon/support/visitor/SignaturePrinter.java +++ b/src/main/java/spoon/support/visitor/SignaturePrinter.java @@ -230,6 +230,9 @@ public void visitCtBreak(CtBreak breakStatement) { public void visitCtCase(CtCase caseStatement) { write("case ("); scan(caseStatement.getCaseExpression()); + for (CtStatement statement : caseStatement.getStatements()) { + scan(statement); + } write(")"); } diff --git a/src/test/java/spoon/test/processing/ProcessingTest.java b/src/test/java/spoon/test/processing/ProcessingTest.java index c35e18e3736..890a2f7d773 100644 --- a/src/test/java/spoon/test/processing/ProcessingTest.java +++ b/src/test/java/spoon/test/processing/ProcessingTest.java @@ -3,11 +3,14 @@ import org.junit.Test; import spoon.Launcher; import spoon.SpoonException; +import spoon.reflect.code.CtSwitch; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtMethod; +import spoon.reflect.visitor.filter.TypeFilter; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; import static spoon.test.TestUtils.build; @@ -41,6 +44,20 @@ public void testInsertBegin() throws Exception { + constructor.getSimpleName(), "int i = 0;", constructor.getBody().getStatement(1).toString()); } + + CtConstructor constructor = type.getConstructor(type.getFactory().Type().INTEGER_PRIMITIVE); + String myBeforeStatementAsString = "int before"; + for (CtSwitch ctSwitch : constructor.getElements(new TypeFilter>(CtSwitch.class))) { + ctSwitch.insertBefore(type.getFactory().Code() + .createCodeSnippetStatement(myBeforeStatementAsString)); + } + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(3).toString()); + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(5).toString()); + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(7).toString()); + + assertFalse("switch should not be the same", constructor.getBody().getStatement(6).equals(constructor.getBody().getStatement(8))); + assertFalse("switch should not be the same", constructor.getBody().getStatement(6).toString().equals(constructor.getBody().getStatement(8).toString())); + } @Test diff --git a/src/test/java/spoon/test/processing/SampleForInsertBefore.java b/src/test/java/spoon/test/processing/SampleForInsertBefore.java index e7d988a68b5..797692fefd3 100644 --- a/src/test/java/spoon/test/processing/SampleForInsertBefore.java +++ b/src/test/java/spoon/test/processing/SampleForInsertBefore.java @@ -11,6 +11,19 @@ public SampleForInsertBefore(int j) { this(j, 0); new Thread() { }; + switch (j) { + default: + break; + } + switch (j) { + default: + break; + } + switch (j) { + default: { + break; + } + } } public SampleForInsertBefore(int j, int k) { From 34c7300cacf66367e435dc60d611742a5501c5ec Mon Sep 17 00:00:00 2001 From: tdurieux Date: Wed, 9 Dec 2015 09:41:48 +0100 Subject: [PATCH 2/2] Fix insertAfter and insertEnd --- .../support/reflect/code/CtStatementImpl.java | 31 ++++--- .../support/visitor/SignaturePrinter.java | 4 +- .../spoon/test/processing/ProcessingTest.java | 90 +++++++++++++------ 3 files changed, 85 insertions(+), 40 deletions(-) diff --git a/src/main/java/spoon/support/reflect/code/CtStatementImpl.java b/src/main/java/spoon/support/reflect/code/CtStatementImpl.java index 687833353b0..c01f5039918 100644 --- a/src/main/java/spoon/support/reflect/code/CtStatementImpl.java +++ b/src/main/java/spoon/support/reflect/code/CtStatementImpl.java @@ -182,14 +182,10 @@ void insert(CtBlock block, CtStatementList statementsToBeInserted) { } @Override - void insertFromFirstStatement(CtBlock block, CtStatement target, CtStatementList statementsToBeInserted) { - int indexOfTargetElement = -1; - for (int i = 0; i < block.getStatements().size(); i++) { - if (block.getStatements().get(i) == target) { - indexOfTargetElement = i; - break; - } - } + void insertFromFirstStatement(CtBlock block, CtStatement target, + CtStatementList statementsToBeInserted) { + // check the reference not the equality + int indexOfTargetElement = indexOfReference(block.getStatements(), target); for (CtStatement s : statementsToBeInserted) { s.setParent(block); block.getStatements().add(indexOfTargetElement++, s); @@ -198,7 +194,8 @@ void insertFromFirstStatement(CtBlock block, CtStatement target, CtStatementL @Override void insertFromLastStatement(List statements, CtStatement target, CtStatementList statementsToBeInserted) { - int indexOfTargetElement = statements.indexOf(target); + // check the reference not the equality + int indexOfTargetElement = indexOfReference(statements, target); for (int j = statementsToBeInserted.getStatements().size() - 1; j >= 0; j--) { final CtStatement newStatement = statementsToBeInserted.getStatements().get(j); newStatement.setParent(statements.get(indexOfTargetElement).getParent()); @@ -214,7 +211,8 @@ void insert(CtBlock block, CtStatementList statementsToBeInserted) { @Override void insertFromFirstStatement(CtBlock block, CtStatement target, CtStatementList statementsToBeInserted) { - int indexOfTargetElement = block.getStatements().indexOf(target); + // check the reference not the equality + int indexOfTargetElement = indexOfReference(block.getStatements(), target); for (CtStatement s : statementsToBeInserted) { s.setParent(block); block.getStatements().add(++indexOfTargetElement, s); @@ -223,7 +221,7 @@ void insertFromFirstStatement(CtBlock block, CtStatement target, CtStatementL @Override void insertFromLastStatement(List statements, CtStatement target, CtStatementList statementsToBeInserted) { - int indexOfTargetElement = statements.indexOf(target) + 1; + int indexOfTargetElement = indexOfReference(statements, target) + 1; for (int j = statementsToBeInserted.getStatements().size() - 1; j >= 0; j--) { final CtStatement newStatement = statementsToBeInserted.getStatements().get(j); newStatement.setParent(target.getParent()); @@ -232,6 +230,17 @@ void insertFromLastStatement(List statements, CtStateme } }; + public int indexOfReference(List statements, CtElement target) { + int indexOfTargetElement = -1; + // check the reference not the equality + for (int i = 0; i < statements.size(); i++) { + if (statements.get(i) == target) { + indexOfTargetElement = i; + break; + } + } + return indexOfTargetElement; + } abstract void insert(CtBlock block, CtStatementList statementsToBeInserted); abstract void insertFromFirstStatement(CtBlock block, CtStatement target, CtStatementList statementsToBeInserted); abstract void insertFromLastStatement(List statements, CtStatement target, CtStatementList statementsToBeInserted); diff --git a/src/main/java/spoon/support/visitor/SignaturePrinter.java b/src/main/java/spoon/support/visitor/SignaturePrinter.java index b2da78aa776..eea15b4eb9c 100644 --- a/src/main/java/spoon/support/visitor/SignaturePrinter.java +++ b/src/main/java/spoon/support/visitor/SignaturePrinter.java @@ -231,8 +231,8 @@ public void visitCtCase(CtCase caseStatement) { write("case ("); scan(caseStatement.getCaseExpression()); for (CtStatement statement : caseStatement.getStatements()) { - scan(statement); - } + scan(statement); + } write(")"); } diff --git a/src/test/java/spoon/test/processing/ProcessingTest.java b/src/test/java/spoon/test/processing/ProcessingTest.java index 890a2f7d773..5dfe5ee3a71 100644 --- a/src/test/java/spoon/test/processing/ProcessingTest.java +++ b/src/test/java/spoon/test/processing/ProcessingTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import spoon.Launcher; import spoon.SpoonException; +import spoon.reflect.code.CtCodeSnippetStatement; import spoon.reflect.code.CtSwitch; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtConstructor; @@ -18,13 +19,11 @@ public class ProcessingTest { @Test public void testInsertBegin() throws Exception { - CtClass type = build("spoon.test.processing", - "SampleForInsertBefore"); + CtClass type = build("spoon.test.processing", "SampleForInsertBefore"); for (CtMethod meth : type.getMethods()) { int i = meth.getBody().getStatements().size(); - meth.getBody().insertBegin( - type.getFactory().Code() - .createCodeSnippetStatement("int i = 0;")); + meth.getBody().insertBegin(type.getFactory().Code() + .createCodeSnippetStatement("int i = 0;")); assertEquals("insert failed for method " + meth.getSimpleName(), i + 1, meth.getBody().getStatements().size()); assertEquals("insert failed for method " + meth.getSimpleName(), @@ -32,32 +31,69 @@ public void testInsertBegin() throws Exception { } for (CtConstructor constructor : type.getConstructors()) { int i = constructor.getBody().getStatements().size(); - constructor.getBody().insertBegin( - type.getFactory().Code() - .createCodeSnippetStatement("int i = 0;")); - assertEquals( - "insert failed for constructor " - + constructor.getSimpleName(), i + 1, constructor - .getBody().getStatements().size()); - assertEquals( - "insert failed for constructor " - + constructor.getSimpleName(), "int i = 0;", + constructor.getBody().insertBegin(type.getFactory().Code() + .createCodeSnippetStatement("int i = 0;")); + assertEquals("insert failed for constructor " + constructor.getSimpleName(), + i + 1, + constructor.getBody().getStatements().size()); + assertEquals("insert failed for constructor " + constructor.getSimpleName(), + "int i = 0;", constructor.getBody().getStatement(1).toString()); } - + + CtConstructor constructor = type.getConstructor(type.getFactory().Type().INTEGER_PRIMITIVE); + String myBeforeStatementAsString = "int before"; + for (CtSwitch ctSwitch : constructor.getElements(new TypeFilter>(CtSwitch.class))) { + ctSwitch.insertBefore(type.getFactory().Code() + .createCodeSnippetStatement(myBeforeStatementAsString)); + } + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(3).toString()); + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(5).toString()); + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(7).toString()); + + assertFalse("switch should not be the same", constructor.getBody().getStatement(6).equals(constructor.getBody().getStatement(8))); + assertFalse("switch should not be the same", constructor.getBody().getStatement(6).toString().equals(constructor.getBody().getStatement(8).toString())); + + } + + @Test + public void testInsertEnd() throws Exception { + CtClass type = build("spoon.test.processing", "SampleForInsertBefore"); + for (CtMethod meth : type.getMethods()) { + int i = meth.getBody().getStatements().size(); + meth.getBody().insertEnd(type.getFactory().Code() + .createCodeSnippetStatement("int i = 0")); + assertEquals("insert failed for method " + meth.getSimpleName(), + i + 1, meth.getBody().getStatements().size()); + assertEquals("insert failed for method " + meth.getSimpleName(), + "int i = 0", meth.getBody().getStatement(meth.getBody().getStatements().size() - 1).toString()); + } + for (CtConstructor constructor : type.getConstructors()) { + int i = constructor.getBody().getStatements().size(); + constructor.getBody().insertEnd(type.getFactory().Code() + .createCodeSnippetStatement("int i = 0")); + assertEquals("insert failed for constructor " + constructor.getSimpleName(), + i + 1, + constructor.getBody().getStatements().size()); + assertEquals("insert failed for constructor", + "int i = 0", + constructor.getBody().getStatement(constructor.getBody().getStatements().size() - 1).toString()); + } + CtConstructor constructor = type.getConstructor(type.getFactory().Type().INTEGER_PRIMITIVE); - String myBeforeStatementAsString = "int before"; - for (CtSwitch ctSwitch : constructor.getElements(new TypeFilter>(CtSwitch.class))) { - ctSwitch.insertBefore(type.getFactory().Code() - .createCodeSnippetStatement(myBeforeStatementAsString)); - } - assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(3).toString()); - assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(5).toString()); - assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(7).toString()); + String myBeforeStatementAsString = "int after"; + for (CtSwitch ctSwitch : constructor.getElements(new TypeFilter>(CtSwitch.class))) { + ctSwitch.insertAfter(type.getFactory().Code() + .createCodeSnippetStatement(myBeforeStatementAsString)); + } + System.out.println(type); + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(3).toString()); + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(5).toString()); + assertEquals("insert has not been done at the right position", myBeforeStatementAsString, constructor.getBody().getStatement(7).toString()); + + assertFalse("switch should not be the same", constructor.getBody().getStatement(6).equals(constructor.getBody().getStatement(8))); + assertFalse("switch should not be the same", constructor.getBody().getStatement(6).toString().equals(constructor.getBody().getStatement(8).toString())); - assertFalse("switch should not be the same", constructor.getBody().getStatement(6).equals(constructor.getBody().getStatement(8))); - assertFalse("switch should not be the same", constructor.getBody().getStatement(6).toString().equals(constructor.getBody().getStatement(8).toString())); - } @Test