in instrumentation/src/com/intellij/rt/coverage/instrumentation/InstrumentationVisitor.java [74:105]
public MethodVisitor visitMethod(final int access, final String name, final String descriptor, final String signature, final String[] exceptions) {
myContext.resetMethod();
myContext.put(Key.METHOD_ACCESS, access);
myContext.put(Key.METHOD_NAME, name);
myContext.put(Key.METHOD_DESC, descriptor);
myContext.put(Key.METHOD_SIGNATURE, signature);
myContext.put(Key.EXCEPTIONS, exceptions);
if (!shouldInstrumentMethod(access)) return super.visitMethod(access, name, descriptor, signature, exceptions);
boolean branchCoverage = getOptions().isBranchCoverage;
final CoverageEnumerator enumerator = getOptions().isInstructionCoverage
? new CoverageEnumeratorWithInstructions(myContext, branchCoverage)
: new CoverageEnumerator(myContext, branchCoverage);
MethodVisitor mv = chainFilters(enumerator, FilterUtils.createLineFilters());
if (branchCoverage) {
mv = chainFilters(mv, FilterUtils.createBranchFilters());
}
return new MethodVisitor(Opcodes.API_VERSION, mv) {
@Override
public void visitEnd() {
super.visitEnd();
if (myDataAccess.getDataAccess() != EmptyCoverageDataAccess.INSTANCE) {
MethodVisitor methodVisitor = InstrumentationVisitor.super.visitMethod(access, name, descriptor, signature, exceptions);
MethodVisitor hitsVisitor = new InsertLineAfterJumpVisitor(new HitsVisitor(methodVisitor));
enumerator.accept(myContext.hasNoLinesInCurrentMethod() ? methodVisitor : hitsVisitor);
}
}
};
}