core: ClassNode: Load recursively missing information on refresh()
Fixes loss of static identifiers, comments, annotations and source file name after rename.
This commit is contained in:
@@ -86,5 +86,9 @@ public class AType<T extends IAttribute> {
|
||||
public static final Set<AType<?>> SKIP_ON_UNLOAD = new HashSet<>(Arrays.asList(
|
||||
FIELD_REPLACE,
|
||||
METHOD_INLINE,
|
||||
COMMENTS,
|
||||
RENAME_REASON,
|
||||
JADX_WARN,
|
||||
JADX_ERROR,
|
||||
SKIP_MTH_ARGS));
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ClassNode.class);
|
||||
|
||||
private final DexNode dex;
|
||||
private final ClassDef cls;
|
||||
private final int clsDefOffset;
|
||||
private final ClassInfo clsInfo;
|
||||
private AccessInfo accessFlags;
|
||||
@@ -70,6 +71,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode {
|
||||
|
||||
public ClassNode(DexNode dex, ClassDef cls) {
|
||||
this.dex = dex;
|
||||
this.cls = cls;
|
||||
this.clsDefOffset = cls.getOffset();
|
||||
this.clsInfo = ClassInfo.fromDex(dex, cls.getTypeIndex());
|
||||
try {
|
||||
@@ -151,6 +153,7 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode {
|
||||
this.fields = new ArrayList<>();
|
||||
this.accessFlags = new AccessInfo(accessFlags, AFType.CLASS);
|
||||
this.parentClass = this;
|
||||
this.cls = null;
|
||||
|
||||
dex.addClassNode(this);
|
||||
}
|
||||
@@ -290,10 +293,35 @@ public class ClassNode extends LineAttrNode implements ILoadable, ICodeNode {
|
||||
}
|
||||
|
||||
public synchronized ICodeInfo refresh() {
|
||||
load();
|
||||
reloadRecursive();
|
||||
return decompile(false);
|
||||
}
|
||||
|
||||
private void reloadRecursive() {
|
||||
load();
|
||||
int sfIdx = cls.getSourceFileIndex();
|
||||
if (sfIdx != DexNode.NO_INDEX) {
|
||||
String fileName = dex.getString(sfIdx);
|
||||
addSourceFilenameAttr(fileName);
|
||||
}
|
||||
for (ClassNode innerCls : getInnerClasses()) {
|
||||
innerCls.reloadRecursive();
|
||||
}
|
||||
loadStaticInfo();
|
||||
loadAnnotations(cls);
|
||||
}
|
||||
|
||||
private void loadStaticInfo() {
|
||||
try {
|
||||
if (cls != null) {
|
||||
loadStaticValues(cls, fields);
|
||||
}
|
||||
} catch (DecodeException e) {
|
||||
LOG.error("Got DecodeException in loadStaticValues() for class {}", getRawName());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
for (MethodNode mth : getMethods()) {
|
||||
|
||||
Reference in New Issue
Block a user