From 18a1788d2d4704e8a404c7bbb4b33e660abbb713 Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 25 Mar 2014 22:57:56 +0400 Subject: [PATCH] gui: fix class members expand --- .../src/main/java/jadx/api/Decompiler.java | 41 ++++++++++++++----- .../src/main/java/jadx/api/JavaClass.java | 22 ++++++---- .../src/main/java/jadx/gui/JadxWrapper.java | 1 + .../main/java/jadx/gui/treemodel/JClass.java | 2 +- 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/Decompiler.java b/jadx-core/src/main/java/jadx/api/Decompiler.java index afa3a7f77fb..86970056b57 100644 --- a/jadx-core/src/main/java/jadx/api/Decompiler.java +++ b/jadx-core/src/main/java/jadx/api/Decompiler.java @@ -54,6 +54,7 @@ public final class Decompiler { private RootNode root; private List passes; + private List classes; public Decompiler() { this.args = new DefaultJadxArgs(); @@ -95,6 +96,7 @@ public void loadFiles(List files) throws IOException, DecodeException { public void save() { try { ExecutorService ex = getSaveExecutor(); + ex.shutdown(); ex.awaitTermination(1, TimeUnit.DAYS); } catch (InterruptedException e) { LOG.error("Save interrupted", e); @@ -122,23 +124,24 @@ public void run() { } }); } - executor.shutdown(); return executor; } public List getClasses() { - List classNodeList = root.getClasses(false); - List classes = new ArrayList(classNodeList.size()); - for (ClassNode classNode : classNodeList) { - classes.add(new JavaClass(this, classNode)); + if (classes == null) { + List classNodeList = root.getClasses(false); + List clsList = new ArrayList(classNodeList.size()); + for (ClassNode classNode : classNodeList) { + clsList.add(new JavaClass(this, classNode)); + } + classes = Collections.unmodifiableList(clsList); } - return Collections.unmodifiableList(classes); + return classes; } public List getPackages() { - List classes = getClasses(); Map> map = new HashMap>(); - for (JavaClass javaClass : classes) { + for (JavaClass javaClass : getClasses()) { String pkg = javaClass.getPackage(); List clsList = map.get(pkg); if (clsList == null) { @@ -168,14 +171,18 @@ public int getErrorsCount() { } void parse() throws DecodeException { - ClassInfo.clearCache(); - ErrorsCounter.reset(); - + reset(); root = new RootNode(); LOG.info("loading ..."); root.load(inputFiles); } + private void reset() { + ClassInfo.clearCache(); + ErrorsCounter.reset(); + classes = null; + } + void processClass(ClassNode cls) { LOG.info("processing class {} ...", cls); ProcessClass.process(cls, passes); @@ -184,4 +191,16 @@ void processClass(ClassNode cls) { RootNode getRoot() { return root; } + + JavaClass findJavaClass(ClassNode cls) { + if (cls == null) { + return null; + } + for (JavaClass javaClass : getClasses()) { + if (javaClass.getClassNode().equals(cls)) { + return javaClass; + } + } + return null; + } } diff --git a/jadx-core/src/main/java/jadx/api/JavaClass.java b/jadx-core/src/main/java/jadx/api/JavaClass.java index cbf2176b015..7d02b92d33c 100644 --- a/jadx-core/src/main/java/jadx/api/JavaClass.java +++ b/jadx-core/src/main/java/jadx/api/JavaClass.java @@ -48,6 +48,10 @@ public void decompile() { } } + ClassNode getClassNode() { + return cls; + } + private void load() { int inClsCount = cls.getInnerClasses().size(); if (inClsCount != 0) { @@ -92,7 +96,7 @@ public int compare(JavaMethod o1, JavaMethod o2) { } private Map getCodeAnnotations() { - getCode(); + decompile(); return cls.getCode().getAnnotations(); } @@ -108,13 +112,17 @@ public CodePosition getDefinitionPosition(int line, int offset) { } else if (obj instanceof FieldNode) { clsNode = ((FieldNode) obj).getParentClass(); } - if (clsNode != null) { - clsNode = clsNode.getParentClass(); - JavaClass jCls = new JavaClass(decompiler, clsNode); - jCls.decompile(); - int defLine = ((LineAttrNode) obj).getDecompiledLine(); - return new CodePosition(jCls, defLine, 0); + 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); } return null; } diff --git a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java index a1b5ba6203c..5901f9ab544 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java @@ -43,6 +43,7 @@ public void run() { try { decompiler.setOutputDir(dir); ThreadPoolExecutor ex = decompiler.getSaveExecutor(); + ex.shutdown(); while (ex.isTerminating()) { long total = ex.getTaskCount(); long done = ex.getCompletedTaskCount(); diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java index 9fee4381766..4fc05293099 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/JClass.java @@ -45,8 +45,8 @@ public synchronized void load() { if (!loaded) { cls.decompile(); loaded = true; - update(); } + update(); } public synchronized void update() {