From 3a8499b10e9687d0372c2e6242ed4091576642ae Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 17 Aug 2018 18:10:08 +0200 Subject: [PATCH] Fix a bug where kotlin common classes were seen as missing dependencies When kotlin referred to them through java signatures Java resolver ignores expect classes #KT-24185 Fixed --- .../components/AbstractJavaResolverCache.kt | 3 ++- .../caches/resolve/ProjectResolutionFacade.kt | 2 +- .../a_common/common.kt | 3 +++ .../a_jvm_dep(fulljdk)/j1/Use.java | 13 +++++++++++++ .../a_jvm_dep(fulljdk)/j1/jvm.kt | 5 +++++ .../j2/Use.java | 13 +++++++++++++ .../j2/jvm.kt | 5 +++++ .../a_common_dep(stdlib)/common.kt | 3 +++ .../a_jvm_id1/j1/Use.java | 18 ++++++++++++++++++ .../a_jvm_id1/jvm.kt | 11 +++++++++++ .../a_jvm_id2/j2/Use.java | 18 ++++++++++++++++++ .../a_jvm_id2/jvm.kt | 11 +++++++++++ .../b_jvm_dep(a-jvm-id2)/j/Use.java | 17 +++++++++++++++++ .../b_jvm_dep(a-jvm-id2)/use.kt | 11 +++++++++++ .../j/Use.java | 17 +++++++++++++++++ .../c_jvm_dep(a-common)_dep(a-jvm-id1)/use.kt | 11 +++++++++++ .../j/Use.java | 17 +++++++++++++++++ .../d_jvm_dep(a-jvm-id1)_dep(a-common)/use.kt | 11 +++++++++++ ...MultiPlatformHighlightingTestGenerated.java | 10 ++++++++++ 19 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_common/common.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_jvm_dep(fulljdk)/j1/Use.java create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_jvm_dep(fulljdk)/j1/jvm.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/b_jvm_dep(fulljdk)_dep(a-jvm)_dep(a-common)/j2/Use.java create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/b_jvm_dep(fulljdk)_dep(a-jvm)_dep(a-common)/j2/jvm.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_common_dep(stdlib)/common.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id1/j1/Use.java create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id1/jvm.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id2/j2/Use.java create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id2/jvm.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/b_jvm_dep(a-jvm-id2)/j/Use.java create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/b_jvm_dep(a-jvm-id2)/use.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/c_jvm_dep(a-common)_dep(a-jvm-id1)/j/Use.java create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/c_jvm_dep(a-common)_dep(a-jvm-id1)/use.kt create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/d_jvm_dep(a-jvm-id1)_dep(a-common)/j/Use.java create mode 100644 idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/d_jvm_dep(a-jvm-id1)_dep(a-common)/use.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/AbstractJavaResolverCache.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/AbstractJavaResolverCache.kt index 2746733b229..80acc94610b 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/AbstractJavaResolverCache.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/AbstractJavaResolverCache.kt @@ -29,7 +29,8 @@ abstract class AbstractJavaResolverCache(private val resolveSession: ResolveSess protected val trace: BindingTrace get() = resolveSession.trace override fun getClassResolvedFromSource(fqName: FqName): ClassDescriptor? { - return trace.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, fqName.toUnsafe()) ?: findInPackageFragments(fqName) + return trace.get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, fqName.toUnsafe())?.takeUnless { it.isExpect } + ?: findInPackageFragments(fqName) } private fun findInPackageFragments(fullFqName: FqName): ClassDescriptor? { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt index baa9bafdc53..d5b38066920 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt @@ -123,7 +123,7 @@ internal class ProjectResolutionFacade( packagePartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) }, moduleByJavaClass = { javaClass: JavaClass -> val psiClass = (javaClass as JavaClassImpl).psi - psiClass.getNullableModuleInfo() + psiClass.getPlatformModuleInfo(JvmPlatform)?.platformModule ?: psiClass.getNullableModuleInfo() } ) diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_common/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_common/common.kt new file mode 100644 index 00000000000..32ee7afc7e5 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_common/common.kt @@ -0,0 +1,3 @@ +package common + +class A(val t1: T1, val t2: T2) \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_jvm_dep(fulljdk)/j1/Use.java b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_jvm_dep(fulljdk)/j1/Use.java new file mode 100644 index 00000000000..ce355406879 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_jvm_dep(fulljdk)/j1/Use.java @@ -0,0 +1,13 @@ +package j1; + +import common.A; + +public class Use { + public static A returnA() { + return new A("", ""); + } + + public static void acceptA(A a) { + + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_jvm_dep(fulljdk)/j1/jvm.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_jvm_dep(fulljdk)/j1/jvm.kt new file mode 100644 index 00000000000..ebab64d9bde --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/a_jvm_dep(fulljdk)/j1/jvm.kt @@ -0,0 +1,5 @@ +package j1 + +fun j() { + Use.acceptA(Use.returnA()) +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/b_jvm_dep(fulljdk)_dep(a-jvm)_dep(a-common)/j2/Use.java b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/b_jvm_dep(fulljdk)_dep(a-jvm)_dep(a-common)/j2/Use.java new file mode 100644 index 00000000000..ca5afb204ba --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/b_jvm_dep(fulljdk)_dep(a-jvm)_dep(a-common)/j2/Use.java @@ -0,0 +1,13 @@ +package j2; + +import common.A; + +public class Use { + public static A returnA() { + return new A("", ""); + } + + public static void acceptA(A a) { + + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/b_jvm_dep(fulljdk)_dep(a-jvm)_dep(a-common)/j2/jvm.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/b_jvm_dep(fulljdk)_dep(a-jvm)_dep(a-common)/j2/jvm.kt new file mode 100644 index 00000000000..23ccfa1f246 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/b_jvm_dep(fulljdk)_dep(a-jvm)_dep(a-common)/j2/jvm.kt @@ -0,0 +1,5 @@ +package j2 + +fun j() { + Use.acceptA(Use.returnA()) +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_common_dep(stdlib)/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_common_dep(stdlib)/common.kt new file mode 100644 index 00000000000..bd92586b5c3 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_common_dep(stdlib)/common.kt @@ -0,0 +1,3 @@ +package common + +expect class A \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id1/j1/Use.java b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id1/j1/Use.java new file mode 100644 index 00000000000..2ea57daa4d0 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id1/j1/Use.java @@ -0,0 +1,18 @@ +package j1; + +import common.A; + +public class Use { + public static void use() { + A a = new A(); + a.id1(); + } + + public static void acceptA(A a) { + + } + + public static A returnA() { + return new A(); + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id1/jvm.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id1/jvm.kt new file mode 100644 index 00000000000..897d032e228 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id1/jvm.kt @@ -0,0 +1,11 @@ +package common + +actual class A { + fun id1() {} +} + + +fun use() { + j2.Use.acceptA(j2.Use.returnA()) + j2.Use.returnA().id2() +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id2/j2/Use.java b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id2/j2/Use.java new file mode 100644 index 00000000000..a3a55ac2d5b --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id2/j2/Use.java @@ -0,0 +1,18 @@ +package j2; + +import common.A; + +public class Use { + public static void use() { + A a = new A(); + a.id2(); + } + + public static void acceptA(A a) { + + } + + public static A returnA() { + return new A(); + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id2/jvm.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id2/jvm.kt new file mode 100644 index 00000000000..deeb8139d08 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/a_jvm_id2/jvm.kt @@ -0,0 +1,11 @@ +package common + +actual class A { + fun id2() {} +} + + +fun use() { + j2.Use.acceptA(j2.Use.returnA()) + j2.Use.returnA().id2() +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/b_jvm_dep(a-jvm-id2)/j/Use.java b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/b_jvm_dep(a-jvm-id2)/j/Use.java new file mode 100644 index 00000000000..2ec3890b9b4 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/b_jvm_dep(a-jvm-id2)/j/Use.java @@ -0,0 +1,17 @@ +package j; + +import common.A; + +public class Use { + public static void use(A a) { + a.id2(); + } + + public static void acceptA(A a) { + + } + + public static A returnA() { + return new A(); + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/b_jvm_dep(a-jvm-id2)/use.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/b_jvm_dep(a-jvm-id2)/use.kt new file mode 100644 index 00000000000..274453e4b39 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/b_jvm_dep(a-jvm-id2)/use.kt @@ -0,0 +1,11 @@ +package b + +import common.A + +fun use(a: A) { + a.id2() + j.Use.acceptA(j.Use.returnA()) + val a2: A = j.Use.returnA() + a2.id2() + j.Use.returnA().id2() +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/c_jvm_dep(a-common)_dep(a-jvm-id1)/j/Use.java b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/c_jvm_dep(a-common)_dep(a-jvm-id1)/j/Use.java new file mode 100644 index 00000000000..a2e567d30ed --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/c_jvm_dep(a-common)_dep(a-jvm-id1)/j/Use.java @@ -0,0 +1,17 @@ +package j; + +import common.A; + +public class Use { + public static void use(A a) { + a.id1(); + } + + public static void acceptA(A a) { + + } + + public static A returnA() { + return new A(); + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/c_jvm_dep(a-common)_dep(a-jvm-id1)/use.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/c_jvm_dep(a-common)_dep(a-jvm-id1)/use.kt new file mode 100644 index 00000000000..060fd0fa9b1 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/c_jvm_dep(a-common)_dep(a-jvm-id1)/use.kt @@ -0,0 +1,11 @@ +package c + +import common.A + +fun use(a: A) { + // errors happen when common module part appears before platform part in dependencies list + // this is incorrect behaviour but doesn't seem to lead to user facing bugs atm + a.id1() + val a2: A = j.Use.returnA() + a2.id1() +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/d_jvm_dep(a-jvm-id1)_dep(a-common)/j/Use.java b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/d_jvm_dep(a-jvm-id1)_dep(a-common)/j/Use.java new file mode 100644 index 00000000000..a2e567d30ed --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/d_jvm_dep(a-jvm-id1)_dep(a-common)/j/Use.java @@ -0,0 +1,17 @@ +package j; + +import common.A; + +public class Use { + public static void use(A a) { + a.id1(); + } + + public static void acceptA(A a) { + + } + + public static A returnA() { + return new A(); + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/d_jvm_dep(a-jvm-id1)_dep(a-common)/use.kt b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/d_jvm_dep(a-jvm-id1)_dep(a-common)/use.kt new file mode 100644 index 00000000000..8bfc42ba025 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/d_jvm_dep(a-jvm-id1)_dep(a-common)/use.kt @@ -0,0 +1,11 @@ +package c + +import common.A + +fun use(a: A) { + a.id1() + j.Use.acceptA(j.Use.returnA()) + j.Use.returnA().id1() + val a2: A = j.Use.returnA() + a2.id1() +} \ No newline at end of file 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 b2ab0bd6423..4986fcefa5b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiPlatformHighlightingTestGenerated.java @@ -99,6 +99,16 @@ public class MultiPlatformHighlightingTestGenerated extends AbstractMultiPlatfor runTest("idea/testData/multiModuleHighlighting/multiplatform/javaUsesPlatformFacade/"); } + @TestMetadata("jvmKotlinReferencesCommonKotlinThroughJava") + public void testJvmKotlinReferencesCommonKotlinThroughJava() throws Exception { + runTest("idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJava/"); + } + + @TestMetadata("jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls") + public void testJvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls() throws Exception { + runTest("idea/testData/multiModuleHighlighting/multiplatform/jvmKotlinReferencesCommonKotlinThroughJavaDifferentJvmImpls/"); + } + @TestMetadata("multifileFacade") public void testMultifileFacade() throws Exception { runTest("idea/testData/multiModuleHighlighting/multiplatform/multifileFacade/");