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.ShuffleStmtTransformation; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtReturn; import spoon.reflect.code.CtStatement; import spoon.reflect.code.CtSuperAccess; import spoon.reflect.declaration.CtElement; import java.util.List; import java.util.Random; /** * Created by Simon on 03/04/14. */ public class ShuffleStmtQuery extends TransformationQuery { protected ICoverageReport coverageReport; public ShuffleStmtQuery(InputProgram inputProgram) { super(inputProgram); coverageReport = inputProgram.getCoverageReport(); } @Override public Transformation query() { ShuffleStmtTransformation sst = new ShuffleStmtTransformation(); List<CtElement> objects = getInputProgram().getAllElement(CtBlock.class); Random r = new Random(); CtBlock block = (CtBlock) objects.get(r.nextInt(objects.size())); while (coverageReport.elementCoverage(block) == 0 || !isCandidate(block)) { block = (CtBlock) objects.get(r.nextInt(objects.size())); } sst.setTransformationPoint(block); return sst; } protected boolean isCandidate(CtBlock<?> block) { if(block.getStatements().size() >= 3) return true; if(block.getStatements().size() >= 2) { for (CtStatement stmt : block.getStatements()) if (stmt instanceof CtReturn || stmt instanceof CtSuperAccess) return false; return true; } return false; } }