@@ -3201,35 +3201,21 @@ class TypeComparer(@constructorOnly initctx: Context) extends ConstraintHandling
3201
3201
result
3202
3202
end existsCommonBaseTypeWithDisjointArguments
3203
3203
3204
- provablyDisjointClasses(cls1, cls2, seen = null )
3204
+ provablyDisjointClasses(cls1, cls2)
3205
3205
|| existsCommonBaseTypeWithDisjointArguments
3206
3206
end match
3207
3207
}
3208
3208
3209
- private def provablyDisjointClasses (cls1 : Symbol , cls2 : Symbol , seen : util. HashSet [ Symbol ] | Null )(using Context ): Boolean =
3209
+ private def provablyDisjointClasses (cls1 : Symbol , cls2 : Symbol )(using Context ): Boolean =
3210
3210
def isDecomposable (cls : Symbol ): Boolean =
3211
- if seen != null && seen.contains(cls) then false
3212
- else cls.is(Sealed ) && ! cls.hasAnonymousChild
3213
-
3214
- def decompose (cls : Symbol ): List [Symbol ] =
3215
- cls.children.flatMap { child =>
3216
- if child.isTerm then
3217
- child.info.classSymbols // allow enum vals to be decomposed to their enum class (then filtered out) and any mixins
3218
- else child :: Nil
3219
- }.filter(child => child.exists && child != cls)
3220
-
3221
- inline def seeing (inline cls : Symbol )(inline thunk : util.HashSet [Symbol ] => Boolean ) =
3222
- val seen1 = if seen == null then new util.HashSet [Symbol ] else seen
3223
- try
3224
- seen1 += cls
3225
- thunk(seen1)
3226
- finally seen1 -= cls
3211
+ cls.is(Sealed ) && ! cls.hasAnonymousChild
3227
3212
3228
3213
def eitherDerivesFromOther (cls1 : Symbol , cls2 : Symbol ): Boolean =
3229
3214
cls1.derivesFrom(cls2) || cls2.derivesFrom(cls1)
3230
3215
3231
3216
def smallestNonTraitBase (cls : Symbol ): Symbol =
3232
- cls.asClass.baseClasses.find(! _.is(Trait )).get
3217
+ val classes = if cls.isClass then cls.asClass.baseClasses else cls.info.classSymbols
3218
+ classes.find(! _.is(Trait )).get
3233
3219
3234
3220
if (eitherDerivesFromOther(cls1, cls2))
3235
3221
false
@@ -3247,11 +3233,9 @@ class TypeComparer(@constructorOnly initctx: Context) extends ConstraintHandling
3247
3233
// instantiations of `cls1` (terms of the form `new cls1`) are not
3248
3234
// of type `tp2`. Therefore, we can safely decompose `cls1` using
3249
3235
// `.children`, even if `cls1` is non abstract.
3250
- seeing(cls1): seen1 =>
3251
- decompose(cls1).forall(x => provablyDisjointClasses(x, cls2, seen1))
3236
+ cls1.children.forall(x => provablyDisjointClasses(x, cls2))
3252
3237
else if (isDecomposable(cls2))
3253
- seeing(cls2): seen1 =>
3254
- decompose(cls2).forall(x => provablyDisjointClasses(cls1, x, seen1))
3238
+ cls2.children.forall(x => provablyDisjointClasses(cls1, x))
3255
3239
else
3256
3240
false
3257
3241
end provablyDisjointClasses
0 commit comments