From 4d9839a790ca520bcef91ab7b54795920b14f6ad Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 6 Nov 2019 15:31:33 +0300 Subject: [PATCH] JavaClassUseSiteMemberScope: add mutable vs non-mutable type matching --- .../java/scopes/JavaClassUseSiteMemberScope.kt | 15 ++++++++++----- .../resolve/stdlib/addAllOnJavaCollection.kt | 12 ++++++++++++ .../resolve/stdlib/addAllOnJavaCollection.txt | 11 +++++++++++ .../FirDiagnosticsWithStdlibTestGenerated.java | 5 +++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.kt create mode 100644 compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.txt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index d8ed6cd81c9..abb4e60b5dd 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass +import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable import org.jetbrains.kotlin.fir.java.toNotNullConeKotlinType import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap @@ -38,11 +39,15 @@ class JavaClassUseSiteMemberScope( private fun isEqualTypes(a: ConeKotlinType, b: ConeKotlinType, substitutor: ConeSubstitutor): Boolean { if (a is ConeFlexibleType) return isEqualTypes(a.lowerBound, b, substitutor) if (b is ConeFlexibleType) return isEqualTypes(a, b.lowerBound, substitutor) - with(context) { - return isEqualTypeConstructors( - substitutor.substituteOrSelf(a).typeConstructor(), - substitutor.substituteOrSelf(b).typeConstructor() - ) + return if (a is ConeClassType && b is ConeClassType) { + a.lookupTag.classId.let { it.readOnlyToMutable() ?: it } == b.lookupTag.classId.let { it.readOnlyToMutable() ?: it } + } else { + with(context) { + isEqualTypeConstructors( + substitutor.substituteOrSelf(a).typeConstructor(), + substitutor.substituteOrSelf(b).typeConstructor() + ) + } } } diff --git a/compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.kt b/compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.kt new file mode 100644 index 00000000000..60675bf6d11 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.kt @@ -0,0 +1,12 @@ +// FULL_JDK + +fun foo() { + val y = listOf("Alpha", "Beta") + val x = LinkedHashSet().apply { + addAll(y) + } + + val z = ArrayList() + z.addAll(y) + z.add("Omega") +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.txt b/compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.txt new file mode 100644 index 00000000000..0eece7ce126 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.txt @@ -0,0 +1,11 @@ +FILE: addAllOnJavaCollection.kt + public final fun foo(): R|kotlin/Unit| { + lval y: R|kotlin/collections/List| = R|kotlin/collections/listOf|(String(Alpha), String(Beta)) + lval x: R|java/util/LinkedHashSet| = R|java/util/LinkedHashSet.LinkedHashSet|().R|kotlin/apply||>( = apply@fun R|java/util/LinkedHashSet|.(): R|kotlin/Unit| { + #(R|/y|) + } + ) + lval z: R|java/util/ArrayList| = R|java/util/ArrayList.ArrayList|() + R|/z|.R|FakeOverride|(R|/y|) + R|/z|.R|FakeOverride|(String(Omega)) + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java index 37bf02adafd..e6eb931bc0d 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java @@ -24,6 +24,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); } + @TestMetadata("addAllOnJavaCollection.kt") + public void testAddAllOnJavaCollection() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/stdlib/addAllOnJavaCollection.kt"); + } + public void testAllFilesPresentInStdlib() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), true, "contracts"); }