public void visitMethodInsn()

in instrumentation/src/com/intellij/rt/coverage/instrumentation/filters/lines/KotlinCoroutinesFilter.java [102:137]


  public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
    super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);

    if (myState == 3 && opcode == Opcodes.INVOKESPECIAL
        && "java/lang/IllegalStateException".equals(owner)
        && "<init>".equals(name) && "(Ljava/lang/String;)V".equals(descriptor)) {
      myState = 4;
    } else {
      myState = 0;
      myHasInstructions = true;
    }

    boolean getCoroutinesSuspendedVisited = opcode == Opcodes.INVOKESTATIC
        && owner.equals("kotlin/coroutines/intrinsics/IntrinsicsKt")
        && name.equals("getCOROUTINE_SUSPENDED")
        && descriptor.equals("()" + InstrumentationUtils.OBJECT_TYPE);
    String originalDesc = descriptor;
    if (name.endsWith(KotlinDefaultArgsBranchFilter.DEFAULT_ARGS_SUFFIX)) {
      String desc = KotlinDefaultArgsBranchFilter.getOriginalNameAndDesc(name, descriptor);
      int index = desc.indexOf('(');
      if (index > 0) {
        originalDesc = desc.substring(index);
      }
    }
    boolean suspendCallVisited = originalDesc.endsWith("Lkotlin/coroutines/Continuation;)" + InstrumentationUtils.OBJECT_TYPE)
        || owner.startsWith("kotlin/jvm/functions/Function")
        && name.equals("invoke") && opcode == Opcodes.INVOKEINTERFACE
        && descriptor.endsWith(")" + InstrumentationUtils.OBJECT_TYPE);
    if (getCoroutinesSuspendedVisited || suspendCallVisited) {
      myGetCoroutinesSuspendedVisited |= getCoroutinesSuspendedVisited;
      mySuspendCallVisited |= suspendCallVisited;
    } else {
      myGetCoroutinesSuspendedVisited = false;
      mySuspendCallVisited = false;
    }
  }