JavaClassUseSiteMemberScope: add mutable vs non-mutable type matching

This commit is contained in:
Mikhail Glukhikh
2019-11-06 15:31:33 +03:00
parent 61c337588b
commit 4d9839a790
4 changed files with 38 additions and 5 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass 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.java.toNotNullConeKotlinType
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
@@ -38,13 +39,17 @@ class JavaClassUseSiteMemberScope(
private fun isEqualTypes(a: ConeKotlinType, b: ConeKotlinType, substitutor: ConeSubstitutor): Boolean { private fun isEqualTypes(a: ConeKotlinType, b: ConeKotlinType, substitutor: ConeSubstitutor): Boolean {
if (a is ConeFlexibleType) return isEqualTypes(a.lowerBound, b, substitutor) if (a is ConeFlexibleType) return isEqualTypes(a.lowerBound, b, substitutor)
if (b is ConeFlexibleType) return isEqualTypes(a, b.lowerBound, substitutor) if (b is ConeFlexibleType) return isEqualTypes(a, b.lowerBound, substitutor)
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) { with(context) {
return isEqualTypeConstructors( isEqualTypeConstructors(
substitutor.substituteOrSelf(a).typeConstructor(), substitutor.substituteOrSelf(a).typeConstructor(),
substitutor.substituteOrSelf(b).typeConstructor() substitutor.substituteOrSelf(b).typeConstructor()
) )
} }
} }
}
private fun isEqualTypes(a: FirTypeRef, b: FirTypeRef, substitutor: ConeSubstitutor) = private fun isEqualTypes(a: FirTypeRef, b: FirTypeRef, substitutor: ConeSubstitutor) =
isEqualTypes( isEqualTypes(
@@ -0,0 +1,12 @@
// FULL_JDK
fun foo() {
val y = listOf("Alpha", "Beta")
val x = LinkedHashSet<String>().apply {
<!AMBIGUITY!>addAll<!>(y)
}
val z = ArrayList<String>()
z.addAll(y)
z.add("Omega")
}
@@ -0,0 +1,11 @@
FILE: addAllOnJavaCollection.kt
public final fun foo(): R|kotlin/Unit| {
lval y: R|kotlin/collections/List<kotlin/String>| = R|kotlin/collections/listOf|<R|kotlin/String|>(String(Alpha), String(Beta))
lval x: R|java/util/LinkedHashSet<kotlin/String>| = R|java/util/LinkedHashSet.LinkedHashSet|<R|kotlin/String|>().R|kotlin/apply|<R|java/util/LinkedHashSet<kotlin/String>|>(<L> = apply@fun R|java/util/LinkedHashSet<kotlin/String>|.<anonymous>(): R|kotlin/Unit| <kind=EXACTLY_ONCE> {
<Ambiguity: addAll, [java/util/AbstractCollection.addAll, kotlin/collections/MutableSet.addAll]>#(R|<local>/y|)
}
)
lval z: R|java/util/ArrayList<kotlin/String>| = R|java/util/ArrayList.ArrayList|<R|kotlin/String|>()
R|<local>/z|.R|FakeOverride<java/util/ArrayList.addAll: R|kotlin/Boolean|>|(R|<local>/y|)
R|<local>/z|.R|FakeOverride<java/util/ArrayList.add: R|kotlin/Boolean|>|(String(Omega))
}
@@ -24,6 +24,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); 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 { public void testAllFilesPresentInStdlib() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), true, "contracts"); KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), true, "contracts");
} }