Skip to content

Commit 9a7d748

Browse files
udalovSpace Team
authored and
Space Team
committed
IR: simplify IrFakeOverrideBuilder.isMoreSpecific
Using the logic from `OverridingUtil.isMoreSpecific` as a reference.
1 parent 5c64832 commit 9a7d748

File tree

1 file changed

+14
-53
lines changed

1 file changed

+14
-53
lines changed

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt

+14-53
Original file line numberDiff line numberDiff line change
@@ -374,65 +374,26 @@ class IrFakeOverrideBuilder(
374374
return AbstractTypeChecker.isSubtypeOf(typeCheckerState, a.returnType, b.returnType)
375375
}
376376

377-
private fun isMoreSpecific(
378-
a: IrOverridableMember,
379-
b: IrOverridableMember
380-
): Boolean {
381-
return a >= b
382-
}
377+
private fun isMoreSpecific(a: IrOverridableMember, b: IrOverridableMember): Boolean {
378+
if (!isVisibilityMoreSpecific(a, b)) return false
383379

384-
// Based on compareTo from FirOverrideService.kt
385-
private operator fun IrOverridableMember.compareTo(other: IrOverridableMember): Int {
386-
fun merge(preferA: Boolean, preferB: Boolean, previous: Int): Int = when {
387-
preferA == preferB -> previous
388-
preferA && previous >= 0 -> 1
389-
preferB && previous <= 0 -> -1
390-
else -> 0
380+
if (a is IrProperty) {
381+
check(b is IrProperty) { "b is not a property: $b" }
382+
if (!isAccessorMoreSpecific(a.setter, b.setter)) return false
383+
if (!a.isVar && b.isVar) return false
391384
}
392385

393-
val aIr = this@compareTo
394-
val bIr = other
395-
val byVisibility = DescriptorVisibilities.compare(aIr.visibility, bIr.visibility) ?: 0
396-
val aReturnType = aIr.returnType
397-
val bReturnType = bIr.returnType
398-
399-
val aSubtypesB = isReturnTypeIsSubtypeOfOtherReturnType(aIr, bIr)
400-
val bSubtypesA = isReturnTypeIsSubtypeOfOtherReturnType(bIr, aIr)
401-
402-
val byVisibilityAndType = when {
403-
// Could be that one of them is flexible, in which case the types are not equal but still subtypes of one another;
404-
// make the inflexible one more specific.
405-
aSubtypesB && bSubtypesA -> merge(!aReturnType.isFlexible(), !bReturnType.isFlexible(), byVisibility)
406-
aSubtypesB && byVisibility >= 0 -> 1
407-
bSubtypesA && byVisibility <= 0 -> -1
408-
else -> 0
409-
}
386+
return isReturnTypeIsSubtypeOfOtherReturnType(a, b)
387+
}
410388

411-
return when (aIr) {
412-
is IrSimpleFunction -> byVisibilityAndType
413-
is IrProperty -> {
414-
require(bIr is IrProperty)
415-
val settersComparison = if (aIr.isVar && bIr.isVar) {
416-
val aSetter = aIr.setter
417-
val bSetter = bIr.setter
418-
when {
419-
aSetter != null && bSetter != null -> aSetter.compareTo(bSetter)
420-
else -> 0
421-
}
422-
} else {
423-
0
424-
}
425-
val bySetters = merge(
426-
preferA = settersComparison >= 0,
427-
preferB = settersComparison <= 0,
428-
byVisibilityAndType
429-
)
430-
merge(aIr.isVar, bIr.isVar, bySetters)
431-
}
432-
else -> error("Unexpected type: $aIr")
433-
}
389+
private fun isVisibilityMoreSpecific(a: IrOverridableMember, b: IrOverridableMember): Boolean {
390+
val result = DescriptorVisibilities.compare(a.visibility, b.visibility)
391+
return result == null || result >= 0
434392
}
435393

394+
private fun isAccessorMoreSpecific(a: IrSimpleFunction?, b: IrSimpleFunction?): Boolean =
395+
a == null || b == null || isVisibilityMoreSpecific(a, b)
396+
436397
private fun IrType.isFlexible(): Boolean {
437398
return with(typeSystem) { isFlexible() }
438399
}

0 commit comments

Comments
 (0)