fix: inner class parent is wrong when name formatted as Class$method$xxx (PR #2364)

This commit is contained in:
ewt45
2024-12-12 03:25:23 +08:00
committed by GitHub
parent 7eab3c8534
commit 0d105a5095
@@ -290,7 +290,7 @@ public class RootNode {
List<ClassNode> updated = new ArrayList<>();
for (ClassNode cls : inner) {
ClassInfo clsInfo = cls.getClassInfo();
ClassNode parent = resolveClass(clsInfo.getParentClass());
ClassNode parent = resolveParentClass(clsInfo);
if (parent == null) {
clsMap.remove(clsInfo);
clsInfo.notInner(this);
@@ -482,6 +482,33 @@ public class RootNode {
return rawClsMap.get(rawFullName);
}
/**
* Find and correct the parent of an inner class.
* <br>
* Sometimes inner ClassInfo generated wrong parent info.
* e.g. inner is `Cls$mth$1`, current parent = `Cls$mth`, real parent = `Cls`
*/
@Nullable
public ClassNode resolveParentClass(ClassInfo clsInfo) {
ClassInfo parentInfo = clsInfo.getParentClass();
ClassNode parentNode = resolveClass(parentInfo);
if (parentNode == null && parentInfo != null) {
String parClsName = parentInfo.getFullName();
// strip last part as method name
int sep = parClsName.lastIndexOf('.');
if (sep > 0 && sep != parClsName.length() - 1) {
String mthName = parClsName.substring(sep + 1);
String upperParClsName = parClsName.substring(0, sep);
ClassNode tmpParent = resolveClass(upperParClsName);
if (tmpParent != null && tmpParent.searchMethodByShortName(mthName) != null) {
parentNode = tmpParent;
clsInfo.convertToInner(parentNode);
}
}
}
return parentNode;
}
/**
* Searches for ClassNode by its full name (original or alias name)
* <br>