@@ -34,6 +34,7 @@ import Denotations.SingleDenotation
3434import annotation .threadUnsafe
3535
3636import scala .util .control .NonFatal
37+ import dotty .tools .dotc .inlines .Inlines
3738
3839object Applications {
3940 import tpd .*
@@ -1446,7 +1447,36 @@ trait Applications extends Compatibility {
14461447 unapplyArgType
14471448
14481449 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+ /** Inlines the unapply function before the dummy argument
1455+ *
1456+ * A call `P.unapply[...](using l1, ..)(`dummy`)(using t1, ..)` becomes
1457+ * ```
1458+ * {
1459+ * class $anon {
1460+ * def unapply(s: S)(using t1: T1, ..): R =
1461+ * ... // inlined code for: P.unapply[...](using l1, ..)(s)(using t1, ..)
1462+ * }
1463+ * new $anon
1464+ * }.unapply(`dummy`)(using t1, ..)
1465+ * ```
1466+ */
1467+ def inlinedUnapplyFnAndApp (unapp : Tree ): (Tree , Tree ) = unapp match {
1468+ case DynamicUnapply (_) =>
1469+ report.error(em " Structural unapply is not supported " , unapplyFn.srcPos)
1470+ (unapplyFn, unapplyAppCall)
1471+ case Apply (fn, `dummyArg` :: Nil ) =>
1472+ val inlinedUnapplyFn = Inlines .inlinedUnapplyFun(fn)
1473+ (inlinedUnapplyFn, inlinedUnapplyFn.appliedToArgs(`dummyArg` :: Nil ))
1474+ case Apply (fn, args) =>
1475+ val (fn1, app) = inlinedUnapplyFnAndApp(fn)
1476+ (fn1, tpd.cpy.Apply (unapp)(app, args))
1477+ }
1478+ if unapplyAppCall.symbol.isAllOf(Transparent | Inline ) then inlinedUnapplyFnAndApp(unapplyAppCall)
1479+ else (unapplyFn, unapplyAppCall)
14501480 def unapplyImplicits (unapp : Tree ): List [Tree ] = {
14511481 val res = List .newBuilder[Tree ]
14521482 def loop (unapp : Tree ): Unit = unapp match {
@@ -1475,7 +1505,7 @@ trait Applications extends Compatibility {
14751505 List .fill(argTypes.length - args.length)(WildcardType )
14761506 }
14771507 val unapplyPatterns = bunchedArgs.lazyZip(argTypes) map (typed(_, _))
1478- val result = assignType(cpy.UnApply (tree)(unapplyFn , unapplyImplicits(unapplyApp), unapplyPatterns), ownType)
1508+ val result = assignType(cpy.UnApply (tree)(newUnapplyFn , unapplyImplicits(unapplyApp), unapplyPatterns), ownType)
14791509 unapp.println(s " unapply patterns = $unapplyPatterns" )
14801510 if (ownType.stripped eq selType.stripped) || ownType.isError then result
14811511 else tryWithTypeTest(Typed (result, TypeTree (ownType)), selType)
0 commit comments