fix: include inlined classes in usage search (#1285)

This commit is contained in:
Skylot
2021-11-25 11:20:30 +00:00
parent b22812b43a
commit a90ec7c64a
4 changed files with 26 additions and 2 deletions
@@ -413,6 +413,10 @@ public final class JadxDecompiler implements Closeable {
classesMap.put(innerCls.getClassNode(), innerCls);
loadJavaClass(innerCls);
}
for (JavaClass inlinedCls : javaClass.getInlinedClasses()) {
classesMap.put(inlinedCls.getClassNode(), inlinedCls);
loadJavaClass(inlinedCls);
}
}
/**
@@ -23,6 +23,7 @@ public final class JavaClass implements JavaNode {
private final JavaClass parent;
private List<JavaClass> innerClasses = Collections.emptyList();
private List<JavaClass> inlinedClasses = Collections.emptyList();
private List<JavaField> fields = Collections.emptyList();
private List<JavaMethod> methods = Collections.emptyList();
private boolean listsLoaded;
@@ -100,13 +101,23 @@ public final class JavaClass implements JavaNode {
}
this.innerClasses = Collections.unmodifiableList(list);
}
int inlinedClsCount = cls.getInlinedClasses().size();
if (inlinedClsCount != 0) {
List<JavaClass> list = new ArrayList<>(inlinedClsCount);
for (ClassNode inner : cls.getInlinedClasses()) {
JavaClass javaClass = rootDecompiler.convertClassNode(inner);
javaClass.loadLists();
list.add(javaClass);
}
this.inlinedClasses = Collections.unmodifiableList(list);
}
int fieldsCount = cls.getFields().size();
if (fieldsCount != 0) {
List<JavaField> flds = new ArrayList<>(fieldsCount);
for (FieldNode f : cls.getFields()) {
if (!f.contains(AFlag.DONT_GENERATE)) {
JavaField javaField = new JavaField(f, this);
JavaField javaField = new JavaField(this, f);
flds.add(javaField);
}
}
@@ -254,6 +265,11 @@ public final class JavaClass implements JavaNode {
return innerClasses;
}
public List<JavaClass> getInlinedClasses() {
loadLists();
return inlinedClasses;
}
public List<JavaField> getFields() {
loadLists();
return fields;
@@ -13,7 +13,7 @@ public final class JavaField implements JavaNode {
private final FieldNode field;
private final JavaClass parent;
JavaField(FieldNode f, JavaClass cls) {
JavaField(JavaClass cls, FieldNode f) {
this.field = f;
this.parent = cls;
}
@@ -557,6 +557,10 @@ public class ClassNode extends NotificationAttrNode implements ILoadable, ICodeN
return innerClasses;
}
public List<ClassNode> getInlinedClasses() {
return inlinedClasses;
}
/**
* Get all inner and inlined classes recursively
*