@@ -2,20 +2,22 @@ package dotty.tools
2
2
package dotc
3
3
package typer
4
4
5
- import dotty .tools .dotc .ast .Trees ._
5
+ import dotty .tools .dotc .ast .Trees .*
6
6
import dotty .tools .dotc .ast .tpd
7
7
import dotty .tools .dotc .ast .untpd
8
8
import dotty .tools .dotc .core .Constants .Constant
9
- import dotty .tools .dotc .core .Contexts ._
9
+ import dotty .tools .dotc .core .Contexts .*
10
10
import dotty .tools .dotc .core .Names .{Name , TermName }
11
- import dotty .tools .dotc .core .StdNames ._
12
- import dotty .tools .dotc .core .Types ._
13
- import dotty .tools .dotc .core .Decorators ._
11
+ import dotty .tools .dotc .core .StdNames .*
12
+ import dotty .tools .dotc .core .Types .*
13
+ import dotty .tools .dotc .core .Decorators .*
14
14
import dotty .tools .dotc .core .TypeErasure
15
- import util .Spans ._
16
- import core .Symbols ._
17
- import ErrorReporting ._
18
- import reporting ._
15
+ import util .Spans .*
16
+ import core .Symbols .*
17
+ import ErrorReporting .*
18
+ import dotty .tools .dotc .transform .ValueClasses
19
+ import dotty .tools .dotc .transform .TypeUtils .isPrimitiveValueType
20
+ import reporting .*
19
21
20
22
object Dynamic {
21
23
private def isDynamicMethod (name : Name ): Boolean =
@@ -215,6 +217,12 @@ trait Dynamic {
215
217
errorTree(tree, em " Structural access not allowed on method $name because it $reason" )
216
218
217
219
fun.tpe.widen match {
220
+ case tpe : ValueType if ValueClasses .isDerivedValueClass(tpe.classSymbol) =>
221
+ val underlying = ValueClasses .valueClassUnbox(tpe.classSymbol.asClass).info.resultType.asSeenFrom(tpe, tpe.classSymbol)
222
+ val wrapped = structuralCall(nme.selectDynamic, Nil )
223
+ val resultTree = if wrapped.tpe.isExactlyAny then New (tpe, wrapped.cast(underlying) :: Nil ) else wrapped
224
+ resultTree.cast(tpe)
225
+
218
226
case tpe : ValueType =>
219
227
structuralCall(nme.selectDynamic, Nil ).cast(tpe)
220
228
@@ -236,7 +244,11 @@ trait Dynamic {
236
244
fail(i " has a parameter type with an unstable erasure " ) :: Nil
237
245
else
238
246
TypeErasure .erasure(tpe).asInstanceOf [MethodType ].paramInfos.map(clsOf(_))
239
- structuralCall(nme.applyDynamic, classOfs).cast(tpe.finalResultType)
247
+ val finalTpe = tpe.finalResultType
248
+ if ValueClasses .isDerivedValueClass(finalTpe.classSymbol) then
249
+ New (finalTpe, structuralCall(nme.applyDynamic, classOfs).cast(finalTpe)
250
+ .cast(ValueClasses .valueClassUnbox(finalTpe.classSymbol.asClass).info.resultType.asSeenFrom(finalTpe, finalTpe.classSymbol)) :: Nil )
251
+ else structuralCall(nme.applyDynamic, classOfs).cast(finalTpe)
240
252
}
241
253
242
254
// (@allanrenucci) I think everything below is dead code
0 commit comments