[FIR] Introduce containsMultipleNonSubsumed to intersection overrides

After this change the IO created for
`SimpleColoredComponent::setToolTipText`
will be `containsMultipleNonSubsumed == true`
while IOs created for classes in
`intersectionOverridesIntersection.kt`
will have this property set to `false`.

^KT-65972 Fixed
This commit is contained in:
Nikolay Lunyak
2024-02-21 14:49:42 +02:00
committed by Space Team
parent ee20d979cb
commit 341a23d05c
9 changed files with 68 additions and 49 deletions
@@ -334,7 +334,10 @@ class FirSignatureEnhancement(
this.name = name!!
status = firMethod.status
symbol = if (isIntersectionOverride) {
FirIntersectionOverrideFunctionSymbol(methodId, overriddenMembers.map { it.symbol })
FirIntersectionOverrideFunctionSymbol(
methodId, overriddenMembers.map { it.symbol },
containsMultipleNonSubsumed = (firMethod.symbol as? FirIntersectionCallableSymbol)?.containsMultipleNonSubsumed == true,
)
} else {
FirNamedFunctionSymbol(methodId)
}.also { functionSymbol = it }
@@ -375,7 +375,11 @@ class JavaOverrideChecker internal constructor(
extractedOverrides: Collection<MemberWithBaseScope<D>>,
dispatchClassSymbol: FirRegularClassSymbol?,
): Visibility {
val overridesWithoutIntersections = extractedOverrides.flatMap { it.flattenIntersectionsRecursively() }
// It's crucial that we only unwrap phantom intersection overrides.
// See comments in the following tests for explanation:
// - intersectionWithMultipleDefaultsInJavaOverriddenByIntersectionInKotlin.kt
// - intersectionOverridesIntersection.kt
val overridesWithoutIntersections = extractedOverrides.flatMap { it.flattenPhantomIntersectionsRecursively() }
val nonSubsumed = overridesWithoutIntersections.nonSubsumed().filterOutDuplicates()
// In Java it's OK to inherit multiple implementations of the same function