in sources/java-incremental-compilation/jvm-inc-builder/src/com/intellij/tools/build/bazel/jvmIncBuilder/impl/instrumentation/BytecodeInstrumentationRunner.java [40:79]
public ExitCode compile(Iterable<NodeSource> sources, Iterable<NodeSource> deletedSources, DiagnosticSink diagnostic, OutputSink outSink) throws Exception {
for (OutputOrigin.Kind originKind : OutputOrigin.Kind.values()) {
for (String generatedFile : outSink.getGeneratedOutputPaths(originKind, OutputFile.Kind.bytecode)) {
boolean changes = false;
byte[] content = null;
ClassReader reader = null;
for (BytecodeInstrumenter instrumenter : filter(ourInstrumenters, inst -> inst.getSupportedOrigins().contains(originKind))) {
if (content == null) {
content = outSink.getFileContent(generatedFile);
}
try {
if (reader == null) {
reader = new FailSafeClassReader(content);
}
InstrumentationClassFinder classFinder = myStorageManager.getInstrumentationClassFinder();
int version = InstrumenterClassWriter.getClassFileVersion(reader);
ClassWriter writer = new InstrumenterClassWriter(reader, InstrumenterClassWriter.getAsmClassWriterFlags(version), classFinder);
final byte[] instrumented = instrumenter.instrument(generatedFile, reader, writer, classFinder);
if (instrumented != null) {
changes = true;
content = instrumented;
classFinder.cleanCachedData(reader.getClassName());
reader = null;
}
}
catch (Exception e) {
LOG.log(Level.WARNING, "Error running instrumenter " + instrumenter.getName(), e);
diagnostic.report(Message.create(instrumenter, Message.Kind.ERROR, e.getMessage(), generatedFile));
break;
}
}
if (changes && !diagnostic.hasErrors()) {
myStorageManager.getOutputBuilder().putEntry(generatedFile, content);
}
}
}
return ExitCode.OK;
}