From 01cff6b5e9d2cfe4be742884dd6abf4a20ac5825 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 21 Feb 2024 16:47:42 +0200 Subject: [PATCH] [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 --- .../fir/declarations/declarationUtils.kt | 6 ++++ .../impl/FirTypeIntersectionScopeContext.kt | 4 +-- ...thAdditionalSymbolsAfterNonSubsumed.fir.kt | 29 ------------------- ...vaWithAdditionalSymbolsAfterNonSubsumed.kt | 1 + 4 files changed, 9 insertions(+), 31 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJavaWithAdditionalSymbolsAfterNonSubsumed.fir.kt diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt index 2cfbe3d9f74..222a5afe9f4 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt @@ -160,6 +160,12 @@ fun MemberWithBaseScope>.getNonSubsumedOverriddenSymbols(): .map { it.member } } +fun List>>.getNonSubsumedNonPhantomOverriddenSymbols(): List>> { + return flatMap { it.flattenPhantomIntersectionsRecursively() } + .nonSubsumed() + .distinctBy { it.member.unwrapSubstitutionOverrides>() } +} + fun FirCallableSymbol<*>.dispatchReceiverScope(session: FirSession, scopeSession: ScopeSession): FirTypeScope { val dispatchReceiverType = requireNotNull(dispatchReceiverType) return dispatchReceiverType.scope( diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt index 9ae7e36723a..808d18d5063 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt @@ -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 { diff --git a/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJavaWithAdditionalSymbolsAfterNonSubsumed.fir.kt b/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJavaWithAdditionalSymbolsAfterNonSubsumed.fir.kt deleted file mode 100644 index e88efca6f18..00000000000 --- a/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJavaWithAdditionalSymbolsAfterNonSubsumed.fir.kt +++ /dev/null @@ -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 - -class K : PsiClass diff --git a/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJavaWithAdditionalSymbolsAfterNonSubsumed.kt b/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJavaWithAdditionalSymbolsAfterNonSubsumed.kt index 85bd199a52d..a601c1db04b 100644 --- a/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJavaWithAdditionalSymbolsAfterNonSubsumed.kt +++ b/compiler/testData/diagnostics/tests/intersectionWithMultipleDefaultsInJavaWithAdditionalSymbolsAfterNonSubsumed.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FILE: JvmElement.java public interface JvmElement { default void accept() {}