fix: check class name collisions (#1526)
This commit is contained in:
@@ -614,21 +614,23 @@ public class ClassGen {
|
||||
if (useCls.equals(extClsInfo)) {
|
||||
return shortName;
|
||||
}
|
||||
if (extClsInfo.getPackage().equals("java.lang") && extClsInfo.getParentClass() == null) {
|
||||
return shortName;
|
||||
}
|
||||
if (isClassInnerFor(useCls, extClsInfo)) {
|
||||
return shortName;
|
||||
}
|
||||
if (extClsInfo.isInner()) {
|
||||
return expandInnerClassName(useCls, extClsInfo);
|
||||
}
|
||||
if (searchCollision(cls.root(), useCls, extClsInfo)) {
|
||||
if (checkInnerCollision(cls.root(), useCls, extClsInfo)
|
||||
|| checkInPackageCollision(cls.root(), useCls, extClsInfo)) {
|
||||
return fullName;
|
||||
}
|
||||
if (isBothClassesInOneTopClass(useCls, extClsInfo)) {
|
||||
return shortName;
|
||||
}
|
||||
// don't add import for top classes from 'java.lang' package (subpackages excluded)
|
||||
if (extClsInfo.getPackage().equals("java.lang") && extClsInfo.getParentClass() == null) {
|
||||
return shortName;
|
||||
}
|
||||
// don't add import if this class from same package
|
||||
if (extClsInfo.getPackage().equals(useCls.getPackage()) && !extClsInfo.isInner()) {
|
||||
return shortName;
|
||||
@@ -709,7 +711,7 @@ public class ClassGen {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean searchCollision(RootNode root, ClassInfo useCls, ClassInfo searchCls) {
|
||||
private static boolean checkInnerCollision(RootNode root, @Nullable ClassInfo useCls, ClassInfo searchCls) {
|
||||
if (useCls == null) {
|
||||
return false;
|
||||
}
|
||||
@@ -726,7 +728,20 @@ public class ClassGen {
|
||||
}
|
||||
}
|
||||
}
|
||||
return searchCollision(root, useCls.getParentClass(), searchCls);
|
||||
return checkInnerCollision(root, useCls.getParentClass(), searchCls);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if class with same name exists in current package
|
||||
*/
|
||||
private static boolean checkInPackageCollision(RootNode root, ClassInfo useCls, ClassInfo searchCls) {
|
||||
String currentPkg = useCls.getAliasPkg();
|
||||
if (currentPkg.equals(searchCls.getAliasPkg())) {
|
||||
// search class already from current package
|
||||
return false;
|
||||
}
|
||||
String shortName = searchCls.getAliasShortName();
|
||||
return root.getClsp().isClsKnown(currentPkg + '.' + shortName);
|
||||
}
|
||||
|
||||
private void insertRenameInfo(ICodeWriter code, ClassNode cls) {
|
||||
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
package jadx.tests.integration.names;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
import jadx.tests.api.IntegrationTest;
|
||||
|
||||
import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat;
|
||||
|
||||
public class TestCollisionWithJavaLangClasses extends IntegrationTest {
|
||||
|
||||
public static class TestCls1 {
|
||||
public static class System {
|
||||
public static void main(String[] args) {
|
||||
java.lang.System.out.println("Hello world");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test1() {
|
||||
assertThat(getClassNode(TestCls1.class))
|
||||
.code()
|
||||
.containsOne("java.lang.System.out.println");
|
||||
}
|
||||
|
||||
public static class TestCls2 {
|
||||
public void doSomething() {
|
||||
System.doSomething();
|
||||
java.lang.System.out.println("Hello World");
|
||||
}
|
||||
|
||||
public static class System {
|
||||
public static void doSomething() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test2() {
|
||||
assertThat(getClassNode(TestCls2.class))
|
||||
.code()
|
||||
.containsLine(2, "System.doSomething();")
|
||||
.containsOne("java.lang.System.out.println");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test3() {
|
||||
List<ClassNode> classes = getClassNodes(
|
||||
jadx.tests.integration.names.pkg2.System.class,
|
||||
jadx.tests.integration.names.pkg2.TestCls.class);
|
||||
assertThat(searchCls(classes, "TestCls"))
|
||||
.code()
|
||||
.containsLine(2, "System.doSomething();")
|
||||
.containsOne("java.lang.System.out.println");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package jadx.tests.integration.names.pkg2;
|
||||
|
||||
public class System {
|
||||
public static void doSomething() {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package jadx.tests.integration.names.pkg2;
|
||||
|
||||
public class TestCls {
|
||||
public void doSomething() {
|
||||
System.doSomething();
|
||||
java.lang.System.out.println("Hello World");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user