diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/BaseJvmAbiTest.kt b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/BaseJvmAbiTest.kt index e0650a0dabc..e24b28ec674 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/BaseJvmAbiTest.kt +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/BaseJvmAbiTest.kt @@ -5,10 +5,14 @@ package org.jetbrains.kotlin.jvm.abi +import com.intellij.openapi.util.io.FileUtil import junit.framework.TestCase import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler +import org.jetbrains.kotlin.codegen.CodegenTestUtil +import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.config.Services +import org.jetbrains.kotlin.test.KotlinTestUtils import java.io.File import kotlin.io.path.ExperimentalPathApi import kotlin.io.path.createTempDirectory @@ -45,6 +49,9 @@ abstract class BaseJvmAbiTest : TestCase() { val abiDir: File get() = if (name == null) workingDir.resolve("abi") else workingDir.resolve("$name/abi") + val javaDestinationDir: File + get() = if (name == null) workingDir.resolve("javaOut") else workingDir.resolve("$name/javaOut") + override fun toString(): String = "compilation '$name'" } @@ -76,6 +83,23 @@ abstract class BaseJvmAbiTest : TestCase() { val errorLines = listOf("Could not compile $compilation", "Exit code: $exitCode", "Errors:") + messageCollector.errors error(errorLines.joinToString("\n")) } + + // Compile Java files into both the destination and ABI directories in order make the + // results available to run and to downstream compilations. + val javaFiles = CodegenTestUtil.findJavaSourcesInDirectory(compilation.srcDir).map(::File) + if (javaFiles.isNotEmpty()) { + compilation.javaDestinationDir.mkdirs() + val javacOptions = listOf( + "-classpath", + (abiDependencies + compilation.destinationDir).joinToString(File.pathSeparator) { it.canonicalPath } + + File.pathSeparator + ForTestCompileRuntime.runtimeJarForTests(), + "-d", + compilation.javaDestinationDir.canonicalPath + ) + KotlinTestUtils.compileJavaFiles(javaFiles, javacOptions) + FileUtil.copyDir(compilation.javaDestinationDir, compilation.destinationDir) + FileUtil.copyDir(compilation.javaDestinationDir, compilation.abiDir) + } } protected open val useIrBackend: Boolean diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java index 62aa24a38a4..42d210c04b7 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/CompileAgainstJvmAbiTestGenerated.java @@ -80,6 +80,26 @@ public class CompileAgainstJvmAbiTestGenerated extends AbstractCompileAgainstJvm runTest("plugins/jvm-abi-gen/testData/compile/kt-40340/"); } + @TestMetadata("privateAnnotationsFromJavaApp") + public void testPrivateAnnotationsFromJavaApp() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/"); + } + + @TestMetadata("privateAnnotationsFromJavaLib") + public void testPrivateAnnotationsFromJavaLib() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/"); + } + + @TestMetadata("privateClassesFromJavaApp") + public void testPrivateClassesFromJavaApp() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/"); + } + + @TestMetadata("privateClassesFromJavaLib") + public void testPrivateClassesFromJavaLib() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/"); + } + @TestMetadata("privateOnlyConstructors") public void testPrivateOnlyConstructors() throws Exception { runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/"); diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java index 56ee94720d0..8645c7cc996 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/IrCompileAgainstJvmAbiTestGenerated.java @@ -80,6 +80,26 @@ public class IrCompileAgainstJvmAbiTestGenerated extends AbstractIrCompileAgains runTest("plugins/jvm-abi-gen/testData/compile/kt-40340/"); } + @TestMetadata("privateAnnotationsFromJavaApp") + public void testPrivateAnnotationsFromJavaApp() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/"); + } + + @TestMetadata("privateAnnotationsFromJavaLib") + public void testPrivateAnnotationsFromJavaLib() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/"); + } + + @TestMetadata("privateClassesFromJavaApp") + public void testPrivateClassesFromJavaApp() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/"); + } + + @TestMetadata("privateClassesFromJavaLib") + public void testPrivateClassesFromJavaLib() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/"); + } + @TestMetadata("privateOnlyConstructors") public void testPrivateOnlyConstructors() throws Exception { runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/"); diff --git a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java index a503d2e6af7..2abd2b3fb86 100644 --- a/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java +++ b/plugins/jvm-abi-gen/test/org/jetbrains/kotlin/jvm/abi/LegacyCompileAgainstJvmAbiTestGenerated.java @@ -80,6 +80,26 @@ public class LegacyCompileAgainstJvmAbiTestGenerated extends AbstractLegacyCompi runTest("plugins/jvm-abi-gen/testData/compile/kt-40340/"); } + @TestMetadata("privateAnnotationsFromJavaApp") + public void testPrivateAnnotationsFromJavaApp() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/"); + } + + @TestMetadata("privateAnnotationsFromJavaLib") + public void testPrivateAnnotationsFromJavaLib() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/"); + } + + @TestMetadata("privateClassesFromJavaApp") + public void testPrivateClassesFromJavaApp() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/"); + } + + @TestMetadata("privateClassesFromJavaLib") + public void testPrivateClassesFromJavaLib() throws Exception { + runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/"); + } + @TestMetadata("privateOnlyConstructors") public void testPrivateOnlyConstructors() throws Exception { runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/"); diff --git a/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/app/app.kt b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/app/app.kt new file mode 100644 index 00000000000..d7e5cfabcf6 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/app/app.kt @@ -0,0 +1,7 @@ +package app + +import lib.J + +fun runAppAndReturnOk(): String { + return J.value() +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/app/lib/J.java b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/app/lib/J.java new file mode 100644 index 00000000000..41e9cd471f5 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/app/lib/J.java @@ -0,0 +1,8 @@ +package lib; + +@A(value = "OK") +public class J { + public static String value() { + return J.class.getAnnotation(A.class).value(); + } +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/lib/lib.kt b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/lib/lib.kt new file mode 100644 index 00000000000..3ee1ea72d4e --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/lib/lib.kt @@ -0,0 +1,4 @@ +package lib + +@Retention(AnnotationRetention.RUNTIME) +private annotation class A(val value: String) diff --git a/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/app/app.kt b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/app/app.kt new file mode 100644 index 00000000000..a4a32c6f854 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/app/app.kt @@ -0,0 +1,7 @@ +package app + +import lib.J + +fun runAppAndReturnOk(): String { + return if (J::class.java.annotations.size == 1) "OK" else "Fail" +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/lib/J.java b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/lib/J.java new file mode 100644 index 00000000000..4557d84715d --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/lib/J.java @@ -0,0 +1,4 @@ +package lib; + +@A +public class J {} diff --git a/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/lib/lib.kt b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/lib/lib.kt new file mode 100644 index 00000000000..46d67000445 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/lib/lib.kt @@ -0,0 +1,4 @@ +package lib + +@Retention(AnnotationRetention.RUNTIME) +private annotation class A diff --git a/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/app/app.kt b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/app/app.kt new file mode 100644 index 00000000000..7ccb470685d --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/app/app.kt @@ -0,0 +1,7 @@ +package app + +import lib.J + +fun runAppAndReturnOk(): String { + return J.result() +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/app/lib/J.java b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/app/lib/J.java new file mode 100644 index 00000000000..fdc40f0b864 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/app/lib/J.java @@ -0,0 +1,7 @@ +package lib; + +public class J { + public static String result() { + return new A().result(); + } +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/lib/lib.kt b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/lib/lib.kt new file mode 100644 index 00000000000..747fbab0a25 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/lib/lib.kt @@ -0,0 +1,5 @@ +package lib + +private class A { + fun result() = "OK" +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/app/app.kt b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/app/app.kt new file mode 100644 index 00000000000..7ccb470685d --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/app/app.kt @@ -0,0 +1,7 @@ +package app + +import lib.J + +fun runAppAndReturnOk(): String { + return J.result() +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/lib/J.java b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/lib/J.java new file mode 100644 index 00000000000..fdc40f0b864 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/lib/J.java @@ -0,0 +1,7 @@ +package lib; + +public class J { + public static String result() { + return new A().result(); + } +} diff --git a/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/lib/lib.kt b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/lib/lib.kt new file mode 100644 index 00000000000..747fbab0a25 --- /dev/null +++ b/plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/lib/lib.kt @@ -0,0 +1,5 @@ +package lib + +private class A { + fun result() = "OK" +}