in src/main/java/com/uber/scip/extractor/LombokJarProcessor.java [49:104]
private List<JarEntryInfo> findLombokClasses(File inputJar) throws IOException {
List<JarEntryInfo> lombokClasses = new ArrayList<>();
Set<String> lombokClassesSet = new HashSet<>();
try (JarFile jarIn = new JarFile(inputJar)) {
jarIn
.entries()
.asIterator()
.forEachRemaining(
entry -> {
if (entry.getName().endsWith(".class")) {
try {
if (isLombokGeneratedClass(entry, jarIn)) {
String parentClassName = entry.getName();
if (entry.getName().contains("$")) {
parentClassName =
entry.getName().substring(0, entry.getName().indexOf("$"));
}
parentClassName = parentClassName.replace(".class", "");
lombokClassesSet.add(parentClassName);
}
} catch (IOException e) {
logger.warn("Failed to analyze class file: " + entry.getName(), e);
}
}
});
jarIn
.entries()
.asIterator()
.forEachRemaining(
entry -> {
if (entry.getName().endsWith(".class")) {
String parentClassName = entry.getName();
if (entry.getName().contains("$")) {
// lombok annotation is defined in a nested class
parentClassName = entry.getName().substring(0, entry.getName().indexOf("$"));
}
parentClassName = parentClassName.replace(".class", "");
try {
if (lombokClassesSet.contains(parentClassName)) {
lombokClasses.add(
new JarEntryInfo(
entry.getName(), jarIn.getInputStream(entry).readAllBytes()));
logger.debug("Found Lombok-generated class: {}", entry.getName());
}
} catch (IOException e) {
logger.warn("Failed to analyze class file: " + entry.getName(), e);
}
}
});
}
logger.debug("Found {} Lombok-generated classes", lombokClasses.size());
return lombokClasses;
}