@@ -1000,21 +1000,28 @@ object Erasure {
1000
1000
* which is then dropped in `typedStats`.
1001
1001
*/
1002
1002
private def addRetainedInlineBodies (stats : List [untpd.Tree ])(using Context ): List [untpd.Tree ] =
1003
- lazy val retainerDef : Map [Symbol , DefDef ] = stats.collect {
1004
- case stat : DefDef @ unchecked if stat.symbol.name.is(BodyRetainerName ) =>
1005
- val retainer = stat.symbol
1006
- val origName = retainer.name.asTermName.exclude(BodyRetainerName )
1007
- val targetName =
1008
- if retainer.hasAnnotation(defn.TargetNameAnnot ) then
1009
- retainer.targetName.unmangle(BodyRetainerName ).exclude(BodyRetainerName )
1010
- else origName
1011
- val inlineMeth = atPhase(typerPhase) {
1012
- retainer.owner.info.decl(origName)
1013
- .matchingDenotation(retainer.owner.thisType, stat.symbol.info, targetName)
1014
- .symbol
1015
- }
1016
- (inlineMeth, stat)
1017
- }.toMap
1003
+ lazy val (rSyms, originalSyms, retainerDef): (List [Symbol ], List [Symbol ], Map [Symbol , DefDef ]) =
1004
+ val rSyms = List .newBuilder[Symbol ]
1005
+ val originalSyms = List .newBuilder[Symbol ]
1006
+ val retainerDef = stats.collect {
1007
+ case stat : DefDef @ unchecked if stat.symbol.name.is(BodyRetainerName ) =>
1008
+ val retainer = stat.symbol
1009
+ val origName = retainer.name.asTermName.exclude(BodyRetainerName )
1010
+ val targetName =
1011
+ if retainer.hasAnnotation(defn.TargetNameAnnot ) then
1012
+ retainer.targetName.unmangle(BodyRetainerName ).exclude(BodyRetainerName )
1013
+ else origName
1014
+ val inlineMeth = atPhase(typerPhase) {
1015
+ retainer.owner.info.decl(origName)
1016
+ .matchingDenotation(retainer.owner.thisType, stat.symbol.info, targetName)
1017
+ .symbol
1018
+ }
1019
+ if inlineMeth.name.endsWith(nme.SPECIALIZED_SUFFIX .toSimpleName) then
1020
+ rSyms += retainer
1021
+ originalSyms += inlineMeth
1022
+ (inlineMeth, stat)
1023
+ }.toMap
1024
+ (rSyms.result(), originalSyms.result(), retainerDef)
1018
1025
stats.mapConserve {
1019
1026
case stat : DefDef @ unchecked if stat.symbol.isRetainedInlineMethod =>
1020
1027
val rdef = retainerDef(stat.symbol)
@@ -1024,8 +1031,8 @@ object Erasure {
1024
1031
val mapBody = TreeTypeMap (
1025
1032
oldOwners = rdef.symbol :: Nil ,
1026
1033
newOwners = stat.symbol :: Nil ,
1027
- substFrom = fromParams,
1028
- substTo = toParams)
1034
+ substFrom = rSyms ::: fromParams,
1035
+ substTo = originalSyms ::: toParams)
1029
1036
cpy.DefDef (stat)(rhs = mapBody.transform(rdef.rhs))
1030
1037
case stat => stat
1031
1038
}
0 commit comments