Skip to content

[core] New enum pattern with anonymous classes adds invalid synthetic constructor/ external vars with dx/d8 #2953

Description

@nitram84

Issue details

I found a new enum pattern currently unhandled in jadx:

Example 1:

package jadx.test;

public enum EnumAnonymous1 {
  TEST {}
}

decompiles to:

package jadx.test;

/* JADX INFO: loaded from: classes.dex */
public enum EnumAnonymous1 {
    TEST { // from class: jadx.test.EnumAnonymous1.1
    };

    /* synthetic */ EnumAnonymous1(AnonymousClass1 x2) {
        this();
    }
}

Example 2: Same with arguments and test w/o DX/D8

package jadx.test;

public enum EnumAnonymous2 {
  TEST1("TEST1", 0) {
  };

  EnumAnonymous2(final String string, final int i) {}
}

without dx/d8 decompiles to:

package jadx.test;

/* JADX INFO: loaded from: jadx/test/EnumAnonymous2.class */
public enum EnumAnonymous2 {
    TEST1("TEST1", 0) { // from class: jadx.test.EnumAnonymous2.1
    };

    /* synthetic */ EnumAnonymous2(String x2, int x3, AnonymousClass1 x4) {
        this(x2, x3);
    }

    EnumAnonymous2(String string, int i) {
    }
}

and with dx/d8 to:

package jadx.test;

/* JADX WARN: Enum visitor error
jadx.core.utils.exceptions.JadxRuntimeException: Init of enum field 'TEST1' uses external variables
	at jadx.core.dex.visitors.EnumVisitor.createEnumFieldByConstructor(EnumVisitor.java:485)
	at jadx.core.dex.visitors.EnumVisitor.processEnumFieldByField(EnumVisitor.java:399)
	at jadx.core.dex.visitors.EnumVisitor.processEnumFieldByWrappedInsn(EnumVisitor.java:364)
	at jadx.core.dex.visitors.EnumVisitor.extractEnumFieldsFromFilledArray(EnumVisitor.java:349)
	at jadx.core.dex.visitors.EnumVisitor.extractEnumFieldsFromInsn(EnumVisitor.java:284)
	at jadx.core.dex.visitors.EnumVisitor.convertToEnum(EnumVisitor.java:153)
	at jadx.core.dex.visitors.EnumVisitor.visit(EnumVisitor.java:102)
 */
/* JADX WARN: Failed to restore enum class, 'enum' modifier and super class removed */
/* JADX INFO: loaded from: classes.dex */
public class EnumAnonymous2 {
    private static final /* synthetic */ EnumAnonymous2[] $VALUES;
    public static final EnumAnonymous2 TEST1;

    /* synthetic */ EnumAnonymous2(String x0, int x1, String x2, int x3, AnonymousClass1 x4) {
        this(x0, x1, x2, x3);
    }

    public static EnumAnonymous2 valueOf(String name) {
        return (EnumAnonymous2) Enum.valueOf(EnumAnonymous2.class, name);
    }

    public static EnumAnonymous2[] values() {
        return (EnumAnonymous2[]) $VALUES.clone();
    }

    static {
        String str = "TEST1";
        int i = 0;
        TEST1 = new EnumAnonymous2(str, i, str, i) { // from class: jadx.test.EnumAnonymous2.1
        };
        $VALUES = new EnumAnonymous2[]{TEST1};
    }

    private EnumAnonymous2(String str, int i, String string, int i2) {
        super(str, i);
    }
}

Relevant log output or stacktrace

no errors logged

Provide sample and class/method full name

See issue details.

Jadx version

1.5.6, latest git

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    CoreIssues in jadx-core modulebug

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions