@@ -56,7 +56,7 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
56
56
private val newSymbolsGenericIndices : mutable.HashMap [Symbol , List [Int ]] = mutable.HashMap .empty
57
57
58
58
/**
59
- * A list of symbols gone through specialisation
59
+ * A list of symbols gone through the specialisation pipeline
60
60
* Is used to make calls to transformInfo idempotent
61
61
*/
62
62
private val specialized : ListBuffer [Symbol ] = ListBuffer .empty
@@ -224,7 +224,7 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
224
224
case _ => instantiations(index).map(_._2)
225
225
}
226
226
227
- val tmap : (Tree => Tree ) = _ match {
227
+ val treemap : (Tree => Tree ) = _ match {
228
228
case Return (t, from) if from.symbol == tree.symbol => Return (t, ref(newSym))
229
229
case t : TypeApply =>
230
230
(origTParams zip instTypes).foreach(x => genericToInstantiation.put(x._1, x._2))
@@ -235,11 +235,27 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
235
235
case t => t
236
236
}
237
237
238
+ val abstractPolyType = tree.symbol.info.widenDealias.asInstanceOf [PolyType ]
239
+ val typemap = new TypeMap {
240
+ override def apply (tp : Type ): Type = {
241
+ val t = mapOver(tp)
242
+ .substDealias(origTParams, instTypes)
243
+ .substParams(abstractPolyType, instTypes)
244
+ .subst(origVParams, vparams.flatten.map(_.tpe))
245
+ newSymType match {
246
+ case mt : MethodType if tparams.isEmpty =>
247
+ t.substParams(newSymType.asInstanceOf [MethodType ], vparams.flatten.map(_.tpe))
248
+ case pt : PolyType =>
249
+ t.substParams(newSymType.asInstanceOf [PolyType ], tparams)
250
+ .substParams(newSymType.resultType.asInstanceOf [MethodType ], vparams.flatten.map(_.tpe))
251
+ case _ => t
252
+ }
253
+ }
254
+ }
255
+
238
256
val typesReplaced = new TreeTypeMap (
239
- treeMap = tmap,
240
- typeMap = _
241
- .substDealias(origTParams, instTypes)
242
- .subst(origVParams, vparams.flatten.map(_.tpe)),
257
+ treeMap = treemap,
258
+ typeMap = typemap,
243
259
oldOwners = tree.symbol :: Nil ,
244
260
newOwners = newSym :: Nil
245
261
).transform(tree.rhs)
@@ -253,7 +269,7 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
253
269
val newArgs = (args zip fun.tpe.widen.firstParamTypes).map{
254
270
case (tr, tpe) =>
255
271
assert(tpe.widen ne NoType , " Bad cast when specializing" )
256
- tr.ensureConforms(tpe.widen)
272
+ tr.ensureConforms(typemap( tpe.widen) )
257
273
}
258
274
if (sameTypes(args, newArgs)) {
259
275
t
@@ -275,7 +291,7 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
275
291
}}
276
292
val expectedTypeFixed = tp.transform(typesReplaced)
277
293
if (expectedTypeFixed ne EmptyTree ) {
278
- expectedTypeFixed.ensureConforms(newSym.info.widen.finalResultType.widenDealias)
294
+ expectedTypeFixed.ensureConforms(typemap( newSym.info.widen.finalResultType.widenDealias) )
279
295
}
280
296
else expectedTypeFixed
281
297
}})
0 commit comments