gui: add definitions search window

This commit is contained in:
Skylot
2014-06-14 18:58:20 +04:00
parent d2acaa03f5
commit b67cd50e8a
33 changed files with 815 additions and 139 deletions
@@ -44,8 +44,8 @@ import org.slf4j.LoggerFactory;
* }
* </code></pre>
*/
public final class Decompiler {
private static final Logger LOG = LoggerFactory.getLogger(Decompiler.class);
public final class JadxDecompiler {
private static final Logger LOG = LoggerFactory.getLogger(JadxDecompiler.class);
private final IJadxArgs args;
private final List<InputFile> inputFiles = new ArrayList<InputFile>();
@@ -56,12 +56,12 @@ public final class Decompiler {
private List<IDexTreeVisitor> passes;
private List<JavaClass> classes;
public Decompiler() {
public JadxDecompiler() {
this.args = new DefaultJadxArgs();
init();
}
public Decompiler(IJadxArgs jadxArgs) {
public JadxDecompiler(IJadxArgs jadxArgs) {
this.args = jadxArgs;
init();
}
@@ -143,7 +143,7 @@ public final class Decompiler {
List<ClassNode> classNodeList = root.getClasses(false);
List<JavaClass> clsList = new ArrayList<JavaClass>(classNodeList.size());
for (ClassNode classNode : classNodeList) {
clsList.add(new JavaClass(this, classNode));
clsList.add(new JavaClass(classNode, this));
}
classes = Collections.unmodifiableList(clsList);
}
@@ -174,7 +174,7 @@ public final class Decompiler {
Collections.sort(pkg.getClasses(), new Comparator<JavaClass>() {
@Override
public int compare(JavaClass o1, JavaClass o2) {
return o1.getShortName().compareTo(o2.getShortName());
return o1.getName().compareTo(o2.getName());
}
});
}
+31 -11
View File
@@ -7,7 +7,6 @@ import jadx.core.dex.info.AccessInfo;
import jadx.core.dex.nodes.ClassNode;
import jadx.core.dex.nodes.FieldNode;
import jadx.core.dex.nodes.MethodNode;
import jadx.core.utils.exceptions.JadxRuntimeException;
import java.util.ArrayList;
import java.util.Collections;
@@ -15,18 +14,29 @@ import java.util.Comparator;
import java.util.List;
import java.util.Map;
public final class JavaClass {
public final class JavaClass implements JavaNode {
private final Decompiler decompiler;
private final JadxDecompiler decompiler;
private final ClassNode cls;
private final JavaClass parent;
private List<JavaClass> innerClasses = Collections.emptyList();
private List<JavaField> fields = Collections.emptyList();
private List<JavaMethod> methods = Collections.emptyList();
JavaClass(Decompiler decompiler, ClassNode classNode) {
JavaClass(ClassNode classNode, JadxDecompiler decompiler) {
this.decompiler = decompiler;
this.cls = classNode;
this.parent = null;
}
/**
* Inner classes constructor
*/
JavaClass(ClassNode classNode, JavaClass parent) {
this.decompiler = null;
this.cls = classNode;
this.parent = parent;
}
public String getCode() {
@@ -43,7 +53,7 @@ public final class JavaClass {
public void decompile() {
if (decompiler == null) {
throw new JadxRuntimeException("Can't decompile inner class");
return;
}
if (cls.getCode() == null) {
decompiler.processClass(cls);
@@ -61,7 +71,7 @@ public final class JavaClass {
List<JavaClass> list = new ArrayList<JavaClass>(inClsCount);
for (ClassNode inner : cls.getInnerClasses()) {
if (!inner.contains(AFlag.DONT_GENERATE)) {
JavaClass javaClass = new JavaClass(null, inner);
JavaClass javaClass = new JavaClass(inner, this);
javaClass.load();
list.add(javaClass);
}
@@ -74,7 +84,7 @@ public final class JavaClass {
List<JavaField> flds = new ArrayList<JavaField>(fieldsCount);
for (FieldNode f : cls.getFields()) {
if (!f.contains(AFlag.DONT_GENERATE)) {
flds.add(new JavaField(f));
flds.add(new JavaField(f, this));
}
}
this.fields = Collections.unmodifiableList(flds);
@@ -135,31 +145,41 @@ public final class JavaClass {
return cls.getCode().getLineMapping().get(decompiledLine);
}
@Override
public String getName() {
return cls.getShortName();
}
@Override
public String getFullName() {
return cls.getFullName();
}
public String getShortName() {
return cls.getShortName();
}
public String getPackage() {
return cls.getPackage();
}
@Override
public JavaClass getDeclaringClass() {
return parent;
}
public AccessInfo getAccessInfo() {
return cls.getAccessFlags();
}
public List<JavaClass> getInnerClasses() {
decompile();
return innerClasses;
}
public List<JavaField> getFields() {
decompile();
return fields;
}
public List<JavaMethod> getMethods() {
decompile();
return methods;
}
@@ -4,18 +4,31 @@ import jadx.core.dex.info.AccessInfo;
import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.nodes.FieldNode;
public final class JavaField {
public final class JavaField implements JavaNode {
private final FieldNode field;
private final JavaClass parent;
public JavaField(FieldNode f) {
JavaField(FieldNode f, JavaClass cls) {
this.field = f;
this.parent = cls;
}
@Override
public String getName() {
return field.getName();
}
@Override
public String getFullName() {
return parent.getFullName() + "." + field.getName();
}
@Override
public JavaClass getDeclaringClass() {
return parent;
}
public AccessInfo getAccessFlags() {
return field.getAccessFlags();
}
@@ -6,19 +6,26 @@ import jadx.core.dex.nodes.MethodNode;
import java.util.List;
public final class JavaMethod {
public final class JavaMethod implements JavaNode {
private final MethodNode mth;
private final JavaClass parent;
public JavaMethod(JavaClass cls, MethodNode m) {
JavaMethod(JavaClass cls, MethodNode m) {
this.parent = cls;
this.mth = m;
}
@Override
public String getName() {
return mth.getMethodInfo().getName();
return mth.getName();
}
@Override
public String getFullName() {
return mth.getMethodInfo().getFullName();
}
@Override
public JavaClass getDeclaringClass() {
return parent;
}
@@ -0,0 +1,10 @@
package jadx.api;
public interface JavaNode {
String getName();
String getFullName();
JavaClass getDeclaringClass();
}
@@ -2,7 +2,7 @@ package jadx.api;
import java.util.List;
public final class JavaPackage implements Comparable<JavaPackage> {
public final class JavaPackage implements JavaNode, Comparable<JavaPackage> {
private final String name;
private final List<JavaClass> classes;
@@ -11,14 +11,26 @@ public final class JavaPackage implements Comparable<JavaPackage> {
this.classes = classes;
}
@Override
public String getName() {
return name;
}
@Override
public String getFullName() {
// TODO: store full package name
return name;
}
public List<JavaClass> getClasses() {
return classes;
}
@Override
public JavaClass getDeclaringClass() {
return null;
}
@Override
public int compareTo(JavaPackage o) {
return name.compareTo(o.name);
@@ -1,6 +1,6 @@
package jadx.tests
import jadx.api.Decompiler
import jadx.api.JadxDecompiler
import jadx.api.IJadxArgs
import jadx.core.dex.nodes.MethodNode
import jadx.core.utils.ErrorsCounter
@@ -12,7 +12,7 @@ class TestAPI extends Specification {
def "no loaded files"() {
setup:
def d = new Decompiler()
def d = new JadxDecompiler()
when:
def classes = d.getClasses()
def packages = d.getPackages()
@@ -24,7 +24,7 @@ class TestAPI extends Specification {
def "save with no loaded files"() {
when:
new Decompiler().save()
new JadxDecompiler().save()
then:
def e = thrown(JadxRuntimeException)
e.message == "No loaded files"
@@ -32,7 +32,7 @@ class TestAPI extends Specification {
def "load empty files list"() {
when:
new Decompiler().loadFiles(Collections.emptyList())
new JadxDecompiler().loadFiles(Collections.emptyList())
then:
def e = thrown(JadxException)
e.message == "Empty file list"
@@ -40,14 +40,14 @@ class TestAPI extends Specification {
def "load null"() {
when:
new Decompiler().loadFile(null)
new JadxDecompiler().loadFile(null)
then:
thrown(NullPointerException)
}
def "load missing file"() {
when:
new Decompiler().loadFile(new File("_.dex"))
new JadxDecompiler().loadFile(new File("_.dex"))
then:
def e = thrown(JadxException)
e.message == "Error load file: _.dex"
@@ -58,29 +58,29 @@ class TestAPI extends Specification {
setup:
def args = Mock(IJadxArgs)
when:
new Decompiler(args)
new JadxDecompiler(args)
then:
noExceptionThrown()
}
def "get errors count for new decompiler"() {
expect:
new Decompiler().getErrorsCount() == 0
new JadxDecompiler().getErrorsCount() == 0
}
def "get errors count after one more init"() {
setup:
new Decompiler()
new JadxDecompiler()
def mth = Mock(MethodNode)
when:
ErrorsCounter.methodError(mth, "")
def d = new Decompiler()
def d = new JadxDecompiler()
then:
d.getErrorsCount() == 0
}
def "decompiler toString()"() {
expect:
new Decompiler().toString() == "jadx decompiler"
new JadxDecompiler().toString() == "jadx decompiler"
}
}
@@ -36,7 +36,7 @@ public abstract class InternalJadxTest extends TestUtils {
protected String outDir = "test-out-tmp";
public ClassNode getClassNode(Class<?> clazz) {
Decompiler d = new Decompiler();
JadxDecompiler d = new JadxDecompiler();
try {
d.loadFile(getJarForClass(clazz));
} catch (Exception e) {