package fr.inria.diversify.processor.main; import fr.inria.diversify.diversification.InputProgram;; import fr.inria.diversify.processor.ProcessorUtil; import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtCodeSnippetStatement; import spoon.reflect.code.CtInvocation; import spoon.reflect.code.CtTry; import spoon.reflect.declaration.CtMethod; import spoon.reflect.factory.Factory; import spoon.reflect.visitor.QueryVisitor; import spoon.reflect.visitor.filter.TypeFilter; /** * User: Simon * Date: 06/01/14 * Time: 10:04 */ public class MethodCallInstrumenter extends AbstractLoggingInstrumenter<CtMethod> { public MethodCallInstrumenter(InputProgram inputProgram) { super(inputProgram); } @Override public boolean isToBeProcessed(CtMethod candidate) { return !candidate.isImplicit() && candidate.getBody() != null && candidate.getBody().getStatements().size() != 0 && hasCall(candidate) && !containsGoto(candidate); } @Override public void process(CtMethod candidate) { CtTry ctTry = tryFinallyBody(candidate); int methodId = methodId(candidate); Factory factory = candidate.getFactory(); // CtTry ctTry = factory.Core().createTry(); // ctTry.setBody(candidate.getBody()); String snippet = getLogger() + ".methodIn(Thread.currentThread(),\"" + methodId + "\")"; CtCodeSnippetStatement beginStmt = getFactory().Code().createCodeSnippetStatement(snippet); ctTry.getBody().insertBegin(beginStmt); snippet = getLogger() + ".methodOut(Thread.currentThread(),\"" + methodId + "\")"; CtCodeSnippetStatement endStmt = getFactory().Code().createCodeSnippetStatement(snippet); // CtBlock finalizerBlock = factory.Core().createBlock(); ctTry.getFinalizer().addStatement(endStmt); // ctTry.setFinalizer(finalizerBlock); // CtBlock methodBlock = factory.Core().createBlock(); // methodBlock.addStatement(ctTry); // candidate.setBody(methodBlock); } protected boolean hasCall(CtMethod method) { QueryVisitor query = new QueryVisitor(new TypeFilter(CtInvocation.class)); method.accept(query); for(Object o : query.getResult()) { CtInvocation target = (CtInvocation) o; if(target.getExecutable() != null && target.getExecutable().getDeclaration() != null) if (inputProgram.getAllElement(CtMethod.class).contains(target.getExecutable().getDeclaration())) { return true; } } return false; } }