Skip to content

Commit 4ab5c5d

Browse files
authored
Reduce repeated code in NamedTuple.unapply and namedTupleElementTypesUpTo (#22384)
Address codereview comments from #22325
2 parents 81e057a + ded5d9c commit 4ab5c5d

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

Diff for: compiler/src/dotty/tools/dotc/core/Definitions.scala

+8-1
Original file line numberDiff line numberDiff line change
@@ -1340,12 +1340,19 @@ class Definitions {
13401340
case ByNameFunction(_) => true
13411341
case _ => false
13421342

1343+
object NamedTupleDirect:
1344+
def unapply(t: Type)(using Context): Option[(Type, Type)] =
1345+
t match
1346+
case AppliedType(tycon, nmes :: vals :: Nil) if tycon.typeSymbol == NamedTupleTypeRef.symbol =>
1347+
Some((nmes, vals))
1348+
case _ => None
1349+
13431350
object NamedTuple:
13441351
def apply(nmes: Type, vals: Type)(using Context): Type =
13451352
AppliedType(NamedTupleTypeRef, nmes :: vals :: Nil)
13461353
def unapply(t: Type)(using Context): Option[(Type, Type)] =
13471354
t match
1348-
case AppliedType(tycon, nmes :: vals :: Nil) if tycon.typeSymbol == NamedTupleTypeRef.symbol =>
1355+
case NamedTupleDirect(nmes, vals) =>
13491356
Some((nmes, vals))
13501357
case tp: TypeProxy =>
13511358
val t = unapply(tp.superType); t

Diff for: compiler/src/dotty/tools/dotc/core/TypeUtils.scala

+9-12
Original file line numberDiff line numberDiff line change
@@ -128,22 +128,19 @@ class TypeUtils:
128128
case None => throw new AssertionError("not a tuple")
129129

130130
def namedTupleElementTypesUpTo(bound: Int, derived: Boolean, normalize: Boolean = true)(using Context): List[(TermName, Type)] =
131+
def extractNamesTypes(nmes: Type, vals: Type): List[(TermName, Type)] =
132+
val names = nmes.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil).map(_.dealias).map:
133+
case ConstantType(Constant(str: String)) => str.toTermName
134+
case t => throw TypeError(em"Malformed NamedTuple: names must be string types, but $t was found.")
135+
val values = vals.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil)
136+
names.zip(values)
137+
131138
(if normalize then self.normalized else self).dealias match
132139
// for desugaring and printer, ignore derived types to avoid infinite recursion in NamedTuple.unapply
133-
case AppliedType(tycon, nmes :: vals :: Nil) if !derived && tycon.typeSymbol == defn.NamedTupleTypeRef.symbol =>
134-
val names = nmes.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil).map(_.dealias).map:
135-
case ConstantType(Constant(str: String)) => str.toTermName
136-
case t => throw TypeError(em"Malformed NamedTuple: names must be string types, but $t was found.")
137-
val values = vals.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil)
138-
names.zip(values)
140+
case defn.NamedTupleDirect(nmes, vals) => extractNamesTypes(nmes, vals)
139141
case t if !derived => Nil
140142
// default cause, used for post-typing
141-
case defn.NamedTuple(nmes, vals) =>
142-
val names = nmes.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil).map(_.dealias).map:
143-
case ConstantType(Constant(str: String)) => str.toTermName
144-
case t => throw TypeError(em"Malformed NamedTuple: names must be string types, but $t was found.")
145-
val values = vals.tupleElementTypesUpTo(bound, normalize).getOrElse(Nil)
146-
names.zip(values)
143+
case defn.NamedTuple(nmes, vals) => extractNamesTypes(nmes, vals)
147144
case t =>
148145
Nil
149146

0 commit comments

Comments
 (0)