diff --git a/jadx-core/src/main/java/jadx/api/impl/passes/DecompilePassWrapper.java b/jadx-core/src/main/java/jadx/api/impl/passes/DecompilePassWrapper.java index 9e202fdf1..6795df6a6 100644 --- a/jadx-core/src/main/java/jadx/api/impl/passes/DecompilePassWrapper.java +++ b/jadx-core/src/main/java/jadx/api/impl/passes/DecompilePassWrapper.java @@ -39,7 +39,7 @@ public class DecompilePassWrapper extends AbstractVisitor implements IPassWrappe try { return decompilePass.visit(cls); } catch (Throwable e) { - LOG.error("Error in decompile pass: {}, class: {}", this, cls, e); + cls.addError("Error in decompile pass: " + this, e); return false; } } @@ -49,7 +49,7 @@ public class DecompilePassWrapper extends AbstractVisitor implements IPassWrappe try { decompilePass.visit(mth); } catch (Throwable e) { - LOG.error("Error in decompile pass: {}, method: {}", this, mth, e); + mth.addError("Error in decompile pass: " + this, e); } } diff --git a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java index 7f92ef76f..626fac77e 100644 --- a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java +++ b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java @@ -7,6 +7,7 @@ import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -744,4 +745,11 @@ public abstract class IntegrationTest extends TestUtils { assertThat(javaVariable).isNotNull(); return javaVariable; } + + public File getResourceFile(String filePath) { + URL resource = getClass().getClassLoader().getResource(filePath); + assertThat(resource).as("Resource not found: %s", filePath).isNotNull(); + String resPath = resource.getFile(); + return new File(resPath); + } } diff --git a/jadx-plugins/jadx-kotlin-metadata/build.gradle.kts b/jadx-plugins/jadx-kotlin-metadata/build.gradle.kts index a68cb23ed..521bc7f07 100644 --- a/jadx-plugins/jadx-kotlin-metadata/build.gradle.kts +++ b/jadx-plugins/jadx-kotlin-metadata/build.gradle.kts @@ -6,10 +6,11 @@ plugins { dependencies { api(project(":jadx-core")) - implementation("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.9.0") + implementation("org.jetbrains.kotlin:kotlin-metadata-jvm:2.2.20") testImplementation(project.project(":jadx-core").sourceSets.getByName("test").output) testImplementation("org.apache.commons:commons-lang3:3.19.0") testRuntimeOnly(project(":jadx-plugins:jadx-smali-input")) + testRuntimeOnly(project(":jadx-plugins:jadx-java-input")) } diff --git a/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KmClassWrapper.kt b/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KmClassWrapper.kt index 3164b755d..bc808bf1a 100644 --- a/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KmClassWrapper.kt +++ b/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KmClassWrapper.kt @@ -1,9 +1,9 @@ package jadx.plugins.kotlin.metadata.utils import jadx.core.dex.nodes.ClassNode -import kotlinx.metadata.KmClass -import kotlinx.metadata.isData -import kotlinx.metadata.jvm.KotlinClassMetadata +import kotlin.metadata.KmClass +import kotlin.metadata.isData +import kotlin.metadata.jvm.KotlinClassMetadata // don't expose kotlinx.metadata.* types ? class KmClassWrapper private constructor( diff --git a/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KmExt.kt b/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KmExt.kt index f843fdee9..be1acc4a5 100644 --- a/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KmExt.kt +++ b/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KmExt.kt @@ -1,9 +1,9 @@ package jadx.plugins.kotlin.metadata.utils -import kotlinx.metadata.KmFunction -import kotlinx.metadata.KmProperty -import kotlinx.metadata.jvm.fieldSignature -import kotlinx.metadata.jvm.signature +import kotlin.metadata.KmFunction +import kotlin.metadata.KmProperty +import kotlin.metadata.jvm.fieldSignature +import kotlin.metadata.jvm.signature inline val KmFunction.shortId: String? get() = signature?.toString() diff --git a/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KotlinMetadataExt.kt b/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KotlinMetadataExt.kt index d8165d1f1..9209eb95b 100644 --- a/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KotlinMetadataExt.kt +++ b/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KotlinMetadataExt.kt @@ -7,8 +7,8 @@ import jadx.api.plugins.input.data.annotations.EncodedValue import jadx.api.plugins.input.data.annotations.IAnnotation import jadx.core.dex.nodes.ClassNode import jadx.plugins.kotlin.metadata.model.KotlinMetadataConsts -import kotlinx.metadata.jvm.KotlinClassMetadata -import kotlinx.metadata.jvm.Metadata +import kotlin.metadata.jvm.KotlinClassMetadata +import kotlin.metadata.jvm.Metadata fun ClassNode.getMetadata(): Metadata? { val annotation: IAnnotation? = getAnnotation(KotlinMetadataConsts.KOTLIN_METADATA_ANNOTATION) diff --git a/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KotlinMetadataUtils.kt b/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KotlinMetadataUtils.kt index b1da5b166..e763fc99a 100644 --- a/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KotlinMetadataUtils.kt +++ b/jadx-plugins/jadx-kotlin-metadata/src/main/kotlin/jadx/plugins/kotlin/metadata/utils/KotlinMetadataUtils.kt @@ -9,7 +9,7 @@ import jadx.plugins.kotlin.metadata.model.ClassAliasRename import jadx.plugins.kotlin.metadata.model.CompanionRename import jadx.plugins.kotlin.metadata.model.FieldRename import jadx.plugins.kotlin.metadata.model.MethodArgRename -import kotlinx.metadata.KmClass +import kotlin.metadata.KmClass object KotlinMetadataUtils { diff --git a/jadx-plugins/jadx-kotlin-metadata/src/test/kotlin/TestJavaParser.kt b/jadx-plugins/jadx-kotlin-metadata/src/test/kotlin/TestJavaParser.kt new file mode 100644 index 000000000..5e2f8daaf --- /dev/null +++ b/jadx-plugins/jadx-kotlin-metadata/src/test/kotlin/TestJavaParser.kt @@ -0,0 +1,16 @@ +package jadx.plugins.kotlin.metadata.tests + +import jadx.tests.api.IntegrationTest +import jadx.tests.api.utils.assertj.JadxAssertions.assertThat +import org.junit.jupiter.api.Test + +class TestJavaParser : IntegrationTest() { + + @Test + fun test() { + val sampleCls = getResourceFile("samples/MainKt.class") + assertThat(getClassNodeFromFiles(listOf(sampleCls), "MainKt")) + .code() + .doesNotContain("Exception occurred when reading Kotlin metadata") + } +} diff --git a/jadx-plugins/jadx-kotlin-metadata/src/test/resources/samples/MainKt.class b/jadx-plugins/jadx-kotlin-metadata/src/test/resources/samples/MainKt.class new file mode 100644 index 000000000..a97162181 Binary files /dev/null and b/jadx-plugins/jadx-kotlin-metadata/src/test/resources/samples/MainKt.class differ