WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 0d105a5

Browse files
authored
fix: inner class parent is wrong when name formatted as Class$method$xxx (PR #2364)
1 parent 7eab3c8 commit 0d105a5

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ private void initInnerClasses() {
290290
List<ClassNode> updated = new ArrayList<>();
291291
for (ClassNode cls : inner) {
292292
ClassInfo clsInfo = cls.getClassInfo();
293-
ClassNode parent = resolveClass(clsInfo.getParentClass());
293+
ClassNode parent = resolveParentClass(clsInfo);
294294
if (parent == null) {
295295
clsMap.remove(clsInfo);
296296
clsInfo.notInner(this);
@@ -482,6 +482,33 @@ public ClassNode resolveRawClass(String rawFullName) {
482482
return rawClsMap.get(rawFullName);
483483
}
484484

485+
/**
486+
* Find and correct the parent of an inner class.
487+
* <br>
488+
* Sometimes inner ClassInfo generated wrong parent info.
489+
* e.g. inner is `Cls$mth$1`, current parent = `Cls$mth`, real parent = `Cls`
490+
*/
491+
@Nullable
492+
public ClassNode resolveParentClass(ClassInfo clsInfo) {
493+
ClassInfo parentInfo = clsInfo.getParentClass();
494+
ClassNode parentNode = resolveClass(parentInfo);
495+
if (parentNode == null && parentInfo != null) {
496+
String parClsName = parentInfo.getFullName();
497+
// strip last part as method name
498+
int sep = parClsName.lastIndexOf('.');
499+
if (sep > 0 && sep != parClsName.length() - 1) {
500+
String mthName = parClsName.substring(sep + 1);
501+
String upperParClsName = parClsName.substring(0, sep);
502+
ClassNode tmpParent = resolveClass(upperParClsName);
503+
if (tmpParent != null && tmpParent.searchMethodByShortName(mthName) != null) {
504+
parentNode = tmpParent;
505+
clsInfo.convertToInner(parentNode);
506+
}
507+
}
508+
}
509+
return parentNode;
510+
}
511+
485512
/**
486513
* Searches for ClassNode by its full name (original or alias name)
487514
* <br>

0 commit comments

Comments
 (0)