diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/moduleVisibilityImpl.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/moduleVisibilityImpl.kt index 199feb41972..36534d381ba 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/moduleVisibilityImpl.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/moduleVisibilityImpl.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityManager import org.jetbrains.kotlin.load.kotlin.getSourceElement import org.jetbrains.kotlin.load.kotlin.isContainedByCompiledPartOfOurModule +import org.jetbrains.kotlin.load.kotlin.isFromIncrementalPackageFragment import org.jetbrains.kotlin.modules.Module import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyPackageDescriptor import org.jetbrains.kotlin.resolve.source.KotlinSourceElement @@ -59,6 +60,10 @@ class ModuleVisibilityHelperImpl : ModuleVisibilityHelper { if (modules.isEmpty()) return false + // Hack for incremental compilation (now there is no way to determine the module of descriptor in case of incremental package fragment) + // TODO Implement full check for access to internal for incremental compilation + if (what.isFromIncrementalPackageFragment) return true + return findModule(from, modules) === findModule(what, modules) } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/moduleVisibilityUtils.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/moduleVisibilityUtils.kt index e9011a7015f..2b90fd6f570 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/moduleVisibilityUtils.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/moduleVisibilityUtils.kt @@ -41,6 +41,10 @@ interface ModuleVisibilityManager { } } +public val DeclarationDescriptor.isFromIncrementalPackageFragment: Boolean + get() = + DescriptorUtils.getParentOfType(this, PackageFragmentDescriptor::class.java, false) is IncrementalPackageFragmentProvider.IncrementalPackageFragment + public fun isContainedByCompiledPartOfOurModule(descriptor: DeclarationDescriptor, outDirectory: File?): Boolean { val packageFragment = DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor::class.java, false) diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java b/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java index 83368bbcf34..32bd506fd4d 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java @@ -55,6 +55,12 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta doTest(fileName); } + @TestMetadata("circularDependencyWithAccessToInternal") + public void testCircularDependencyWithAccessToInternal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/"); + doTest(fileName); + } + @TestMetadata("constantValueChanged") public void testConstantValueChanged() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/constantValueChanged/"); diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index 6fa3e46f594..63fd8b14dab 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -55,6 +55,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("circularDependencyWithAccessToInternal") + public void testCircularDependencyWithAccessToInternal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/"); + doTest(fileName); + } + @TestMetadata("constantValueChanged") public void testConstantValueChanged() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/constantValueChanged/"); diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/build.log b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/build.log new file mode 100644 index 00000000000..85072d47def --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/build.log @@ -0,0 +1,22 @@ +Cleaning output files: +out/production/module1/META-INF/module1.kotlin_module +out/production/module1/a/Module1_aKt.class +out/production/module1/c/Module1_c2Kt.class +End of files +Compiling files: +module1/src/module1_a.kt +module1/src/module1_c2.kt +End of files +Cleaning output files: +out/production/module1/META-INF/module1.kotlin_module +out/production/module1/c/Module1_c1Kt.class +out/production/module2/META-INF/module2.kotlin_module +out/production/module2/b/B.class +out/production/module2/b/Module2_bKt.class +End of files +Compiling files: +module2/src/module2_b.kt +End of files +Compiling files: +module1/src/module1_c1.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/dependencies.txt b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/dependencies.txt new file mode 100644 index 00000000000..02d5c8ca1a7 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/dependencies.txt @@ -0,0 +1,2 @@ +module1->module2 +module2->module1 diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/experimental-ic-build.log b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/experimental-ic-build.log new file mode 100644 index 00000000000..22a8eac1519 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/experimental-ic-build.log @@ -0,0 +1,11 @@ +========== Step #1 ============ + +Cleaning output files: +out/production/module1/META-INF/module1.kotlin_module +out/production/module1/a/Module1_aKt.class +out/production/module1/c/Module1_c2Kt.class +End of files +Compiling files: +module1/src/module1_a.kt +module1/src/module1_c2.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_a.kt b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_a.kt new file mode 100644 index 00000000000..82c0d8b13db --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_a.kt @@ -0,0 +1,5 @@ +package a + +fun a() { + c.internalFun() +} diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_a.kt.new b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_a.kt.new new file mode 100644 index 00000000000..93d22c828dd --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_a.kt.new @@ -0,0 +1,9 @@ +package a + +fun a() { +} + +fun aa() { + c.internalFun() + c.internalFun2() +} diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c1.kt b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c1.kt new file mode 100644 index 00000000000..46450e9f352 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c1.kt @@ -0,0 +1,5 @@ +package c + +fun publicFun() {} + +internal fun internalFun2() {} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c2.kt b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c2.kt new file mode 100644 index 00000000000..8bf543305e8 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c2.kt @@ -0,0 +1,3 @@ +package c + +internal fun internalFun() {} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c2.kt.new b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c2.kt.new new file mode 100644 index 00000000000..4eac7a9f212 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module1_c2.kt.new @@ -0,0 +1,5 @@ +package c + +internal fun internalFun() {} + +fun newFun() {} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module2_b.kt b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module2_b.kt new file mode 100644 index 00000000000..7965b9e82a5 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencyWithAccessToInternal/module2_b.kt @@ -0,0 +1,6 @@ +package b + +class B + +fun b() { +}