fix: in anonymous class checks ignore instance fields not used outside

This commit is contained in:
Skylot
2024-04-06 21:07:35 +01:00
parent 8f969d4e89
commit c1de235289
@@ -43,9 +43,7 @@ public class ProcessAnonymous extends AbstractVisitor {
if (!inlineAnonymousClasses) {
return;
}
for (ClassNode cls : root.getClasses()) {
markAnonymousClass(cls);
}
root.getClasses().forEach(ProcessAnonymous::processClass);
mergeAnonymousDeps(root);
}
@@ -59,10 +57,18 @@ public class ProcessAnonymous extends AbstractVisitor {
}
private void visitClassAndInners(ClassNode cls) {
markAnonymousClass(cls);
processClass(cls);
cls.getInnerClasses().forEach(this::visitClassAndInners);
}
private static void processClass(ClassNode cls) {
try {
markAnonymousClass(cls);
} catch (Throwable e) {
cls.addError("Anonymous visitor error", e);
}
}
private static void markAnonymousClass(ClassNode cls) {
if (!canBeAnonymous(cls)) {
return;
@@ -273,6 +279,10 @@ public class ProcessAnonymous extends AbstractVisitor {
if (!ctrUseMth.getMethodInfo().isClassInit()) {
return false;
}
if (cls.getUseInMth().isEmpty()) {
// no outside usage, inline not needed
return false;
}
FieldNode instFld = ListUtils.filterOnlyOne(cls.getFields(),
f -> f.getAccessFlags().containsFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL)
&& f.getFieldInfo().getType().equals(cls.getClassInfo().getType()));