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