From 628263343b6cac647e62640e1f82eaa3333a3052 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 12 May 2019 17:25:00 +0300 Subject: [PATCH] fix(gui): use alias for field and method types in tree view --- .../src/main/java/jadx/api/JavaField.java | 2 +- .../src/main/java/jadx/api/JavaMethod.java | 24 +++++++++++++++-- .../core/dex/instructions/args/ArgType.java | 27 +++++++++++++++++++ .../java/jadx/core/dex/nodes/MethodNode.java | 3 +-- .../src/main/java/jadx/gui/utils/Utils.java | 10 ++++--- 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/JavaField.java b/jadx-core/src/main/java/jadx/api/JavaField.java index 41794d05..30aaa837 100644 --- a/jadx-core/src/main/java/jadx/api/JavaField.java +++ b/jadx-core/src/main/java/jadx/api/JavaField.java @@ -39,7 +39,7 @@ public final class JavaField implements JavaNode { } public ArgType getType() { - return field.getType(); + return ArgType.tryToResolveClassAlias(field.dex(), field.getType()); } public int getDecompiledLine() { diff --git a/jadx-core/src/main/java/jadx/api/JavaMethod.java b/jadx-core/src/main/java/jadx/api/JavaMethod.java index 0d0a7dc4..49813946 100644 --- a/jadx-core/src/main/java/jadx/api/JavaMethod.java +++ b/jadx-core/src/main/java/jadx/api/JavaMethod.java @@ -1,9 +1,13 @@ package jadx.api; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import jadx.core.dex.info.AccessInfo; import jadx.core.dex.instructions.args.ArgType; +import jadx.core.dex.instructions.args.RegisterArg; import jadx.core.dex.nodes.MethodNode; public final class JavaMethod implements JavaNode { @@ -40,11 +44,27 @@ public final class JavaMethod implements JavaNode { } public List getArguments() { - return mth.getMethodInfo().getArgumentsTypes(); + if (mth.getMethodInfo().getArgumentsTypes().isEmpty()) { + return Collections.emptyList(); + } + List arguments = mth.getArguments(false); + Stream argTypeStream; + if (arguments == null || arguments.isEmpty() || mth.isNoCode()) { + argTypeStream = mth.getMethodInfo().getArgumentsTypes().stream(); + } else { + argTypeStream = arguments.stream().map(RegisterArg::getType); + } + return argTypeStream + .map(type -> ArgType.tryToResolveClassAlias(mth.dex(), type)) + .collect(Collectors.toList()); } public ArgType getReturnType() { - return mth.getReturnType(); + ArgType retType = mth.getReturnType(); + if (retType == null) { + retType = mth.getMethodInfo().getReturnType(); + } + return ArgType.tryToResolveClassAlias(mth.dex(), retType); } public boolean isConstructor() { diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java index 228a7532..9bf57acc 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/ArgType.java @@ -5,6 +5,8 @@ import java.util.Collections; import java.util.List; import jadx.core.Consts; +import jadx.core.dex.info.ClassInfo; +import jadx.core.dex.nodes.ClassNode; import jadx.core.dex.nodes.DexNode; import jadx.core.dex.nodes.RootNode; import jadx.core.dex.nodes.parser.SignatureParser; @@ -620,6 +622,31 @@ public abstract class ArgType { return 1; } + public static ArgType tryToResolveClassAlias(DexNode dex, ArgType type) { + if (!type.isObject() || type.isGenericType()) { + return type; + } + + ClassNode cls = dex.resolveClass(type); + if (cls == null) { + return type; + } + ClassInfo clsInfo = cls.getClassInfo(); + if (!clsInfo.hasAlias()) { + return type; + } + String aliasFullName = clsInfo.getAliasFullName(); + if (type.isGeneric()) { + if (type instanceof GenericObject) { + return new GenericObject(aliasFullName, type.getGenericTypes()); + } + if (type instanceof WildcardType) { + return new WildcardType(ArgType.object(aliasFullName), type.getWildcardBounds()); + } + } + return ArgType.object(aliasFullName); + } + @Override public String toString() { return "ARG_TYPE"; diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java index e774c17c..9991f1e5 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java @@ -91,9 +91,8 @@ public class MethodNode extends LineAttrNode implements ILoadable, ICodeNode { if (noCode) { return; } - retType = null; + // don't unload retType and argsList, will be used in jadx-gui after class unload thisArg = null; - argsList = Collections.emptyList(); sVars = Collections.emptyList(); genericMap = null; instructions = null; diff --git a/jadx-gui/src/main/java/jadx/gui/utils/Utils.java b/jadx-gui/src/main/java/jadx/gui/utils/Utils.java index 49066b72..e65b3b9f 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/Utils.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/Utils.java @@ -65,17 +65,21 @@ public class Utils { } public static String typeFormat(String name, ArgType type) { - return "" + name - + " : " + typeStr(type) + "" + return "" + escapeHtml(name) + + " " + escapeHtml(typeStr(type)) + "" + ""; } + public static String escapeHtml(String str) { + return str.replace("<", "<"); + } + public static String typeStr(ArgType type) { if (type == null) { return "null"; } if (type.isObject()) { - String cls = type.getObject(); + String cls = type.toString(); int dot = cls.lastIndexOf('.'); if (dot != -1) { return cls.substring(dot + 1); -- GitLab