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.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,11 +39,15 @@ 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)
|
||||||
with(context) {
|
return if (a is ConeClassType && b is ConeClassType) {
|
||||||
return isEqualTypeConstructors(
|
a.lookupTag.classId.let { it.readOnlyToMutable() ?: it } == b.lookupTag.classId.let { it.readOnlyToMutable() ?: it }
|
||||||
substitutor.substituteOrSelf(a).typeConstructor(),
|
} else {
|
||||||
substitutor.substituteOrSelf(b).typeConstructor()
|
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);
|
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");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user