package fr.inria.diversify.transformation.query; import fr.inria.diversify.coverage.ICoverageReport; import fr.inria.diversify.diversification.InputProgram; import fr.inria.diversify.transformation.Transformation; import fr.inria.diversify.transformation.other.EmptyMethodBody; import fr.inria.diversify.transformation.other.ReplaceLiteral; import fr.inria.diversify.transformation.other.ReplaceNew; import spoon.reflect.code.*; import spoon.reflect.declaration.*; import java.util.List; import java.util.Random; /** * Created by Simon on 19/03/14. */ public class OtherQuery extends TransformationQuery { protected ICoverageReport coverageReport; public OtherQuery(InputProgram inputProgram) { super(inputProgram); } @Override public Transformation query() { return getEmptyMethodBody(); } private ReplaceLiteral getLiteralReplace() { ReplaceLiteral rl = new ReplaceLiteral(); List<CtElement> literals = getInputProgram().getAllElement(CtLiteral.class); int size = literals.size(); Random r = new Random(); CtElement literal = literals.get(r.nextInt(size)); while (inputProgram.getCoverageReport().elementCoverage(literal) == 0) { literal = literals.get(r.nextInt(size)); } rl.setTransplantationPoint((CtLiteral)literal); rl.setTransplant((CtLiteral)literals.get(r.nextInt(size))); return null; } private ReplaceNew getNewReplace() { ReplaceNew rn = new ReplaceNew(); List<CtElement> newClasses = getInputProgram().getAllElement(CtNewClass.class); int size = newClasses.size(); Random r = new Random(); CtElement newClass = newClasses.get(r.nextInt(size)); while (coverageReport.elementCoverage(newClass) == 0) { newClass = newClasses.get(r.nextInt(size)); } rn.setTransplantationPoint((CtNewClass) newClass); rn.setTransplant((CtNewClass)newClasses.get(r.nextInt(size))); return null; } protected EmptyMethodBody getEmptyMethodBody() { EmptyMethodBody emb = new EmptyMethodBody(); List<CtElement> methods = getInputProgram().getAllElement(CtMethod.class); int size = methods.size(); Random r = new Random(); CtMethod method = (CtMethod) methods.get(r.nextInt(size)); while (inputProgram.getCoverageReport().elementCoverage(method) == 0 || method.getBody() == null || method.getBody().getStatements() == null || method.getBody().getStatements().isEmpty() || method.getType().isPrimitive()) { method = (CtMethod) methods.get(r.nextInt(size)); } emb.setTransplantationPoint(method); return emb; } }