Skip to content

Commit 2638448

Browse files
committed
Apply suggested changes in review
- Speedup pattern matching in `isCovered` - Make `CoveredStatus` private - Use direct integer comparison instead of bit operations for better readability and maintainability
1 parent 8275cef commit 2638448

File tree

1 file changed

+12
-23
lines changed

1 file changed

+12
-23
lines changed

compiler/src/dotty/tools/dotc/core/TypeComparer.scala

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1490,16 +1490,19 @@ class TypeComparer(@constructorOnly initctx: Context) extends ConstraintHandling
14901490
def isNewSubType(tp1: Type): Boolean =
14911491
def isCovered(tp: Type): CoveredStatus =
14921492
tp.dealiasKeepRefiningAnnots.stripTypeVar match
1493-
case tp: TypeRef if tp.symbol.isClass && tp.symbol != NothingClass && tp.symbol != NullClass => CoveredStatus.Covered
1493+
case tp: TypeRef =>
1494+
if tp.symbol.isClass && tp.symbol != NothingClass && tp.symbol != NullClass
1495+
then CoveredStatus.Covered
1496+
else CoveredStatus.Uncovered
14941497
case tp: AppliedType => isCovered(tp.tycon)
14951498
case tp: RefinedOrRecType => isCovered(tp.parent)
1496-
case tp: AndType => isCovered(tp.tp1) combinedWith isCovered(tp.tp2)
1497-
case tp: OrType => isCovered(tp.tp1) combinedWith isCovered(tp.tp2)
1499+
case tp: AndType => isCovered(tp.tp1) min isCovered(tp.tp2)
1500+
case tp: OrType => isCovered(tp.tp1) min isCovered(tp.tp2) min CoveredStatus.CoveredWithOr
14981501
case _ => CoveredStatus.Uncovered
14991502

15001503
val covered1 = isCovered(tp1)
15011504
val covered2 = isCovered(tp2)
1502-
if CoveredStatus.bothCovered(covered1, covered2) && !CoveredStatus.bothHaveOr(covered1, covered2) then
1505+
if (covered1 min covered2) >= CoveredStatus.CoveredWithOr && (covered1 max covered2) == CoveredStatus.Covered then
15031506
//println(s"useless subtype: $tp1 <:< $tp2")
15041507
false
15051508
else isSubType(tp1, tp2, approx.addLow)
@@ -2997,29 +3000,15 @@ object TypeComparer {
29973000
type ApproxState = ApproxState.Repr
29983001

29993002
/** Result of `isCovered` check. */
3000-
object CoveredStatus:
3001-
opaque type Repr = Int
3003+
private object CoveredStatus:
3004+
type Repr = Int
30023005

30033006
private inline val IsCovered = 2
30043007
private inline val NotHasOr = 1
30053008

3006-
/** The type is not covered. */
3007-
val Uncovered: Repr = 1
3008-
3009-
/** The type is covered and contains OrTypes. */
3010-
val CoveredWithOr: Repr = 2
3011-
3012-
/** The type is covered and free from OrTypes. */
3013-
val Covered: Repr = 3
3014-
3015-
object Repr:
3016-
extension (s: Repr)
3017-
def combinedWith(that: => Repr): Repr =
3018-
if s == Uncovered then Uncovered
3019-
else s min that
3020-
3021-
inline def bothHaveOr(s1: Repr, s2: Repr): Boolean = ~((s1 | s2) & NotHasOr) != 0
3022-
inline def bothCovered(s1: Repr, s2: Repr): Boolean = (s1 & s2 & IsCovered) != 0
3009+
val Uncovered: Repr = 1 // The type is not covered
3010+
val CoveredWithOr: Repr = 2 // The type is covered and contains OrTypes
3011+
val Covered: Repr = 3 // The type is covered and free from OrTypes
30233012
end CoveredStatus
30243013
type CoveredStatus = CoveredStatus.Repr
30253014

0 commit comments

Comments
 (0)