From 1a511328845a01937f74bda7354c401f435dda66 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 26 Jul 2018 17:00:54 +0200 Subject: [PATCH] Add CLI tests on internal from other module (JVM, JS, common) --- .../library/a.kt | 15 +++++++++++ .../output.txt | 19 ++++++++++++++ .../internalFromForeignModuleCommon/source.kt | 10 ++++++++ .../internalFromForeignModuleJs/library/a.kt | 15 +++++++++++ .../internalFromForeignModuleJs/output.txt | 19 ++++++++++++++ .../internalFromForeignModuleJs/source.kt | 10 ++++++++ .../library/a.kt | 15 +++++++++++ .../internalFromFriendModuleCommon/output.txt | 1 + .../internalFromFriendModuleCommon/source.kt | 10 ++++++++ .../internalFromFriendModuleJs/library/a.kt | 15 +++++++++++ .../internalFromFriendModuleJs/output.txt | 1 + .../internalFromFriendModuleJs/source.kt | 10 ++++++++ .../AbstractKotlinCompilerIntegrationTest.kt | 25 ++++++++++++++++--- .../CompileKotlinAgainstCustomBinariesTest.kt | 24 ++++++++++++++++++ 14 files changed, 185 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/library/a.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/output.txt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/library/a.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/output.txt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/library/a.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/output.txt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/source.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/library/a.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/output.txt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/source.kt diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/library/a.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/library/a.kt new file mode 100644 index 00000000000..a7fd975a6be --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/library/a.kt @@ -0,0 +1,15 @@ +package a + +internal interface InternalInterface + +public class PublicClass { + internal fun internalMemberFun() {} + + internal companion object {} +} + +internal val internalVal = "" + +internal fun internalFun(s: String): String = s + +internal typealias InternalTypealias = InternalInterface diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/output.txt new file mode 100644 index 00000000000..43d29d7630a --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/output.txt @@ -0,0 +1,19 @@ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt:3:21: error: cannot access 'InternalInterface': it is internal in 'a' +private fun test(i: InternalInterface): InternalTypealias { + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt:3:41: error: cannot access 'InternalTypealias': it is internal in 'a' +private fun test(i: InternalInterface): InternalTypealias { + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt:4:19: error: cannot access 'internalMemberFun': it is internal in 'PublicClass' + PublicClass().internalMemberFun() + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt:5:17: error: cannot access 'Companion': it is internal in 'PublicClass' + PublicClass.Companion + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt:7:5: error: cannot access 'internalFun': it is internal in 'a' + internalFun(internalVal) + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt:7:17: error: cannot access 'internalVal': it is internal in 'a' + internalFun(internalVal) + ^ +COMPILATION_ERROR diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt new file mode 100644 index 00000000000..5e872880a78 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleCommon/source.kt @@ -0,0 +1,10 @@ +import a.* + +private fun test(i: InternalInterface): InternalTypealias { + PublicClass().internalMemberFun() + PublicClass.Companion + + internalFun(internalVal) + + return i +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/library/a.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/library/a.kt new file mode 100644 index 00000000000..a7fd975a6be --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/library/a.kt @@ -0,0 +1,15 @@ +package a + +internal interface InternalInterface + +public class PublicClass { + internal fun internalMemberFun() {} + + internal companion object {} +} + +internal val internalVal = "" + +internal fun internalFun(s: String): String = s + +internal typealias InternalTypealias = InternalInterface diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/output.txt new file mode 100644 index 00000000000..60c41e56eb2 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/output.txt @@ -0,0 +1,19 @@ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt:3:21: error: cannot access 'InternalInterface': it is internal in 'a' +private fun test(i: InternalInterface): InternalTypealias { + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt:3:41: error: cannot access 'InternalTypealias': it is internal in 'a' +private fun test(i: InternalInterface): InternalTypealias { + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt:4:19: error: cannot access 'internalMemberFun': it is internal in 'PublicClass' + PublicClass().internalMemberFun() + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt:5:17: error: cannot access 'Companion': it is internal in 'PublicClass' + PublicClass.Companion + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt:7:5: error: cannot access 'internalFun': it is internal in 'a' + internalFun(internalVal) + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt:7:17: error: cannot access 'internalVal': it is internal in 'a' + internalFun(internalVal) + ^ +COMPILATION_ERROR diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt new file mode 100644 index 00000000000..5e872880a78 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromForeignModuleJs/source.kt @@ -0,0 +1,10 @@ +import a.* + +private fun test(i: InternalInterface): InternalTypealias { + PublicClass().internalMemberFun() + PublicClass.Companion + + internalFun(internalVal) + + return i +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/library/a.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/library/a.kt new file mode 100644 index 00000000000..a7fd975a6be --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/library/a.kt @@ -0,0 +1,15 @@ +package a + +internal interface InternalInterface + +public class PublicClass { + internal fun internalMemberFun() {} + + internal companion object {} +} + +internal val internalVal = "" + +internal fun internalFun(s: String): String = s + +internal typealias InternalTypealias = InternalInterface diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/output.txt new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/output.txt @@ -0,0 +1 @@ +OK diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/source.kt new file mode 100644 index 00000000000..5e872880a78 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleCommon/source.kt @@ -0,0 +1,10 @@ +import a.* + +private fun test(i: InternalInterface): InternalTypealias { + PublicClass().internalMemberFun() + PublicClass.Companion + + internalFun(internalVal) + + return i +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/library/a.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/library/a.kt new file mode 100644 index 00000000000..a7fd975a6be --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/library/a.kt @@ -0,0 +1,15 @@ +package a + +internal interface InternalInterface + +public class PublicClass { + internal fun internalMemberFun() {} + + internal companion object {} +} + +internal val internalVal = "" + +internal fun internalFun(s: String): String = s + +internal typealias InternalTypealias = InternalInterface diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/output.txt new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/output.txt @@ -0,0 +1 @@ +OK diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/source.kt new file mode 100644 index 00000000000..5e872880a78 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/internalFromFriendModuleJs/source.kt @@ -0,0 +1,10 @@ +import a.* + +private fun test(i: InternalInterface): InternalTypealias { + PublicClass().internalMemberFun() + PublicClass.Companion + + internalFun(internalVal) + + return i +} diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/jvm/compiler/AbstractKotlinCompilerIntegrationTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/jvm/compiler/AbstractKotlinCompilerIntegrationTest.kt index 5584735c2b7..c858fb3f24a 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/jvm/compiler/AbstractKotlinCompilerIntegrationTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/jvm/compiler/AbstractKotlinCompilerIntegrationTest.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.js.K2JSCompiler import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler +import org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.TestCaseWithTmpdir import java.io.File @@ -112,6 +113,24 @@ abstract class AbstractKotlinCompilerIntegrationTest : TestCaseWithTmpdir() { return File(tmpdir, "$libraryName.meta.js") } + /** + * Compiles all .kt sources under the directory named [libraryName] to a directory named "[libraryName]" in [tmpdir] + * + * @return the path to the corresponding directory + */ + protected fun compileCommonLibrary( + libraryName: String, + additionalOptions: List = emptyList(), + checkKotlinOutput: (String) -> Unit = { actual -> assertEquals(normalizeOutput("" to ExitCode.OK), actual) } + ): File { + val destination = File(tmpdir, libraryName) + val output = compileKotlin( + libraryName, destination, compiler = K2MetadataCompiler(), additionalOptions = additionalOptions, expectedFileName = null + ) + checkKotlinOutput(normalizeOutput(output)) + return destination + } + private fun normalizeOutput(output: Pair): String { return AbstractCliTest.getNormalizedCompilerOutput(output.first, output.second, testDataDirectory.path) .replace(FileUtil.toSystemIndependentName(tmpdir.absolutePath), "\$TMP_DIR\$") @@ -138,16 +157,14 @@ abstract class AbstractKotlinCompilerIntegrationTest : TestCaseWithTmpdir() { args.add("-output") args.add(output.path) args.add("-meta-info") - } - else if (compiler is K2JVMCompiler) { + } else if (compiler is K2JVMCompiler || compiler is K2MetadataCompiler) { if (classpath.isNotEmpty()) { args.add("-classpath") args.add(classpath.joinToString(File.pathSeparator)) } args.add("-d") args.add(output.path) - } - else { + } else { throw UnsupportedOperationException(compiler.toString()) } diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt index abc35b6ef6e..d8d72b530a1 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.cli.js.K2JSCompiler import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.codegen.inline.GENERATE_SMAP import org.jetbrains.kotlin.codegen.inline.remove @@ -480,6 +481,29 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration compileKotlin("source.kt", tmpdir, listOf(library), additionalOptions = listOf("-Xfriend-paths=${library.path}")) } + fun testInternalFromForeignModuleJs() { + compileKotlin("source.kt", File(tmpdir, "usage.js"), listOf(compileJsLibrary("library")), K2JSCompiler()) + } + + fun testInternalFromFriendModuleJs() { + val library = compileJsLibrary("library") + compileKotlin("source.kt", File(tmpdir, "usage.js"), listOf(library), K2JSCompiler(), listOf("-Xfriend-modules=${library.path}")) + } + + /* + // TODO: see KT-15661 and KT-23483 + fun testInternalFromForeignModuleCommon() { + compileKotlin("source.kt", tmpdir, listOf(compileCommonLibrary("library")), K2MetadataCompiler()) + } + */ + + fun testInternalFromFriendModuleCommon() { + val library = compileCommonLibrary("library") + compileKotlin("source.kt", tmpdir, listOf(library), K2MetadataCompiler(), listOf( + // TODO: "-Xfriend-paths=${library.path}" + )) + } + companion object { // compiler before 1.1.4 version did not include suspension marks into bytecode. private fun stripSuspensionMarksToImitateLegacyCompiler(bytes: ByteArray): Pair {