@@ -34,6 +34,7 @@ import Denotations.SingleDenotation
34
34
import annotation .threadUnsafe
35
35
36
36
import scala .util .control .NonFatal
37
+ import dotty .tools .dotc .inlines .Inlines
37
38
38
39
object Applications {
39
40
import tpd .*
@@ -1446,7 +1447,23 @@ trait Applications extends Compatibility {
1446
1447
unapplyArgType
1447
1448
1448
1449
val dummyArg = dummyTreeOfType(ownType)
1449
- val unapplyApp = typedExpr(untpd.TypedSplice (Apply (unapplyFn, dummyArg :: Nil )))
1450
+ val (newUnapplyFn, unapplyApp) =
1451
+ val unapplyAppCall = withMode(Mode .NoInline ) {
1452
+ typedExpr(untpd.TypedSplice (Apply (unapplyFn, dummyArg :: Nil )))
1453
+ }
1454
+ def inlinedUnapplyFnAndApp (unapp : Tree ): (Tree , Tree ) = unapp match {
1455
+ case DynamicUnapply (_) =>
1456
+ report.error(em " Structural unapply is not supported " , unapplyFn.srcPos)
1457
+ (unapplyFn, unapplyAppCall)
1458
+ case Apply (fn, `dummyArg` :: Nil ) =>
1459
+ val inlinedUnapplyFn = Inlines .inlinedUnapplyFun(fn)
1460
+ (inlinedUnapplyFn, inlinedUnapplyFn.appliedToArgs(`dummyArg` :: Nil ))
1461
+ case Apply (fn, args) =>
1462
+ val (fn1, app) = inlinedUnapplyFnAndApp(fn)
1463
+ (fn1, tpd.cpy.Apply (unapp)(app, args))
1464
+ }
1465
+ if unapplyAppCall.symbol.isAllOf(Transparent | Inline ) then inlinedUnapplyFnAndApp(unapplyAppCall)
1466
+ else (unapplyFn, unapplyAppCall)
1450
1467
def unapplyImplicits (unapp : Tree ): List [Tree ] = {
1451
1468
val res = List .newBuilder[Tree ]
1452
1469
def loop (unapp : Tree ): Unit = unapp match {
@@ -1475,7 +1492,7 @@ trait Applications extends Compatibility {
1475
1492
List .fill(argTypes.length - args.length)(WildcardType )
1476
1493
}
1477
1494
val unapplyPatterns = bunchedArgs.lazyZip(argTypes) map (typed(_, _))
1478
- val result = assignType(cpy.UnApply (tree)(unapplyFn , unapplyImplicits(unapplyApp), unapplyPatterns), ownType)
1495
+ val result = assignType(cpy.UnApply (tree)(newUnapplyFn , unapplyImplicits(unapplyApp), unapplyPatterns), ownType)
1479
1496
unapp.println(s " unapply patterns = $unapplyPatterns" )
1480
1497
if (ownType.stripped eq selType.stripped) || ownType.isError then result
1481
1498
else tryWithTypeTest(Typed (result, TypeTree (ownType)), selType)
0 commit comments