private boolean classAlreadyHasCoverage()

in util/src/com/intellij/rt/coverage/instrumentation/AbstractIntellijClassfileTransformer.java [95:133]


  private boolean classAlreadyHasCoverage(byte[] classFileBuffer) {
    final boolean[] hasCoverage = new boolean[]{false};

    new ClassReader(classFileBuffer).accept(new ClassVisitor(Opcodes.API_VERSION) {
      @Override
      public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
        if ("__$hits$__".equals(name)) {
          hasCoverage[0] = true;
        }
        return super.visitField(access, name, descriptor, signature, value);
      }

      @Override
      public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
        MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions);
        return new MethodVisitor(Opcodes.API_VERSION, methodVisitor) {
          @Override
          public void visitLdcInsn(Object value) {
            super.visitLdcInsn(value);
            if (value instanceof ConstantDynamic) {
              ConstantDynamic condy = (ConstantDynamic) value;
              if ("com/intellij/rt/coverage/util/CondyUtils".equals(condy.getDescriptor())) {
                hasCoverage[0] = true;
              }
            }
          }

          @Override
          public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
            super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
            if ("com/intellij/rt/coverage/instrumentation/CoverageRuntime".equals(owner)) {
              hasCoverage[0] = true;
            }
          }
        };
      }
    }, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG);
    return hasCoverage[0];
  }