From 5fcf05a75f3931883d79ec093053e24d93a9f3e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20Vojt=C4=9Bchovsk=C3=BD?=
Date: Sat, 26 May 2018 12:51:47 +0200
Subject: [PATCH] fix wrong code and tests which makes invalid AST
---
.../compiler/SnippetCompilationHelper.java | 3 +
.../support/reflect/code/CtCaseImpl.java | 6 +-
.../support/reflect/code/CtStatementImpl.java | 12 ++++
.../reflect/code/CtStatementListImpl.java | 6 +-
.../reflect/eval/VisitorPartialEvaluator.java | 4 +-
.../generating/CtBiScannerGenerator.java | 2 +
.../ReplacementVisitorGenerator.java | 2 +
.../spoon/test/signature/SignatureTest.java | 4 +-
.../InsertBlockProcessor.java | 4 +-
.../spoon/testing/CtPackageAssertTest.java | 57 +++++++++++++++++--
10 files changed, 87 insertions(+), 13 deletions(-)
diff --git a/src/main/java/spoon/support/compiler/SnippetCompilationHelper.java b/src/main/java/spoon/support/compiler/SnippetCompilationHelper.java
index 468af8a3d05..4edec2da07a 100644
--- a/src/main/java/spoon/support/compiler/SnippetCompilationHelper.java
+++ b/src/main/java/spoon/support/compiler/SnippetCompilationHelper.java
@@ -92,6 +92,9 @@ private static CtStatement internalCompileStatement(CtElement st, CtTypeReferenc
// Clean up
c.getPackage().removeType(c);
+ //disconnect element from the parent, so it can be added to another model
+ ret.delete();
+
if (ret instanceof CtClass) {
CtClass klass = (CtClass) ret;
ret.getFactory().Package().getRootPackage().addType(klass);
diff --git a/src/main/java/spoon/support/reflect/code/CtCaseImpl.java b/src/main/java/spoon/support/reflect/code/CtCaseImpl.java
index 52da7b5fc12..2269d138623 100644
--- a/src/main/java/spoon/support/reflect/code/CtCaseImpl.java
+++ b/src/main/java/spoon/support/reflect/code/CtCaseImpl.java
@@ -140,7 +140,11 @@ public T insertEnd(CtStatement statement) {
@Override
public T insertEnd(CtStatementList statements) {
- for (CtStatement s : statements.getStatements()) {
+ List tobeInserted = new ArrayList<>(statements.getStatements());
+ //remove statements from the `statementsToBeInserted` before they are added to spoon model
+ //note: one element MUST NOT be part of two models.
+ statements.setStatements(null);
+ for (CtStatement s : tobeInserted) {
insertEnd(s);
}
return (T) this;
diff --git a/src/main/java/spoon/support/reflect/code/CtStatementImpl.java b/src/main/java/spoon/support/reflect/code/CtStatementImpl.java
index c30ac1342e4..ee55e23243a 100644
--- a/src/main/java/spoon/support/reflect/code/CtStatementImpl.java
+++ b/src/main/java/spoon/support/reflect/code/CtStatementImpl.java
@@ -186,6 +186,9 @@ void insertFromFirstStatement(CtBlock> block, CtStatement target, CtStatementL
for (CtStatement ctStatement : statementsToBeInserted) {
copy.add(indexOfTargetElement++, ctStatement);
}
+ //remove statements from the `statementsToBeInserted` before they are added to spoon model
+ //note: one element MUST NOT be part of two models.
+ statementsToBeInserted.setStatements(null);
block.setStatements(copy);
}
@@ -196,6 +199,9 @@ List insertFromLastStatement(List statements, CtStat
for (int j = statementsToBeInserted.getStatements().size() - 1; j >= 0; j--) {
copy.add(indexOfTargetElement, (T) statementsToBeInserted.getStatements().get(j));
}
+ //remove statements from the `statementsToBeInserted` before they are added to spoon model
+ //note: one element MUST NOT be part of two models.
+ statementsToBeInserted.setStatements(null);
return copy;
}
},
@@ -212,6 +218,9 @@ void insertFromFirstStatement(CtBlock> block, CtStatement target, CtStatementL
for (CtStatement s : statementsToBeInserted) {
copy.add(++indexOfTargetElement, s);
}
+ //remove statements from the `statementsToBeInserted` before they are added to spoon model
+ //note: one element MUST NOT be part of two models.
+ statementsToBeInserted.setStatements(null);
block.setStatements(copy);
}
@@ -222,6 +231,9 @@ List insertFromLastStatement(List statements, CtStat
for (int j = statementsToBeInserted.getStatements().size() - 1; j >= 0; j--) {
copy.add(indexOfTargetElement, (T) statementsToBeInserted.getStatements().get(j));
}
+ //remove statements from the `statementsToBeInserted` before they are added to spoon model
+ //note: one element MUST NOT be part of two models.
+ statementsToBeInserted.setStatements(null);
return copy;
}
};
diff --git a/src/main/java/spoon/support/reflect/code/CtStatementListImpl.java b/src/main/java/spoon/support/reflect/code/CtStatementListImpl.java
index a5cb0fcc89a..a265a2065a6 100644
--- a/src/main/java/spoon/support/reflect/code/CtStatementListImpl.java
+++ b/src/main/java/spoon/support/reflect/code/CtStatementListImpl.java
@@ -124,7 +124,11 @@ public T insertEnd(CtStatement statement) {
@Override
public T insertEnd(CtStatementList statements) {
- for (CtStatement s : statements.getStatements()) {
+ List tobeInserted = new ArrayList<>(statements.getStatements());
+ //remove statements from the `statementsToBeInserted` before they are added to spoon model
+ //note: one element MUST NOT be part of two models.
+ statements.setStatements(null);
+ for (CtStatement s : tobeInserted) {
insertEnd(s);
}
return (T) this;
diff --git a/src/main/java/spoon/support/reflect/eval/VisitorPartialEvaluator.java b/src/main/java/spoon/support/reflect/eval/VisitorPartialEvaluator.java
index d3f2787f718..9b45562042c 100644
--- a/src/main/java/spoon/support/reflect/eval/VisitorPartialEvaluator.java
+++ b/src/main/java/spoon/support/reflect/eval/VisitorPartialEvaluator.java
@@ -256,8 +256,8 @@ public void visitCtBlock(CtBlock block) {
if (res instanceof CtStatement) {
b.addStatement((CtStatement) res);
} else {
- //the context expectes statement. We cannot simplify in this case
- b.addStatement(s);
+ //the context expects statement. We cannot simplify in this case
+ b.addStatement(s.clone());
}
}
// do not copy unreachable statements
diff --git a/src/test/java/spoon/generating/CtBiScannerGenerator.java b/src/test/java/spoon/generating/CtBiScannerGenerator.java
index 2b42fbf6b46..25b9d8c2978 100644
--- a/src/test/java/spoon/generating/CtBiScannerGenerator.java
+++ b/src/test/java/spoon/generating/CtBiScannerGenerator.java
@@ -104,6 +104,8 @@ public void process() {
private CtClass