private static record SourceInfo()

in src/main/java/org/apache/maven/plugin/compiler/IncrementalBuild.java [483:522]


    private static record SourceInfo(
            Path sourceDirectory, Path outputDirectory, Path outputFile, boolean omitted, long lastModified) {
        /**
         * Deletes all output files associated to the given source file. If the output file is a {@code .class} file,
         * then this method deletes also the output files for all inner classes (e.g. {@code "Foo$0.class"}).
         *
         * @param sourceFile the source file for which to delete output files
         * @throws IOException if an error occurred while scanning the output directory or deleting a file
         */
        void deleteClassFiles(final Path sourceFile) throws IOException {
            Path output = outputFile;
            if (output == null) {
                output = SourceFile.toOutputFile(
                        sourceDirectory,
                        outputDirectory,
                        sourceFile,
                        SourceDirectory.JAVA_FILE_SUFFIX,
                        SourceDirectory.CLASS_FILE_SUFFIX);
            }
            String filename = output.getFileName().toString();
            if (filename.endsWith(SourceDirectory.CLASS_FILE_SUFFIX)) {
                String prefix = filename.substring(0, filename.length() - SourceDirectory.CLASS_FILE_SUFFIX.length());
                List<Path> outputs;
                try (Stream<Path> files = Files.walk(output.getParent(), 1)) {
                    outputs = files.filter((f) -> {
                                String name = f.getFileName().toString();
                                return name.startsWith(prefix)
                                        && name.endsWith(SourceDirectory.CLASS_FILE_SUFFIX)
                                        && (name.equals(filename) || name.charAt(prefix.length()) == '$');
                            })
                            .toList();
                }
                for (Path p : outputs) {
                    Files.delete(p);
                }
            } else {
                Files.deleteIfExists(output);
            }
        }
    }