Skip to content

Commit 75f5088

Browse files
committed
small optimisation
1 parent 2213d44 commit 75f5088

File tree

2 files changed

+12
-22
lines changed

2 files changed

+12
-22
lines changed

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,12 @@ object Types {
4949
implicit def eqType: CanEqual[Type, Type] = CanEqual.derived
5050

5151
object GenericTupleType:
52-
def unapply(tp: Type)(using Context): Option[List[Type]] = tp match
53-
case tp @ AppliedType(r: TypeRef, _) if r.symbol == defn.PairClass && tp.tupleArity(relaxEmptyTuple = true) > 0 =>
54-
Some(tp.tupleElementTypes)
55-
case AppliedType(r: TypeRef, args) if defn.isTupleClass(r.symbol) =>
56-
Some(args)
57-
case _ =>
58-
None
52+
def unapply(tp: AppliedType)(using Context): Option[List[Type]] =
53+
tp.tycon match
54+
case TypeRef(_, cls: ClassSymbol) if tp.tupleArity(relaxEmptyTuple = true) > 0 => // avoid type aliases
55+
Some(tp.tupleElementTypes)
56+
case _ =>
57+
None
5958

6059
/** Main class representing types.
6160
*

compiler/src/dotty/tools/dotc/typer/Synthesizer.scala

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -298,13 +298,6 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
298298
n == m
299299
case _ => this.asClass eq that.asClass // class equality otherwise
300300

301-
def isSub(that: MirrorSource)(using Context): Boolean = (this.arity, that.arity) match
302-
case (n, m) if n > 0 || m > 0 =>
303-
// we shortcut when at least one was a tuple.
304-
// This protects us from comparing classes for two TupleXXL with different arities.
305-
n == m
306-
case _ => this.asClass isSubClass that.asClass
307-
308301
def asClass(using Context): Symbol = this match
309302
case ClassSymbol(cls) => cls
310303
case GenericTuple(arity, _) =>
@@ -375,9 +368,11 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
375368
val mirroredClass = msrc.asClass
376369
val accessors = mirroredClass.caseAccessors.filterNot(_.isAllOf(PrivateLocal))
377370
val elemLabels = accessors.map(acc => ConstantType(Constant(acc.name.toString)))
378-
val nestedPairs = msrc match
379-
case MirrorSource.GenericTuple(_, args) => TypeOps.nestedPairs(args)
380-
case _ => TypeOps.nestedPairs(accessors.map(mirroredType.resultType.memberInfo(_).widenExpr))
371+
val (arity, nestedPairs) = msrc match
372+
case MirrorSource.GenericTuple(arity, args) =>
373+
(Some(arity), TypeOps.nestedPairs(args))
374+
case MirrorSource.ClassSymbol(cls) =>
375+
(None, TypeOps.nestedPairs(accessors.map(mirroredType.resultType.memberInfo(_).widenExpr)))
381376
val (monoType, elemsType) = mirroredType match
382377
case mirroredType: HKTypeLambda =>
383378
(mkMirroredMonoType(mirroredType), mirroredType.derivedLambdaType(resType = nestedPairs))
@@ -392,11 +387,7 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
392387
.refinedWith(tpnme.MirroredElemLabels, TypeAlias(elemsLabels))
393388
val mirrorRef =
394389
if mirroredClass.useCompanionAsProductMirror then companionPath(mirroredType, span)
395-
else
396-
val arity = msrc match
397-
case MirrorSource.GenericTuple(arity, _) => Some(arity)
398-
case _ => None
399-
anonymousMirror(monoType, ExtendsProductMirror, arity, span)
390+
else anonymousMirror(monoType, ExtendsProductMirror, arity, span)
400391
withNoErrors(mirrorRef.cast(mirrorType))
401392
end makeProductMirror
402393

0 commit comments

Comments
 (0)