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
+}
+
+