private SimpleFileVisitor createInstrumenterVisitor()

in src/java/io/bazel/rulesscala/coverage/instrumenter/JacocoInstrumenter.java [96:144]


  private SimpleFileVisitor createInstrumenterVisitor(
      Instrumenter jacoco, Path instrumentedClassesDirectory, JarCreator jarCreator) {
    return new SimpleFileVisitor<Path>() {
      @Override
      public FileVisitResult visitFile(Path inPath, BasicFileAttributes attrs) {
        try {
          return actuallyVisitFile(inPath, attrs);
        } catch (final Exception e) {
          throw new RuntimeException(e);
        }
      }

      @Override
      public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
          throws IOException {
        Objects.requireNonNull(dir);
        Objects.requireNonNull(attrs);
        // Adding non-root directories to the jar
        if (!dir.toString().equals("/")) {
          jarCreator.addEntry(dir.toString(), dir);
        }
        return FileVisitResult.CONTINUE;
      }

      private FileVisitResult actuallyVisitFile(Path inPath, BasicFileAttributes attrs)
          throws Exception {
        if (inPath.toString().endsWith(".class")) {
          // Create a tempPath (that is independent of the name), to avoid "File name too long"
          // exceptions.
          Path tempPath =
              Files.createTempFile(instrumentedClassesDirectory, "instrumented", ".jar");
          Files.delete(tempPath);

          try (BufferedInputStream inStream =
                  new BufferedInputStream(Files.newInputStream(inPath));
              BufferedOutputStream outStream =
                  new BufferedOutputStream(
                      Files.newOutputStream(tempPath, StandardOpenOption.CREATE_NEW)); ) {
            jacoco.instrument(inStream, outStream, inPath.toString());
          }
          jarCreator.addEntry(inPath.toString(), tempPath);
          jarCreator.addEntry(inPath.toString() + ".uninstrumented", inPath);
        } else {
          jarCreator.addEntry(inPath.toString(), inPath);
        }
        return FileVisitResult.CONTINUE;
      }
    };
  }