Skip to content

Commit cc653e4

Browse files
committed
Use a typemap when transforming DefDef's
Makes for a more complete handling of different elements
1 parent 87d59fa commit cc653e4

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

src/dotty/tools/dotc/transform/TypeSpecializer.scala

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
5656
private val newSymbolsGenericIndices: mutable.HashMap[Symbol, List[Int]] = mutable.HashMap.empty
5757

5858
/**
59-
* A list of symbols gone through specialisation
59+
* A list of symbols gone through the specialisation pipeline
6060
* Is used to make calls to transformInfo idempotent
6161
*/
6262
private val specialized: ListBuffer[Symbol] = ListBuffer.empty
@@ -224,7 +224,7 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
224224
case _ => instantiations(index).map(_._2)
225225
}
226226

227-
val tmap: (Tree => Tree) = _ match {
227+
val treemap: (Tree => Tree) = _ match {
228228
case Return(t, from) if from.symbol == tree.symbol => Return(t, ref(newSym))
229229
case t: TypeApply =>
230230
(origTParams zip instTypes).foreach(x => genericToInstantiation.put(x._1, x._2))
@@ -235,11 +235,27 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
235235
case t => t
236236
}
237237

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+
238256
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,
243259
oldOwners = tree.symbol :: Nil,
244260
newOwners = newSym :: Nil
245261
).transform(tree.rhs)
@@ -253,7 +269,7 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
253269
val newArgs = (args zip fun.tpe.widen.firstParamTypes).map{
254270
case(tr, tpe) =>
255271
assert(tpe.widen ne NoType, "Bad cast when specializing")
256-
tr.ensureConforms(tpe.widen)
272+
tr.ensureConforms(typemap(tpe.widen))
257273
}
258274
if (sameTypes(args, newArgs)) {
259275
t
@@ -275,7 +291,7 @@ class TypeSpecializer extends MiniPhaseTransform with InfoTransformer {
275291
}}
276292
val expectedTypeFixed = tp.transform(typesReplaced)
277293
if (expectedTypeFixed ne EmptyTree) {
278-
expectedTypeFixed.ensureConforms(newSym.info.widen.finalResultType.widenDealias)
294+
expectedTypeFixed.ensureConforms(typemap(newSym.info.widen.finalResultType.widenDealias))
279295
}
280296
else expectedTypeFixed
281297
}})

0 commit comments

Comments
 (0)