JavaClassUseSiteMemberScope: add mutable vs non-mutable type matching
This commit is contained in:
+10
-5
@@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
Generated
+5
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user