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