fix: keep lambda classes if static field used outside (#1215)

This commit is contained in:
Skylot
2021-07-25 15:10:34 +01:00
parent ea8b9ce462
commit 859674ce7e
@@ -35,6 +35,9 @@ public class ProcessAnonymous extends AbstractVisitor {
private static void markAnonymousClass(ClassNode cls) {
if (usedOnlyOnce(cls) || isAnonymous(cls) || isLambdaCls(cls)) {
if (isStaticFieldUsedOutside(cls)) {
return;
}
cls.add(AFlag.ANONYMOUS_CLASS);
cls.add(AFlag.DONT_GENERATE);
@@ -46,6 +49,21 @@ public class ProcessAnonymous extends AbstractVisitor {
}
}
private static boolean isStaticFieldUsedOutside(ClassNode cls) {
ClassNode topCls = cls.getTopParentClass();
for (FieldNode field : cls.getFields()) {
if (field.isStatic()) {
for (MethodNode useMth : field.getUseIn()) {
ClassNode useCls = useMth.getParentClass().getTopParentClass();
if (!useCls.equals(topCls)) {
return true;
}
}
}
}
return false;
}
private static boolean usedOnlyOnce(ClassNode cls) {
if (cls.getUseIn().size() == 1 && cls.getUseInMth().size() == 1) {
// used only once