package fr.inria.diversify.transformation; import fr.inria.diversify.util.Log; import org.json.JSONException; import org.json.JSONObject; import spoon.compiler.Environment; import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; import spoon.reflect.declaration.CtElement; 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 02/04/14. */ @Deprecated public abstract class SpoonTransformation<P extends CtElement, T extends CtElement> extends SourceCodeTransformation { protected P transformationPoint; protected T transplant; public void printJavaFile(String directory) throws IOException { printJavaFile(directory, null); } protected void printJavaFile(String directory, CtType<?> cl) throws IOException { CtType<?> type; if(cl == null) type = getOriginalClass(); else type = cl; Factory factory = type.getFactory(); Environment env = factory.getEnvironment(); JavaOutputProcessor processor = new JavaOutputProcessor(new File(directory), new DefaultJavaPrettyPrinter(env)); processor.setFactory(factory); processor.createJavaFile(type); Log.debug("copy file: " + directory + " " + type.getQualifiedName()); } public CtType<?> getOriginalClass() { return transformationPoint.getPosition().getCompilationUnit().getMainType(); } public String classLocationName() { CtType c = transformationPoint.getParent(CtType.class); if(c == null && transformationPoint instanceof CtType) c = (CtType) transformationPoint; if(c == null) return "null"; return c.getQualifiedName(); } public String packageLocationName() { CtPackage p = transformationPoint.getParent(CtPackage.class); if(p == null && transformationPoint instanceof CtPackage) p = (CtPackage) transformationPoint; return p.getQualifiedName(); } public String methodLocationName() { CtExecutable elem = transformationPoint.getParent(CtExecutable.class); if(elem != null) return elem.getSimpleName(); return "null"; } @Override public int line() { return transformationPoint.getPosition().getLine(); } public void removeSourceCode() { CompilationUnit compileUnit = transformationPoint.getPosition().getCompilationUnit(); // if(compileUnit.getSourceCodeFragments() != null) // compileUnit.getSourceCodeFragments().clear(); } public void setTransformationPoint(P object) { this.transformationPoint = object; } public P getTransformationPoint() { return transformationPoint; } public void setTransplant(T transplant) { this.transplant = transplant; } public T getTransplant() { return transplant; } @Override public JSONObject toJSONObject() throws JSONException { JSONObject json = super.toJSONObject(); json.put("transformationPoint", getCtElementJSonString(transformationPoint)); if(transplant != null) json.put("transplant", getCtElementJSonString(transplant)); return json; } @Override public String getTransformationString() throws Exception { return getTransformationString(transformationPoint); } public int hashCode() { return super.hashCode() * transformationPoint.getPosition().hashCode() * transformationPoint.getPosition().getLine(); } protected String getCtElementJSonString(CtElement element) { return element.getParent(CtPackage.class).getQualifiedName() + "." + element.getPosition().getCompilationUnit().getMainType().getSimpleName() + ":" + element.getPosition().getLine(); } public boolean equals(Object other) { if(!this.getClass().isAssignableFrom(other.getClass())) return false; SpoonTransformation otherTransformation = (SpoonTransformation)other; return status == otherTransformation.status && failures.equals(otherTransformation.failures) && transformationPoint.equals(otherTransformation.transformationPoint) && transformationPoint.getPosition().equals(otherTransformation.transformationPoint.getPosition()); } protected void logInfo() { Log.debug("transformation: {}, {}",type,name); Log.debug("transformationPoint:\n {}", transformationPoint); Log.debug("--------------------\nposition: {}", transformationPoint.getPosition()); if(transplant != null) { Log.debug("transplant:\n {}", transplant); Log.debug("--------------------\nposition: {}", transplant.getPosition()); } } @Override public SourcePosition getPosition() { return transformationPoint.getPosition(); } }