diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java index 806c7280e..aa9acc2e6 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java @@ -107,7 +107,7 @@ public class JadxCLIArgs { return process(jcw); } - private boolean process(JCommanderWrapper jcw) { + private boolean process(JCommanderWrapper jcw) { if (printHelp) { jcw.printUsage(); return false; diff --git a/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java b/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java index bb53ac1c2..5234ebced 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/AnnotationGen.java @@ -151,7 +151,7 @@ public class AnnotationGen { InsnGen.makeStaticFieldAccess(code, field, classGen); } else if (val instanceof Iterable) { code.add('{'); - Iterator it = ((Iterable) val).iterator(); + Iterator it = ((Iterable) val).iterator(); while (it.hasNext()) { Object obj = it.next(); encodeValue(code, obj); diff --git a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java index b06c5aa4b..f1436c58d 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/ClassGen.java @@ -144,7 +144,7 @@ public class ClassGen { clsCode.attachDefinition(cls); clsCode.add(cls.getShortName()); - addGenericMap(clsCode, cls.getGenericMap()); + addGenericMap(clsCode, cls.getGenericMap(), true); clsCode.add(' '); ArgType sup = cls.getSuperClass(); @@ -175,7 +175,7 @@ public class ClassGen { } } - public boolean addGenericMap(CodeWriter code, Map> gmap) { + public boolean addGenericMap(CodeWriter code, Map> gmap, boolean classDeclaration) { if (gmap == null || gmap.isEmpty()) { return false; } @@ -200,6 +200,10 @@ public class ClassGen { code.add(g.getObject()); } else { useClass(code, g); + + if (classDeclaration && !cls.getAlias().isInner()) { + addImport(ClassInfo.extCls(cls.root(), g)); + } } if (it.hasNext()) { code.add(" & "); diff --git a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java index efcbf2f62..8c27865c0 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java @@ -90,7 +90,7 @@ public class MethodGen { code.add(mth.isVirtual() ? "/* virtual */ " : "/* direct */ "); } - if (classGen.addGenericMap(code, mth.getGenericMap())) { + if (classGen.addGenericMap(code, mth.getGenericMap(), false)) { code.add(' '); } if (ai.isConstructor()) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/generics/TestImportGenericMap.java b/jadx-core/src/test/java/jadx/tests/integration/generics/TestImportGenericMap.java new file mode 100644 index 000000000..0148c4a6f --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/generics/TestImportGenericMap.java @@ -0,0 +1,40 @@ +package jadx.tests.integration.generics; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +public class TestImportGenericMap extends IntegrationTest { + + @Test + public void test() { + ClassNode cls = getClassNode(SuperClass.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString( + "import " + SuperClass.ToImport.class.getName().replace('$', '.') + ';')); + assertThat(code, not(containsString( + "import " + SuperClass.NotToImport.class.getName().replace('$', '.') + ';'))); + } +} + +final class SuperClass { + + interface ToImport { + } + + interface NotToImport { + } + + static final class Class1 { + } + + public SuperClass(Class1 zzf) { + } + +} \ No newline at end of file