@@ -4,7 +4,7 @@ package inlines
4
4
5
5
import ast .* , core .*
6
6
import Flags .* , Symbols .* , Types .* , Decorators .* , Constants .* , Contexts .*
7
- import StdNames .tpnme
7
+ import StdNames .{ tpnme , nme }
8
8
import transform .SymUtils ._
9
9
import typer .*
10
10
import NameKinds .BodyRetainerName
@@ -193,23 +193,29 @@ object Inlines:
193
193
194
194
val sym = unapp.symbol
195
195
196
- var unapplySym1 : Symbol = NoSymbol // created from within AnonClass() and used afterwards
197
-
198
196
val newUnapply = AnonClass (ctx.owner, List (defn.ObjectType ), sym.coord) { cls =>
199
197
// `fun` is a partially applied method that contains all type applications of the method.
200
198
// The methodic type `fun.tpe.widen` is the type of the function starting from the scrutinee argument
201
199
// and its type parameters are instantiated.
202
- val unapplySym = newSymbol(cls, sym.name.toTermName, Synthetic | Method , fun.tpe.widen, coord = sym.coord).entered
203
- val unapply = DefDef (unapplySym.asTerm, argss =>
204
- val body = fun.appliedToArgss(argss).withSpan(unapp.span)
205
- if body.symbol.is(Transparent ) then inlineCall(body)(using ctx.withOwner(unapplySym))
206
- else body
207
- )
208
- unapplySym1 = unapplySym
209
- List (unapply)
200
+ val unapplyInfo = fun.tpe.widen
201
+ val unapplySym = newSymbol(cls, sym.name.toTermName, Synthetic | Method , unapplyInfo, coord = sym.coord).entered
202
+
203
+ val unapply = DefDef (unapplySym.asTerm, argss => fun.appliedToArgss(argss).withSpan(unapp.span))
204
+
205
+ if fun.symbol.is(Transparent ) then
206
+ // Inline the body and refine the type of the unapply method
207
+ val inlinedBody = inlineCall(unapply.rhs)(using ctx.withOwner(unapplySym))
208
+ val refinedResultType = inlinedBody.tpe.widen
209
+ def refinedResult (info : Type ): Type = info match
210
+ case info : LambdaType => info.newLikeThis(info.paramNames, info.paramInfos, refinedResult(info.resultType))
211
+ case _ => refinedResultType
212
+ unapplySym.info = refinedResult(unapplyInfo)
213
+ List (cpy.DefDef (unapply)(tpt = TypeTree (refinedResultType), rhs = inlinedBody))
214
+ else
215
+ List (unapply)
210
216
}
211
217
212
- val newFun = newUnapply.select(unapplySym1 ).withSpan(unapp.span)
218
+ val newFun = newUnapply.select(sym.name ).withSpan(unapp.span)
213
219
cpy.UnApply (unapp)(newFun, trailingImplicits, patterns)
214
220
end inlinedUnapply
215
221
0 commit comments