File tree 3 files changed +16
-1
lines changed
compiler/src/dotty/tools/dotc 3 files changed +16
-1
lines changed Original file line number Diff line number Diff line change @@ -362,6 +362,7 @@ object StdNames {
362
362
val EnumValue : N = " EnumValue"
363
363
val ExistentialTypeTree : N = " ExistentialTypeTree"
364
364
val Flag : N = " Flag"
365
+ val Fields : N = " Fields"
365
366
val From : N = " From"
366
367
val Ident : N = " Ident"
367
368
val Import : N = " Import"
Original file line number Diff line number Diff line change @@ -782,6 +782,19 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
782
782
else
783
783
typedDynamicSelect(tree2, Nil , pt)
784
784
else
785
+ if qual.tpe.derivesFrom(defn.SelectableClass )
786
+ && selName.isTermName && ! isDynamicExpansion(tree)
787
+ && ! pt.isInstanceOf [FunOrPolyProto ] && pt != LhsProto
788
+ then
789
+ val fieldsType = qual.tpe.select(tpnme.Fields ).dealias.simplified
790
+ val fields = fieldsType.namedTupleElementTypes
791
+ typr.println(i " try dyn select $qual, $selName, $fields" )
792
+ fields.find(_._1 == selName) match
793
+ case Some ((fieldName, fieldType)) =>
794
+ val tree2 = cpy.Select (tree0)(untpd.TypedSplice (qual), selName)
795
+ val sel = typedDynamicSelect(tree2, Nil , pt)
796
+ return sel.cast(fieldType)
797
+ case _ =>
785
798
assignType(tree,
786
799
rawType match
787
800
case rawType : NamedType =>
Original file line number Diff line number Diff line change @@ -22,7 +22,8 @@ package scala
22
22
* In this case the call will synthesize `Class` arguments for the erasure of
23
23
* all formal parameter types of the method in the structural type.
24
24
*/
25
- trait Selectable extends Any
25
+ trait Selectable extends Any :
26
+ type Fields // TODO: add <: NamedTyple.AnyNamedTuple when NamedTuple is no longer experimental
26
27
27
28
object Selectable :
28
29
/* Scala 2 compat + allowing for cross-compilation:
You can’t perform that action at this time.
0 commit comments