From 5af60b2ff4ab35262cc6eb7630ab553fa82b4848 Mon Sep 17 00:00:00 2001 From: Skylot Date: Mon, 23 Aug 2021 17:10:43 +0100 Subject: [PATCH] fix(gui): improve constructors and classes usage list --- .../main/java/jadx/core/codegen/ClassGen.java | 2 +- .../main/java/jadx/core/codegen/InsnGen.java | 7 +++++-- .../java/jadx/gui/utils/CodeUsageInfo.java | 18 +++++++++++++++--- .../java/jadx/gui/utils/search/StringRef.java | 13 +++++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index a5f661d30..d88c08538 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -579,7 +579,7 @@ public class ClassGen { addClsName(code, classNode.getClassInfo()); } - private void addClsName(ICodeWriter code, ClassInfo classInfo) { + public void addClsName(ICodeWriter code, ClassInfo classInfo) { String clsName = useClassInternal(cls.getClassInfo(), classInfo); code.add(clsName); } diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index cc8e631c2..fa822d9ae 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -677,13 +677,17 @@ public class InsnGen { if (insn.isSelf()) { throw new JadxRuntimeException("Constructor 'self' invoke must be removed!"); } + MethodNode callMth = mth.root().resolveMethod(insn.getCallMth()); if (insn.isSuper()) { + code.attachAnnotation(callMth); code.add("super"); } else if (insn.isThis()) { + code.attachAnnotation(callMth); code.add("this"); } else { code.add("new "); - useClass(code, insn.getClassType()); + code.attachAnnotation(callMth); + mgen.getClassGen().addClsName(code, insn.getClassType()); GenericInfoAttr genericInfoAttr = insn.get(AType.GENERIC_INFO); if (genericInfoAttr != null) { code.add('<'); @@ -701,7 +705,6 @@ public class InsnGen { code.add('>'); } } - MethodNode callMth = mth.root().resolveMethod(insn.getCallMth()); generateMethodArguments(code, insn, 0, callMth); } diff --git a/jadx-gui/src/main/java/jadx/gui/utils/CodeUsageInfo.java b/jadx-gui/src/main/java/jadx/gui/utils/CodeUsageInfo.java index 2249568ef..2f9b6003f 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/CodeUsageInfo.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/CodeUsageInfo.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import jadx.api.CodePosition; import jadx.api.JavaClass; +import jadx.api.JavaMethod; import jadx.api.JavaNode; import jadx.gui.treemodel.CodeNode; import jadx.gui.treemodel.JNode; @@ -55,7 +56,14 @@ public class CodeUsageInfo { // skip declaration continue; } - addUsage(nodeCache.makeFrom(javaNode), javaClass, linesInfo, codePosition, lines); + JNode node = nodeCache.makeFrom(javaNode); + addUsage(node, javaClass, linesInfo, codePosition, lines); + if (javaNode instanceof JavaMethod) { + // add constructor usage also as class usage + if (((JavaMethod) javaNode).isConstructor()) { + addUsage(node.getJParent(), javaClass, linesInfo, codePosition, lines); + } + } } } catch (Exception e) { LOG.error("Code usage process failed for class: {}", javaClass, e); @@ -64,12 +72,16 @@ public class CodeUsageInfo { private void addUsage(JNode jNode, JavaClass javaClass, CodeLinesInfo linesInfo, CodePosition codePosition, List lines) { - UsageInfo usageInfo = usageMap.computeIfAbsent(jNode, key -> new UsageInfo()); int line = codePosition.getLine(); - JavaNode javaNodeByLine = linesInfo.getJavaNodeByLine(line); StringRef codeLine = lines.get(line - 1); + if (codeLine.startsWith("import ")) { + // skip imports + return; + } + JavaNode javaNodeByLine = linesInfo.getJavaNodeByLine(line); JNode node = nodeCache.makeFrom(javaNodeByLine == null ? javaClass : javaNodeByLine); CodeNode codeNode = new CodeNode(node, codeLine, line, codePosition.getPos()); + UsageInfo usageInfo = usageMap.computeIfAbsent(jNode, key -> new UsageInfo()); usageInfo.addUsage(codeNode); } diff --git a/jadx-gui/src/main/java/jadx/gui/utils/search/StringRef.java b/jadx-gui/src/main/java/jadx/gui/utils/search/StringRef.java index a2258b842..acfc328a3 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/search/StringRef.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/search/StringRef.java @@ -117,6 +117,19 @@ public class StringRef implements CharSequence { return -1; } + public boolean startsWith(String str) { + int strLen = str.length(); + if (this.length < strLen) { + return false; + } + for (int i = 0; i < strLen; i++) { + if (charAt(i) != str.charAt(i)) { + return false; + } + } + return true; + } + public static List split(String str, String splitBy) { int len = str.length(); int targetLen = splitBy.length();