Skip to content

Commit 97bf522

Browse files
committed
Optimize comparing types in mergeRefinedOrApplied
1 parent 991a3cc commit 97bf522

File tree

1 file changed

+13
-21
lines changed

1 file changed

+13
-21
lines changed

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

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -244,44 +244,36 @@ object TypeOps:
244244

245245
def mergeRefinedOrApplied(tp1: Type, tp2: Type): Type = {
246246
def fail = throw new AssertionError(i"Failure to join alternatives $tp1 and $tp2")
247-
def fallback = tp2 match
247+
248+
tp2 match
248249
case AndType(tp21, tp22) =>
249-
mergeRefinedOrApplied(tp1, tp21) & mergeRefinedOrApplied(tp1, tp22)
250+
return mergeRefinedOrApplied(tp1, tp21) & mergeRefinedOrApplied(tp1, tp22)
250251
case _ =>
251-
fail
252-
tp1 match {
252+
253+
if tp1 eq tp2 then tp1
254+
else tp1 match
253255
case tp1 @ RefinedType(parent1, name1, rinfo1) =>
254-
tp2 match {
256+
tp2 match
255257
case RefinedType(parent2, `name1`, rinfo2) =>
256258
tp1.derivedRefinedType(
257259
mergeRefinedOrApplied(parent1, parent2), name1, rinfo1 | rinfo2)
258-
case _ => fallback
259-
}
260+
case _ => fail
260261
case tp1 @ AppliedType(tycon1, args1) =>
261-
tp2 match {
262+
tp2 match
262263
case AppliedType(tycon2, args2) =>
263264
tp1.derivedAppliedType(
264265
mergeRefinedOrApplied(tycon1, tycon2),
265266
TypeComparer.lubArgs(args1, args2, tycon1.typeParams))
266-
case _ => fallback
267-
}
267+
case _ => fail
268268
case tp1 @ TypeRef(pre1, _) =>
269-
tp2 match {
269+
tp2 match
270270
case tp2 @ TypeRef(pre2, _) if tp1.name eq tp2.name =>
271271
tp1.derivedSelect(pre1 | pre2)
272-
case _ => fallback
273-
}
274-
case tp1: TypeParamRef =>
275-
tp2 match {
276-
case tp2: TypeParamRef
277-
if (tp1.binder eq tp2.binder) && (tp1.paramNum == tp2.paramNum) =>
278-
tp1
279-
case _ => fallback
280-
}
272+
case _ => fail
281273
case AndType(tp11, tp12) =>
282274
mergeRefinedOrApplied(tp11, tp2) & mergeRefinedOrApplied(tp12, tp2)
275+
case tp1: TypeParamRef if tp1 == tp2 => tp1
283276
case _ => fail
284-
}
285277
}
286278

287279
def approximateOr(tp1: Type, tp2: Type): Type = {

0 commit comments

Comments
 (0)