fix: resolve duplicated error attr in fallback codegen, allow to set whole attr list at once (#2842)

This commit is contained in:
Skylot
2026-05-11 17:09:23 +01:00
parent 2fe95da570
commit c3f7027bdd
5 changed files with 42 additions and 9 deletions
@@ -397,13 +397,12 @@ public class MethodGen {
for (IDexTreeVisitor visitor : Jadx.getFallbackPassesList()) {
DepthTraversal.visit(visitor, mth);
}
errors.forEach(err -> mth.addAttr(AType.JADX_ERROR, err));
} catch (Exception e) {
LOG.error("Error reload instructions in fallback mode:", e);
code.startLine("// Can't load method instructions: " + e.getMessage());
return;
} finally {
errors.forEach(err -> mth.addAttr(AType.JADX_ERROR, err));
mth.addAttr(AType.JADX_ERROR, errors);
}
}
InsnNode[] insnArr = mth.getInstructions();
@@ -12,10 +12,16 @@ public class AttrList<T> implements IJadxAttribute {
private static final int MAX_ATTRLIST_LENGTH = 300;
private final IJadxAttrType<AttrList<T>> type;
private final List<T> list = new ArrayList<>();
private final List<T> list;
public AttrList(IJadxAttrType<AttrList<T>> type, List<T> attrList) {
this.type = type;
this.list = attrList;
}
public AttrList(IJadxAttrType<AttrList<T>> type) {
this.type = type;
this.list = new ArrayList<>();
}
public List<T> getList() {
@@ -50,8 +50,7 @@ public abstract class AttrNode implements IAttributeNode {
}
public <T> void addAttr(IJadxAttrType<AttrList<T>> type, List<T> list) {
AttributeStorage strg = initStorage();
list.forEach(attr -> strg.add(type, attr));
initStorage().addAttrList(type, list);
}
@Override
@@ -14,6 +14,7 @@ import jadx.api.plugins.input.data.attributes.IJadxAttrType;
import jadx.api.plugins.input.data.attributes.IJadxAttribute;
import jadx.api.plugins.input.data.attributes.JadxAttrType;
import jadx.api.plugins.input.data.attributes.types.AnnotationsAttr;
import jadx.core.utils.ListUtils;
import jadx.core.utils.Utils;
import jadx.core.utils.exceptions.JadxRuntimeException;
@@ -62,11 +63,20 @@ public class AttributeStorage {
public <T> void add(IJadxAttrType<AttrList<T>> type, T obj) {
AttrList<T> list = get(type);
if (list == null) {
list = new AttrList<>(type);
add(list);
if (list != null) {
list.getList().add(obj);
} else {
add(new AttrList<>(type, ListUtils.mutableListOf(obj)));
}
}
public <T> void addAttrList(IJadxAttrType<AttrList<T>> type, List<T> attrList) {
AttrList<T> list = get(type);
if (list != null) {
list.getList().addAll(attrList);
} else {
add(new AttrList<>(type, attrList));
}
list.getList().add(obj);
}
public void addAll(AttributeStorage otherList) {
@@ -19,6 +19,25 @@ import org.jetbrains.annotations.Nullable;
public class ListUtils {
public static <T> List<T> mutableListOf(T obj) {
List<T> list = new ArrayList<>();
list.add(obj);
return list;
}
public static <T> List<T> mutableListOf(T obj1, T obj2) {
List<T> list = new ArrayList<>();
list.add(obj1);
list.add(obj2);
return list;
}
public static <T> List<T> mutableListOf(T... objs) {
List<T> list = new ArrayList<>();
Collections.addAll(list, objs);
return list;
}
public static <T> boolean isSingleElement(@Nullable List<T> list, T obj) {
if (list == null || list.size() != 1) {
return false;