public ExitCode compile()

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