[FIR] Call distinctBy for containsMultipleNonSubsumed

Otherwise, when analyzing
`PsiTypeParameterListOwner` in the
related test, we (after flattening and
`nonSubsumed()`) get 2 `JvmMember.accept`
from the same very java enhancement
scope `JvmMember`.

^KT-65972
This commit is contained in:
Nikolay Lunyak
2024-02-21 16:47:42 +02:00
committed by Space Team
parent 453b97a2d1
commit 01cff6b5e9
4 changed files with 9 additions and 31 deletions
@@ -160,6 +160,12 @@ fun MemberWithBaseScope<FirCallableSymbol<*>>.getNonSubsumedOverriddenSymbols():
.map { it.member }
}
fun List<MemberWithBaseScope<FirCallableSymbol<*>>>.getNonSubsumedNonPhantomOverriddenSymbols(): List<MemberWithBaseScope<FirCallableSymbol<*>>> {
return flatMap { it.flattenPhantomIntersectionsRecursively() }
.nonSubsumed()
.distinctBy { it.member.unwrapSubstitutionOverrides<FirCallableSymbol<*>>() }
}
fun FirCallableSymbol<*>.dispatchReceiverScope(session: FirSession, scopeSession: ScopeSession): FirTypeScope {
val dispatchReceiverType = requireNotNull(dispatchReceiverType)
return dispatchReceiverType.scope(
@@ -180,8 +180,8 @@ class FirTypeIntersectionScopeContext(
overriddenMembers = group,
containingScope = null,
containsMultipleNonSubsumed = when {
forClassUseSiteScope -> group.flatMap { it.flattenPhantomIntersectionsRecursively() }.nonSubsumed().size > 1
else -> mostSpecific.flatMap { it.flattenPhantomIntersectionsRecursively() }.nonSubsumed().size > 1
forClassUseSiteScope -> group.getNonSubsumedNonPhantomOverriddenSymbols().size > 1
else -> mostSpecific.getNonSubsumedNonPhantomOverriddenSymbols().size > 1
},
)
} else {
@@ -1,29 +0,0 @@
// FILE: JvmElement.java
public interface JvmElement {
default void accept() {}
}
// FILE: JvmMember.java
public interface JvmMember extends JvmElement {
default void accept() {}
}
// FILE: PsiJvmMember.java
// Provides a phantom IO
public interface PsiJvmMember extends JvmMember, JvmElement {}
// FILE: PsiTypeParameterListOwner.java
// Must also provide a phantom IO
public interface PsiTypeParameterListOwner extends PsiJvmMember, JvmMember {}
// FILE: JvmClass.java
public interface JvmClass extends JvmMember, JvmElement {
default void accept() {}
}
// FILE: PsiClass.java
public interface PsiClass extends PsiTypeParameterListOwner, JvmClass {}
// FILE: Main.kt
<!CANNOT_INFER_VISIBILITY!>class K<!> : PsiClass
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: JvmElement.java
public interface JvmElement {
default void accept() {}