diff --git a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java index 2717fd88e..a118a0dee 100644 --- a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java +++ b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java @@ -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); + } } /** diff --git a/jadx-core/src/main/java/jadx/api/JavaClass.java b/jadx-core/src/main/java/jadx/api/JavaClass.java index 80ca56651..c81c276fd 100644 --- a/jadx-core/src/main/java/jadx/api/JavaClass.java +++ b/jadx-core/src/main/java/jadx/api/JavaClass.java @@ -23,6 +23,7 @@ public final class JavaClass implements JavaNode { private final JavaClass parent; private List innerClasses = Collections.emptyList(); + private List inlinedClasses = Collections.emptyList(); private List fields = Collections.emptyList(); private List 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 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 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 getInlinedClasses() { + loadLists(); + return inlinedClasses; + } + public List getFields() { loadLists(); return fields; diff --git a/jadx-core/src/main/java/jadx/api/JavaField.java b/jadx-core/src/main/java/jadx/api/JavaField.java index f8bfa8e75..be09e3cd4 100644 --- a/jadx-core/src/main/java/jadx/api/JavaField.java +++ b/jadx-core/src/main/java/jadx/api/JavaField.java @@ -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; } diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index b68d5a76a..f4d1c4fcf 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -557,6 +557,10 @@ public class ClassNode extends NotificationAttrNode implements ILoadable, ICodeN return innerClasses; } + public List getInlinedClasses() { + return inlinedClasses; + } + /** * Get all inner and inlined classes recursively *