fix: use correct imports for classes from default package (PR #2031)
* fix: use fully qualified package names for classes of defpackage * fix: use correct imports for classes from default package (#2027) --------- Co-authored-by: Skylot <skylot@gmail.com>
This commit is contained in:
@@ -657,6 +657,10 @@ public class ClassGen {
|
||||
if (useCls.equals(extClsInfo)) {
|
||||
return shortName;
|
||||
}
|
||||
if (extClsInfo.getAliasPkg().isEmpty()) {
|
||||
// omit import for default package
|
||||
return shortName;
|
||||
}
|
||||
if (isClassInnerFor(useCls, extClsInfo)) {
|
||||
return shortName;
|
||||
}
|
||||
@@ -678,10 +682,6 @@ public class ClassGen {
|
||||
if (extClsInfo.getPackage().equals(useCls.getPackage()) && !extClsInfo.isInner()) {
|
||||
return shortName;
|
||||
}
|
||||
// ignore classes from default package
|
||||
if (extClsInfo.isDefaultPackage()) {
|
||||
return shortName;
|
||||
}
|
||||
if (extClsInfo.getAliasPkg().equals(useCls.getAliasPkg())) {
|
||||
fullName = extClsInfo.getAliasNameWithoutPackage();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
package jadx.tests.integration.names;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
import jadx.tests.api.SmaliTest;
|
||||
|
||||
import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat;
|
||||
|
||||
public class TestDefPkgRename extends SmaliTest {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
List<ClassNode> clsList = loadFromSmaliFiles();
|
||||
// class A moved to 'defpackage'
|
||||
assertThat(searchCls(clsList, "A"))
|
||||
.code()
|
||||
.containsOne("package defpackage;");
|
||||
assertThat(searchCls(clsList, "pkg.B"))
|
||||
.code()
|
||||
.containsOne("import defpackage.A;")
|
||||
.containsOne("public A a;");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoImports() {
|
||||
args.setUseImports(false);
|
||||
List<ClassNode> clsList = loadFromSmaliFiles();
|
||||
// class A moved to 'defpackage', but use full names
|
||||
assertThat(searchCls(clsList, "A"))
|
||||
.code()
|
||||
.containsOne("package defpackage;");
|
||||
assertThat(searchCls(clsList, "pkg.B"))
|
||||
.code()
|
||||
.doesNotContain("import")
|
||||
.containsOne("public defpackage.A a;");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeobf() {
|
||||
enableDeobfuscation();
|
||||
List<ClassNode> clsList = loadFromSmaliFiles();
|
||||
// package for class A deobfuscated
|
||||
assertThat(searchCls(clsList, "pkg.B"))
|
||||
.code()
|
||||
.containsOne("import p000.C0000A;")
|
||||
.containsOne("public C0000A f0a;");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRenameDisabled() {
|
||||
disableCompilation();
|
||||
args.setRenameFlags(Collections.emptySet());
|
||||
List<ClassNode> clsList = loadFromSmaliFiles();
|
||||
// no renaming, code will not compile
|
||||
assertThat(searchCls(clsList, "A"))
|
||||
.code()
|
||||
.containsOne("// default package");
|
||||
assertThat(searchCls(clsList, "pkg.B"))
|
||||
.code()
|
||||
.doesNotContain("import") // omit import
|
||||
.containsOne("public A a;");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
.class public LA;
|
||||
.super Ljava/lang/Object;
|
||||
@@ -0,0 +1,4 @@
|
||||
.class public Lpkg/B;
|
||||
.super Ljava/lang/Object;
|
||||
|
||||
.field public a:LA;
|
||||
Reference in New Issue
Block a user