fix(gui): make link for full class names (#378)

This commit is contained in:
Skylot
2018-10-28 18:24:09 +03:00
parent a8a31643f1
commit a3464d7184
24 changed files with 602 additions and 463 deletions
@@ -311,10 +311,38 @@ public final class JadxDecompiler {
return methodsMap;
}
JavaMethod getJavaMethodByNode(MethodNode mth) {
JavaMethod javaMethod = methodsMap.get(mth);
if (javaMethod != null) {
return javaMethod;
}
// parent class not loaded yet
JavaClass javaClass = classesMap.get(mth.getParentClass());
if (javaClass != null) {
javaClass.decompile();
return methodsMap.get(mth);
}
return null;
}
Map<FieldNode, JavaField> getFieldsMap() {
return fieldsMap;
}
JavaField getJavaFieldByNode(FieldNode fld) {
JavaField javaField = fieldsMap.get(fld);
if (javaField != null) {
return javaField;
}
// parent class not loaded yet
JavaClass javaClass = classesMap.get(fld.getParentClass());
if (javaClass != null) {
javaClass.decompile();
return fieldsMap.get(fld);
}
return null;
}
public JadxArgs getArgs() {
return args;
}
@@ -160,10 +160,10 @@ public final class JavaClass implements JavaNode {
return getRootDecompiler().getClassesMap().get(obj);
}
if (obj instanceof MethodNode) {
return getRootDecompiler().getMethodsMap().get(obj);
return getRootDecompiler().getJavaMethodByNode(((MethodNode) obj));
}
if (obj instanceof FieldNode) {
return getRootDecompiler().getFieldsMap().get(obj);
return getRootDecompiler().getJavaFieldByNode((FieldNode) obj);
}
return null;
}
@@ -181,15 +181,6 @@ public final class JavaClass implements JavaNode {
return convertNode(obj);
}
@Nullable
public CodePosition getDefinitionPosition(int line, int offset) {
JavaNode javaNode = getJavaNodeAtPosition(line, offset);
if (javaNode == null) {
return null;
}
return getDefinitionPosition(javaNode);
}
@Nullable
public CodePosition getDefinitionPosition(JavaNode javaNode) {
JavaClass jCls = javaNode.getTopParentClass();
@@ -265,6 +256,6 @@ public final class JavaClass implements JavaNode {
@Override
public String toString() {
return cls.getFullName() + "[ " + getFullName() + " ]";
return getFullName();
}
}
@@ -1,7 +1,6 @@
package jadx.core.codegen;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
@@ -84,35 +83,18 @@ public class ClassGen {
}
int importsCount = imports.size();
if (importsCount != 0) {
List<String> sortImports = new ArrayList<>(importsCount);
for (ClassInfo ic : imports) {
sortImports.add(ic.getAlias().getFullName());
}
Collections.sort(sortImports);
for (String imp : sortImports) {
ClassInfo importClassInfo = ClassInfo.fromName(cls.dex().root(), imp);
ClassNode classNode = cls.dex().resolveClass(importClassInfo);
// Clickable element seems to be limited by the next dot, therefore
// we can't just use the complete class name including packagename
int clsDotIdx = imp.lastIndexOf('.');
String pkg = "";
if (clsDotIdx >= 0) {
pkg = imp.substring(0, clsDotIdx + 1);
imp = imp.substring(clsDotIdx + 1);
}
List<ClassInfo> sortedImports = new ArrayList<>(imports);
sortedImports.sort(Comparator.comparing(classInfo -> classInfo.getAlias().getFullName()));
sortedImports.forEach(classInfo -> {
clsCode.startLine("import ");
clsCode.add(pkg);
ClassNode classNode = cls.root().resolveClass(classInfo);
if (classNode != null) {
// attach the clickable link info to the class name
clsCode.attachAnnotation(classNode);
}
clsCode.add(imp);
clsCode.add(classInfo.getAlias().getFullName());
clsCode.add(';');
}
});
clsCode.newLine();
sortImports.clear();
imports.clear();
}
clsCode.add(clsBody);