Skip to content

Commit 20680b5

Browse files
committed
implement NamedTupleBuilder for better inference
1 parent 110600b commit 20680b5

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,9 +1596,10 @@ object desugar {
15961596
if ctx.mode.is(Mode.Type) then
15971597
AppliedTypeTree(ref(defn.NamedTupleTypeRef), namesTuple :: tup :: Nil)
15981598
else
1599-
TypeApply(
1600-
Apply(Select(ref(defn.NamedTupleModule), nme.withNames), tup),
1601-
namesTuple :: Nil)
1599+
val Builder_apply = Select(Select(ref(defn.NamedTupleModule), nme.NamedTupleBuilder), nme.apply)
1600+
val build = Select(ref(defn.NamedTupleModule), nme.build)
1601+
val builder = TypeApply(Builder_apply, namesTuple :: Nil)
1602+
Apply(Apply(build, builder :: Nil), tup :: Nil)
16021603

16031604
/** When desugaring a list pattern arguments `elems` adapt them and the
16041605
* expected type `pt` to each other. This means:

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ object StdNames {
552552
val mirror : N = "mirror"
553553
val moduleClass : N = "moduleClass"
554554
val name: N = "name"
555+
val NamedTupleBuilder: N = "NamedTupleBuilder"
555556
val nameDollar: N = "$name"
556557
val ne: N = "ne"
557558
val newFreeTerm: N = "newFreeTerm"

library/src/scala/NamedTuple.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,17 @@ object NamedTuple:
1919

2020
def unapply[N <: Tuple, V <: Tuple](x: NamedTuple[N, V]): Some[V] = Some(x)
2121

22+
object NamedTupleBuilder:
23+
opaque type Builder[N <: Tuple] = Unit
24+
25+
@annotation.compileTimeOnly("NamedTupleBuilder.apply should be used as the argument to NamedTuple.build")
26+
def apply[N <: Tuple]: Builder[N] = ???
27+
28+
extension [N <: Tuple](inline builder: NamedTupleBuilder.Builder[N])
29+
inline def build[V <: Tuple](inline x: V): NamedTuple[N, V] = x
30+
2231
extension [V <: Tuple](x: V)
32+
@deprecated("Use NamedTupleBuilder.apply instead")
2333
inline def withNames[N <: Tuple]: NamedTuple[N, V] = x
2434

2535
export NamedTupleDecomposition.{Names, DropNames}

0 commit comments

Comments
 (0)