From 202fe5a0a92ab630063a6d2fe99d075fffb1c070 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 18 Oct 2014 20:38:56 +0400 Subject: [PATCH] core: fix links for fields in nested classes --- .../src/main/java/jadx/api/JavaClass.java | 45 ++++++++++--------- .../java/jadx/core/dex/nodes/ClassNode.java | 5 +++ 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/JavaClass.java b/jadx-core/src/main/java/jadx/api/JavaClass.java index 0b8fc614..6df20d0f 100644 --- a/jadx-core/src/main/java/jadx/api/JavaClass.java +++ b/jadx-core/src/main/java/jadx/api/JavaClass.java @@ -116,28 +116,31 @@ public final class JavaClass implements JavaNode { public CodePosition getDefinitionPosition(int line, int offset) { Map map = getCodeAnnotations(); Object obj = map.get(new CodePosition(line, offset)); - if (obj instanceof LineAttrNode) { - ClassNode clsNode = null; - if (obj instanceof ClassNode) { - clsNode = (ClassNode) obj; - } else if (obj instanceof MethodNode) { - clsNode = ((MethodNode) obj).getParentClass(); - } else if (obj instanceof FieldNode) { - clsNode = ((FieldNode) obj).getParentClass(); - } - if (clsNode == null) { - return null; - } - clsNode = clsNode.getParentClass(); - JavaClass jCls = decompiler.findJavaClass(clsNode); - if (jCls == null) { - return null; - } - jCls.decompile(); - int defLine = ((LineAttrNode) obj).getDecompiledLine(); - return new CodePosition(jCls, defLine, 0); + if (!(obj instanceof LineAttrNode)) { + return null; + } + ClassNode clsNode = null; + if (obj instanceof ClassNode) { + clsNode = (ClassNode) obj; + } else if (obj instanceof MethodNode) { + clsNode = ((MethodNode) obj).getParentClass(); + } else if (obj instanceof FieldNode) { + clsNode = ((FieldNode) obj).getParentClass(); + } + if (clsNode == null) { + return null; + } + clsNode = clsNode.getTopParentClass(); + JavaClass jCls = decompiler.findJavaClass(clsNode); + if (jCls == null) { + return null; + } + jCls.decompile(); + int defLine = ((LineAttrNode) obj).getDecompiledLine(); + if (defLine == 0) { + return null; } - return null; + return new CodePosition(jCls, defLine, 0); } public Integer getSourceLine(int decompiledLine) { diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index 8e9b1533..f9beb11c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -354,6 +354,11 @@ public class ClassNode extends LineAttrNode implements ILoadable { return parentClass; } + public ClassNode getTopParentClass() { + ClassNode parent = getParentClass(); + return parent == this ? this : parent.getParentClass(); + } + public List getInnerClasses() { return innerClasses; } -- GitLab