未验证 提交 eaeb1142 编写于 作者: S Skylot

fix: check class name collisions (#1526)

上级 1533b7fe
......@@ -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) {
......
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");
}
}
package jadx.tests.integration.names.pkg2;
public class System {
public static void doSomething() {
}
}
package jadx.tests.integration.names.pkg2;
public class TestCls {
public void doSomething() {
System.doSomething();
java.lang.System.out.println("Hello World");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册