package org.pitest.mutationtest.engine.gregor;
import java.util.Set;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.pitest.functional.F;
import org.pitest.functional.FCollection;
public class PreMutationMethodAnalyzer extends MethodVisitor {
private final Set<String> loggingClasses;
private int currentLineNumber;
private final PremutationClassInfo classInfo;
public PreMutationMethodAnalyzer(final Set<String> loggingClasses,
final PremutationClassInfo classInfo) {
super(Opcodes.ASM5, new TryWithResourcesMethodVisitor(classInfo));
this.classInfo = classInfo;
this.loggingClasses = loggingClasses;
}
@Override
public void visitMethodInsn(final int opcode, final String owner,
final String name, final String desc, boolean itf) {
if (FCollection.contains(this.loggingClasses, matches(owner))) {
this.classInfo.registerLineToAvoid(this.currentLineNumber);
}
super.visitMethodInsn(opcode, owner, name, desc, itf);
}
private static F<String, Boolean> matches(final String owner) {
return new F<String, Boolean>() {
@Override
public Boolean apply(final String a) {
return owner.startsWith(a);
}
};
}
@Override
public void visitLineNumber(final int line, final Label start) {
this.currentLineNumber = line;
super.visitLineNumber(line, start);
}
}