mirror of
https://github.com/skylot/jadx.git
synced 2024-11-23 21:00:06 +00:00
fix: use alias for variable names (#1487)
This commit is contained in:
parent
e4b19ab560
commit
7b1c7b967a
@ -7,6 +7,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
import jadx.core.Consts;
|
import jadx.core.Consts;
|
||||||
import jadx.core.deobf.NameMapper;
|
import jadx.core.deobf.NameMapper;
|
||||||
|
import jadx.core.dex.attributes.AFlag;
|
||||||
import jadx.core.dex.attributes.nodes.LoopLabelAttr;
|
import jadx.core.dex.attributes.nodes.LoopLabelAttr;
|
||||||
import jadx.core.dex.info.ClassInfo;
|
import jadx.core.dex.info.ClassInfo;
|
||||||
import jadx.core.dex.info.MethodInfo;
|
import jadx.core.dex.info.MethodInfo;
|
||||||
@ -173,7 +174,7 @@ public class NameGen {
|
|||||||
|
|
||||||
private String makeNameForType(ArgType type) {
|
private String makeNameForType(ArgType type) {
|
||||||
if (type.isPrimitive()) {
|
if (type.isPrimitive()) {
|
||||||
return makeNameForPrimitive(type);
|
return type.getPrimitiveType().getShortName().toLowerCase();
|
||||||
}
|
}
|
||||||
if (type.isArray()) {
|
if (type.isArray()) {
|
||||||
return makeNameForType(type.getArrayRootElement()) + "Arr";
|
return makeNameForType(type.getArrayRootElement()) + "Arr";
|
||||||
@ -181,10 +182,6 @@ public class NameGen {
|
|||||||
return makeNameForObject(type);
|
return makeNameForObject(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String makeNameForPrimitive(ArgType type) {
|
|
||||||
return type.getPrimitiveType().getShortName().toLowerCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String makeNameForObject(ArgType type) {
|
private String makeNameForObject(ArgType type) {
|
||||||
if (type.isGenericType()) {
|
if (type.isGenericType()) {
|
||||||
return StringUtils.escape(type.getObject().toLowerCase());
|
return StringUtils.escape(type.getObject().toLowerCase());
|
||||||
@ -194,23 +191,32 @@ public class NameGen {
|
|||||||
if (alias != null) {
|
if (alias != null) {
|
||||||
return alias;
|
return alias;
|
||||||
}
|
}
|
||||||
ClassInfo extClsInfo = ClassInfo.fromType(mth.root(), type);
|
return makeNameForCheckedClass(ClassInfo.fromType(mth.root(), type));
|
||||||
String shortName = extClsInfo.getShortName();
|
|
||||||
String vName = fromName(shortName);
|
|
||||||
if (vName != null) {
|
|
||||||
return vName;
|
|
||||||
}
|
|
||||||
if (shortName != null) {
|
|
||||||
String lower = StringUtils.escape(shortName.toLowerCase());
|
|
||||||
if (shortName.equals(lower)) {
|
|
||||||
return lower + "Var";
|
|
||||||
}
|
|
||||||
return lower;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return StringUtils.escape(type.toString());
|
return StringUtils.escape(type.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String makeNameForCheckedClass(ClassInfo classInfo) {
|
||||||
|
String shortName = classInfo.getAliasShortName();
|
||||||
|
String vName = fromName(shortName);
|
||||||
|
if (vName != null) {
|
||||||
|
return vName;
|
||||||
|
}
|
||||||
|
String lower = StringUtils.escape(shortName.toLowerCase());
|
||||||
|
if (shortName.equals(lower)) {
|
||||||
|
return lower + "Var";
|
||||||
|
}
|
||||||
|
return lower;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String makeNameForClass(ClassInfo classInfo) {
|
||||||
|
String alias = getAliasForObject(classInfo.getFullName());
|
||||||
|
if (alias != null) {
|
||||||
|
return alias;
|
||||||
|
}
|
||||||
|
return makeNameForCheckedClass(classInfo);
|
||||||
|
}
|
||||||
|
|
||||||
private static String fromName(String name) {
|
private static String fromName(String name) {
|
||||||
if (name == null || name.isEmpty()) {
|
if (name == null || name.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
@ -241,7 +247,12 @@ public class NameGen {
|
|||||||
|
|
||||||
case CONSTRUCTOR:
|
case CONSTRUCTOR:
|
||||||
ConstructorInsn co = (ConstructorInsn) insn;
|
ConstructorInsn co = (ConstructorInsn) insn;
|
||||||
return makeNameForObject(co.getClassType().getType());
|
MethodNode callMth = mth.root().getMethodUtils().resolveMethod(co);
|
||||||
|
if (callMth != null && callMth.contains(AFlag.ANONYMOUS_CONSTRUCTOR)) {
|
||||||
|
// don't use name of anonymous class
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return makeNameForClass(co.getClassType());
|
||||||
|
|
||||||
case ARRAY_LENGTH:
|
case ARRAY_LENGTH:
|
||||||
return "length";
|
return "length";
|
||||||
@ -267,11 +278,11 @@ public class NameGen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String makeNameFromInvoke(MethodInfo callMth) {
|
private String makeNameFromInvoke(MethodInfo callMth) {
|
||||||
String name = callMth.getName();
|
String name = callMth.getAlias();
|
||||||
ArgType declType = callMth.getDeclClass().getType();
|
ClassInfo declClass = callMth.getDeclClass();
|
||||||
if ("getInstance".equals(name)) {
|
if ("getInstance".equals(name)) {
|
||||||
// e.g. Cipher.getInstance
|
// e.g. Cipher.getInstance
|
||||||
return makeNameForType(declType);
|
return makeNameForClass(declClass);
|
||||||
}
|
}
|
||||||
if (name.startsWith("get") || name.startsWith("set")) {
|
if (name.startsWith("get") || name.startsWith("set")) {
|
||||||
return fromName(name.substring(3));
|
return fromName(name.substring(3));
|
||||||
@ -280,9 +291,9 @@ public class NameGen {
|
|||||||
return "it";
|
return "it";
|
||||||
}
|
}
|
||||||
if ("toString".equals(name)) {
|
if ("toString".equals(name)) {
|
||||||
return makeNameForType(declType);
|
return makeNameForClass(declClass);
|
||||||
}
|
}
|
||||||
if ("forName".equals(name) && declType.equals(ArgType.CLASS)) {
|
if ("forName".equals(name) && declClass.getType().equals(ArgType.CLASS)) {
|
||||||
return OBJ_ALIAS.get(Consts.CLASS_CLASS);
|
return OBJ_ALIAS.get(Consts.CLASS_CLASS);
|
||||||
}
|
}
|
||||||
if (name.startsWith("to")) {
|
if (name.startsWith("to")) {
|
||||||
|
@ -45,6 +45,15 @@ public class MethodUtils {
|
|||||||
return root.getClsp().getMethodDetails(callMth);
|
return root.getClsp().getMethodDetails(callMth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public MethodNode resolveMethod(BaseInvokeNode invokeNode) {
|
||||||
|
IMethodDetails methodDetails = getMethodDetails(invokeNode);
|
||||||
|
if (methodDetails instanceof MethodNode) {
|
||||||
|
return ((MethodNode) methodDetails);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search methods with same name and args count in class hierarchy starting from {@code startCls}
|
* Search methods with same name and args count in class hierarchy starting from {@code startCls}
|
||||||
* Beware {@code startCls} can be different from {@code mthInfo.getDeclClass()}
|
* Beware {@code startCls} can be different from {@code mthInfo.getDeclClass()}
|
||||||
|
Loading…
Reference in New Issue
Block a user