Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions compiler/src/dotty/tools/dotc/core/TypeEval.scala
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,15 @@ object TypeEval:
nestedPairs(fieldLabels) :: nestedPairs(fieldTypes) :: Nil
else arg.widenDealias match
case arg @ defn.NamedTuple(_, _) => Some(arg)
case arg if arg.derivesFrom(defn.TupleClass) =>
val fieldTypesOpt = tupleElementTypes(arg)
fieldTypesOpt match
case Some(fieldTypes) =>
val fieldLabels = fieldTypes.zipWithIndex.map((_, i) => ConstantType(Constant(s"_$i")))
Some:
defn.NamedTupleTypeRef.appliedTo:
nestedPairs(fieldLabels) :: nestedPairs(fieldTypes) :: Nil
case _ => None
case _ => None

def constantFold1[T](extractor: Type => Option[T], op: T => Any): Option[Type] =
Expand Down
13 changes: 13 additions & 0 deletions tests/pos/i22036.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//> using options -experimental -language:experimental.namedTuples
import language.experimental.namedTuples

type Foo[T] = T
val x: NamedTuple.From[Tuple.Map[(Int, Int), Foo]] = ???
val res = x._1

type Z = NamedTuple.From[(Foo[Int], Foo[Int])]
val x2: Z = ???
val res2 = x2._1

val x3: Foo[NamedTuple.From[Tuple.Map[(Int, Int), Foo]]] = ???
val res3 = x3._1
Loading