public MethodVisitor visitMethod()

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);
        }
      }
    };
  }