package fr.inria.diversify.transformation; import fr.inria.diversify.util.Log; import spoon.compiler.Environment; import spoon.reflect.code.CtFor; import spoon.reflect.cu.SourcePosition; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; import spoon.reflect.factory.Factory; import spoon.reflect.visitor.DefaultJavaPrettyPrinter; import spoon.support.JavaOutputProcessor; import java.io.File; import java.io.IOException; /** * Created by Simon on 18/02/15. */ public class LoopPerforation extends SingleTransformation { CtFor loop; CtFor loopPerforated; @Override public String classLocationName() { return loop.getParent(CtType.class).getSimpleName(); } @Override public String packageLocationName() { return loop.getParent(CtPackage.class).getSimpleName(); } public String methodLocationName() { return loop.getParent(CtExecutable.class).getSimpleName(); } @Override public String getTransformationString() throws Exception { return null; } @Override public int line() { return loop.getPosition().getLine(); } @Override public void printJavaFile(String srcDir) throws IOException { CtType<?> type = loop.getParent(CtType.class); Factory factory = type.getFactory(); Environment env = factory.getEnvironment(); JavaOutputProcessor processor = new JavaOutputProcessor(new File(srcDir), new DefaultJavaPrettyPrinter(env)); processor.setFactory(factory); processor.createJavaFile(type); Log.debug("write type {} in directory {}", type.getQualifiedName(), srcDir); } @Override public void apply(String srcDir) throws Exception { Factory factory = loop.getFactory(); loopPerforated = factory.Core().clone(loop); loopPerforated.setParent(loop.getParent()); // loopPerforated.getForUpdate() printJavaFile(srcDir); } @Override public void applyWithParent(String srcDir) throws Exception { if (parent != null) { parent.apply(srcDir); } apply(srcDir); } @Override public void restore(String srcDir) throws Exception { if (parent != null) { parent.restore(srcDir); } try { loopPerforated.replace(loop); } catch (Throwable e) { e.printStackTrace(); Log.debug(""); } printJavaFile(srcDir); } @Override public SourcePosition getPosition() { return loop.getPosition(); } }