@@ -374,65 +374,26 @@ class IrFakeOverrideBuilder(
374
374
return AbstractTypeChecker .isSubtypeOf(typeCheckerState, a.returnType, b.returnType)
375
375
}
376
376
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
383
379
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
391
384
}
392
385
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
+ }
410
388
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
434
392
}
435
393
394
+ private fun isAccessorMoreSpecific (a : IrSimpleFunction ? , b : IrSimpleFunction ? ): Boolean =
395
+ a == null || b == null || isVisibilityMoreSpecific(a, b)
396
+
436
397
private fun IrType.isFlexible (): Boolean {
437
398
return with (typeSystem) { isFlexible() }
438
399
}
0 commit comments