diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index 6a6a749a614..4e2843be32f 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.JvmCodegenUtil import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.MockLibraryUtil import org.jetbrains.kotlin.utils.PathUtil import org.jetbrains.org.objectweb.asm.ClassReader @@ -472,6 +473,23 @@ public class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { checkWhen(touch("module2/src/b.kt"), null, packageClasses("module2", "module2/src/b.kt", "test.TestPackage")) } + public fun testInternalFromAnotherModule() { + initProject() + val result = makeAll() + result.assertFailed() + + val module2File = File(workDir, "module2/src/module2.kt") + val expectedErrors = InTextDirectivesUtils.findLinesWithPrefixesRemoved(FileUtilRt.loadFile(module2File), "// ERROR:") + .sorted() + .joinToString("\n") + val actualErrors = result.getMessages(BuildMessage.Kind.ERROR) + .map { it.messageText } + .map { it.replace("^.+:\\d+:\\s+".toRegex(), "").trim() } + .sorted() + .joinToString("\n") + assertEquals(expectedErrors, actualErrors, "Error messages were different") + } + public fun testCircularDependencyWithReferenceToOldVersionLib() { initProject() diff --git a/jps/jps-plugin/testData/general/InternalFromAnotherModule/kotlinProject.ipr b/jps/jps-plugin/testData/general/InternalFromAnotherModule/kotlinProject.ipr new file mode 100644 index 00000000000..c1a403dd047 --- /dev/null +++ b/jps/jps-plugin/testData/general/InternalFromAnotherModule/kotlinProject.ipr @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jps/jps-plugin/testData/general/InternalFromAnotherModule/module1/module1.iml b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module1/module1.iml new file mode 100644 index 00000000000..3b1ba79ed61 --- /dev/null +++ b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module1/module1.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jps/jps-plugin/testData/general/InternalFromAnotherModule/module1/src/module1.kt b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module1/src/module1.kt new file mode 100644 index 00000000000..30fcc94d780 --- /dev/null +++ b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module1/src/module1.kt @@ -0,0 +1,10 @@ +package test + +internal open class InternalClass1 + +abstract class ClassA1(internal val member: Int) + +abstract class ClassB1 { + internal abstract val member: Int +} + diff --git a/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/module2.iml b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/module2.iml new file mode 100644 index 00000000000..ecdc9e147ae --- /dev/null +++ b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/module2.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/src/additional.kt b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/src/additional.kt new file mode 100644 index 00000000000..e7ebf8914c0 --- /dev/null +++ b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/src/additional.kt @@ -0,0 +1,9 @@ +package test + +internal open class InternalClass2 + +abstract class ClassA2(internal val member: Int) + +abstract class ClassB2 { + internal abstract val member: Int +} diff --git a/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/src/module2.kt b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/src/module2.kt new file mode 100644 index 00000000000..1f1647ddad4 --- /dev/null +++ b/jps/jps-plugin/testData/general/InternalFromAnotherModule/module2/src/module2.kt @@ -0,0 +1,29 @@ +// ERROR: 'internal open val member: kotlin.Int defined in test.ClassBB1' has no access to 'internal abstract val member: kotlin.Int defined in test.ClassB1', so it cannot override it +// ERROR: Cannot access 'InternalClass1': it is 'internal' in 'test' +// ERROR: Cannot access 'member': it is 'invisible_fake' in 'ClassAA1' +package test + +// InternalClass1, ClassA1, ClassB1 are in module1 +class ClassInheritedFromInternal1: InternalClass1() + +class ClassAA1 : ClassA1(10) + +class ClassBB1 : ClassB1() { + internal override val member = 10 +} + +// InternalClass2, ClassA2, ClassB2 are in module2 +class ClassInheritedFromInternal2: InternalClass2() + +class ClassAA2 : ClassA2(10) + +class ClassBB2 : ClassB2() { + internal override val member = 10 +} + +fun f() { + val x1 = ClassAA1().member + val x2 = ClassAA2().member +} + +