From d744192e6f3fd6ae3edc987904ec0b62dc011637 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 20 May 2019 18:22:31 +0300 Subject: [PATCH] [Invariant fix] Fix false positive internal visibility diagnostic Effectively, this commit allows for common module to see internal content of all expect-modules The problem is that when computing the member scope for A (see the test) we're building a special member scope for CommonAbstract viewed from JVM and it's effectively has a fake override of actual member from Jvm/ExpectBase. OverridingUtil checks if it's visible in CommonAbstract and finds that it's not thus creating a fake_invisible fake override The latter results in A::foo override being marked as INVISIBLE_MEMBER_OVERRIDE Probably, the fix might be smarter (passing a requested module to OverridingUtil::createAndBindFakeOverride) but allowing using internal member seems to be safe & simple because it's reasonable to assume there's no cyclic dependencies between expected/actual modules --- .../kotlin/descriptors/impl/ModuleDescriptorImpl.kt | 7 ++++++- .../a_common_dep(stdlib)/common.kt | 11 +++++++++++ .../a_jvm_dep(stdlib)/jvm.kt | 9 +++++++++ .../MultiPlatformHighlightingTestGenerated.java | 5 +++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/a_common_dep(stdlib)/common.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/a_jvm_dep(stdlib)/jvm.kt diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt index eeb0417c907..3155e0fe142 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -125,7 +125,12 @@ class ModuleDescriptorImpl @JvmOverloads constructor( } override fun shouldSeeInternalsOf(targetModule: ModuleDescriptor): Boolean { - return this == targetModule || targetModule in dependencies!!.modulesWhoseInternalsAreVisible || targetModule in expectedByModules + if (this == targetModule) return true + if (targetModule in dependencies!!.modulesWhoseInternalsAreVisible) return true + if (targetModule in expectedByModules) return true + if (this in targetModule.expectedByModules) return true + + return false } private val id: String diff --git a/idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/a_common_dep(stdlib)/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/a_common_dep(stdlib)/common.kt new file mode 100644 index 00000000000..db6c9aa0d2c --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/a_common_dep(stdlib)/common.kt @@ -0,0 +1,11 @@ +package foo + +internal expect abstract class ExpectBase() { + abstract fun foo(cause: Throwable?) +} + +interface I { + fun foo(cause: Throwable?) +} + +internal abstract class CommonAbstract : ExpectBase() diff --git a/idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/a_jvm_dep(stdlib)/jvm.kt b/idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/a_jvm_dep(stdlib)/jvm.kt new file mode 100644 index 00000000000..3618885d72b --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/a_jvm_dep(stdlib)/jvm.kt @@ -0,0 +1,9 @@ +package foo + +private class A : CommonAbstract() { + override fun foo(cause: Throwable?) {} +} + +internal actual abstract class ExpectBase actual constructor() : I { + actual abstract override fun foo(cause: Throwable?) +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTestGenerated.java index c847c6312cb..e2f3802ca87 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTestGenerated.java @@ -104,6 +104,11 @@ public class MultiPlatformHighlightingTestGenerated extends AbstractMultiPlatfor runTest("idea/testData/multiModuleHighlighting/multiplatform/internalDependencyFromTests/"); } + @TestMetadata("internalInheritanceToCommon") + public void testInternalInheritanceToCommon() throws Exception { + runTest("idea/testData/multiModuleHighlighting/multiplatform/internalInheritanceToCommon/"); + } + @TestMetadata("javaUsesPlatformFacade") public void testJavaUsesPlatformFacade() throws Exception { runTest("idea/testData/multiModuleHighlighting/multiplatform/javaUsesPlatformFacade/");