Skip to content

Commit 733dfe4

Browse files
committed
fixed ElimObjectAny phase: backend now not seeing ObjectAny; adding MoveReifiedParam phase
1 parent 8def5f1 commit 733dfe4

File tree

4 files changed

+163
-27
lines changed

4 files changed

+163
-27
lines changed

compiler/src/dotty/tools/dotc/Compiler.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class Compiler {
113113
List(new AddReifiedTypes) :: // Add reified type parameters
114114
List(new ErasurePreservation) :: //
115115
List(new Erasure) :: // Rewrite types to JVM model, erasing all type parameters, abstract types and refinements.
116+
List(new MoveReifiedParams) :: // Move the reified value parameters to the end of parameter list
116117
List(new ElimObjectAny, // Eliminate ObjcetAny to Object
117118
new ElimErasedValueType, // Expand erased value types to their underlying implementation types
118119
new PureStats, // Remove pure stats from blocks

compiler/src/dotty/tools/dotc/transform/AddReifiedTypes.scala

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
4747
override def prepareForTemplate(tree: Template)(using Context): Context =
4848
val cls = ctx.owner.asClass
4949
if (cls.typeParams.nonEmpty){
50-
println(s"PrepareForTemplate for class ${cls.name} with type params: ${cls.typeParams.map(_.name)}")
50+
if DEBUG then println(s"AddReifiedTypes: PrepareForTemplate for class ${cls.name} with type params: ${cls.typeParams.map(_.name)}")
5151
val fields = cls.typeParams.map { tparam =>
5252
val reifiedName = termName(s"reifiedField$$${tparam.name}")
5353
val reifiedSym = newSymbol(cls, reifiedName, Flags.Private | Flags.Local | Flags.Mutable, defn.ReifiedValueType)
@@ -65,7 +65,7 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
6565
val newFields = fieldsMap.map { case (name, sym) =>
6666
ValDef(sym.asTerm)
6767
}.toList
68-
println(s"TransformTemplate for class ${cls.name}, adding reified fields: ${newFields.map(_.name)}")
68+
if DEBUG then println(s"TransformTemplate for class ${cls.name}, adding reified fields: ${newFields.map(_.name)}")
6969

7070
val constr = tree.constr
7171
val allParams = constr.paramss.flatten
@@ -91,7 +91,7 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
9191
val cls = sym.owner.asClass
9292
val reifiedNames = cls.typeParams.map(tparam => termName(s"reifiedField$$${tparam.name}"))
9393
val reifiedTypes = reifiedNames.map(_ => defn.ReifiedValueType)
94-
println(s"TransformInfo for constructor ${sym.name} of class ${cls.name}, adding reified params: ${reifiedNames}")
94+
if DEBUG then println(s"AddReifiedTypes: TransformInfo for constructor ${sym.name} of class ${cls.name}, adding reified params: ${reifiedNames}")
9595
addParamsToMethod(tp, reifiedNames, reifiedTypes)
9696
} else addReifiedParams(tp)
9797
//println(s"Transforming method info for ${sym.name}, from: ${tp.show} to: ${res.show}")
@@ -163,7 +163,7 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
163163
tparams.asInstanceOf[List[TypeDef]]
164164
}.flatten
165165
if (typeParams.nonEmpty) {
166-
if DEBUG then println(s"PrepareForDefDef for tree.show: ${tree.show}" +
166+
if DEBUG then println(s"AddReifiedTypes: PrepareForDefDef for tree.show: ${tree.show}" +
167167
s" tree: ${tree}" +
168168
s" with type params: ${typeParams.map(_.name)}")
169169
val typeParamMap = typeParams.map{tparam =>
@@ -187,7 +187,7 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
187187
val newParamDefs = newParamSyms.map(sym => ValDef(sym.asTerm))
188188

189189
val newParamss = tree.paramss :+ newParamDefs
190-
println(s"TransformDefDef for constructor ${sym.name} of class ${cls.name}, adding reified params: ${newParamDefs.map(_.name)}")
190+
if DEBUG then println(s"AddReifiedTypes: TransformDefDef for constructor ${sym.name} of class ${cls.name}, adding reified params: ${newParamDefs.map(_.name)}")
191191

192192
return cpy.DefDef(tree)(paramss = newParamss.asInstanceOf[List[ParamClause]])
193193
}
@@ -208,14 +208,14 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
208208
case vparams: List[?] =>
209209
newParamss = newParamss :+ clause.asInstanceOf[ParamClause]
210210
if (typeParams.nonEmpty) {
211-
if DEBUG then println(s"TransformDefDef for tree: ${tree.show} Adding reified value at end for method ${sym.name} with type params: ${typeParams.map(_.name)}")
211+
if DEBUG then println(s"AddReifiedTypes: TransformDefDef for tree: ${tree.show} Adding reified value at end for method ${sym.name} with type params: ${typeParams.map(_.name)}")
212212
newParamss = newParamss :+ createReifiedClause(sym, typeParams)
213213
typeParams = Nil
214214
}
215215
}
216216
}
217217
if (typeParams.nonEmpty) {
218-
if DEBUG then println(s"TransformDefDef for tree: ${tree.show} Adding reified value at end for method ${sym.name} with type params: ${typeParams.map(_.name)}")
218+
if DEBUG then println(s"AddReifiedTypes: TransformDefDef for tree: ${tree.show} Adding reified value at end for method ${sym.name} with type params: ${typeParams.map(_.name)}")
219219
newParamss = newParamss :+ createReifiedClause(sym, typeParams)
220220
}
221221
cpy.DefDef(tree)(paramss = newParamss)
@@ -230,15 +230,15 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
230230
if (map.contains(tparam.name)){
231231
ValDef(map(tparam.name).asTerm)
232232
} else {
233-
report.error(s"ERROR: createReifiedClause: no reified sym found for type param ${tparam.name} in method ${sym.name}")
233+
report.error(s"AddReifiedTypes: ERROR: createReifiedClause: no reified sym found for type param ${tparam.name} in method ${sym.name}")
234234
val reifiedName = termName(s"reified$$${tparam.name}")
235235
val reifiedSym = newSymbol(sym, reifiedName, Flags.Param, defn.ReifiedValueType)
236236
ValDef(reifiedSym.asTerm)
237237
}
238238
}
239239
} else {
240-
if DEBUG then println(s"reifiedSyms keys: ${reifiedSyms.keys.map(_.name)}")
241-
report.error(s"ERROR: createReifiedClause: no reified syms found for method ${sym.name}")
240+
if DEBUG then println(s"AddReifiedTypes: reifiedSyms keys: ${reifiedSyms.keys.map(_.name)}")
241+
report.error(s"AddReifiedTypes: ERROR: createReifiedClause: no reified syms found for method ${sym.name}")
242242
Nil
243243
}
244244
}
@@ -249,21 +249,21 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
249249
val sym = getCallSymbol(fun)
250250

251251
if (sym.isConstructor) {
252-
println(s"TransformApply Constructor call: tree: $tree, ${tree.show}")
252+
println(s"AddReifiedTypes: TransformApply Constructor call: tree: $tree, ${tree.show}")
253253
val isReified = tree.tpe.widen match {
254254
case mt: MethodType =>
255255
// println(s"TransformApply Constructor call: method type: ${mt.paramNames}")
256256
mt.paramNames.nonEmpty && mt.paramNames.head.toString.startsWith("reifiedField$")
257257
case _ => false
258258
}
259259
if (isReified) {
260-
println(s"TransformApply Constructor: need to add reified args to constructor call: ${tree.show}")
260+
if DEBUG then println(s"AddReifiedTypes: TransformApply Constructor: need to add reified args to constructor call: ${tree.show}")
261261
var current = fun
262262
while (current.isInstanceOf[Apply]) current = current.asInstanceOf[Apply].fun
263263

264264
val reifiedArgs = collectReifiedArgs(current)
265265
if (reifiedArgs.nonEmpty) {
266-
println(s"TransformApply Constructor: appending args ${reifiedArgs.map(_.show)}")
266+
if DEBUG then println(s"AddReifiedTypes: TransformApply Constructor: appending args ${reifiedArgs.map(_.show)}")
267267
val reifiedParamNames = reifiedArgs.map(_ => termName("reified"))
268268
val reifiedParamTypes = reifiedArgs.map(_ => defn.ReifiedValueType)
269269

@@ -276,7 +276,7 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
276276
val funType = fun.tpe.widen
277277
val resType = funType match {
278278
case mt: MethodType =>
279-
if DEBUG then println(s"TransformApply tree type: ${tree.tpe.show}, method type: ${mt.resType.show}")
279+
if DEBUG then println(s"AddReifiedTypes: TransformApply tree type: ${tree.tpe.show}, method type: ${mt.resType.show}")
280280
mt.resType
281281
case _ => tree.tpe
282282
}
@@ -287,7 +287,7 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
287287
case mt: MethodType => mt.resType
288288
case _ => resType
289289
}
290-
if DEBUG then println(s"Transforming Apply: ${tree.show}, fun type: ${funType.show}, res type: ${resType.show}, with reified args: ${reifiedArgs.map(_.show)}")
290+
if DEBUG then println(s"AddReifiedTypes: Transforming Apply: ${tree.show}, fun type: ${funType.show}, res type: ${resType.show}, with reified args: ${reifiedArgs.map(_.show)}")
291291
Apply(innerApply, reifiedArgs).withType(outerResType)
292292
} else tree
293293
}
@@ -335,8 +335,8 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
335335
case Some(sym) =>
336336
ref(sym)
337337
case None =>
338-
println(s"should not be here! ERROR: createReifiedValue: no reified sym found for type param ${paramName} in owner ${ctx.owner.name}");
339-
report.error(s"ERROR: createReifiedValue: no reified sym found for type param ${paramName} in owner ${ctx.owner.name}")
338+
println(s"AddReifiedTypes: should not be here! ERROR: createReifiedValue: no reified sym found for type param ${paramName} in owner ${ctx.owner.name}");
339+
report.error(s"AddReifiedTypes: ERROR: createReifiedValue: no reified sym found for type param ${paramName} in owner ${ctx.owner.name}")
340340
Literal(Constant(0.toByte)).withType(defn.ReifiedValueType)
341341
}
342342
case tr: TypeRef => {
@@ -349,8 +349,8 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
349349
val fieldSym = classFieldSyms(paramOwner)(paramName)
350350
This(paramOwner.asClass).select(fieldSym)
351351
} else {
352-
println(s"should not be here! ERROR: createReifiedValue: no reified field found for class type param ${paramName} in class ${paramOwner.name}");
353-
report.error(s"ERROR: createReifiedValue: no reified field found for class type param ${paramName} in class ${paramOwner.name}")
352+
println(s"AddReifiedTypes: should not be here! ERROR: createReifiedValue: no reified field found for class type param ${paramName} in class ${paramOwner.name}");
353+
report.error(s"AddReifiedTypes: ERROR: createReifiedValue: no reified field found for class type param ${paramName} in class ${paramOwner.name}")
354354
Literal(Constant(0.toByte)).withType(defn.ReifiedValueType)
355355
}
356356
}
@@ -360,8 +360,8 @@ class AddReifiedTypes extends MiniPhase with InfoTransformer {
360360
val sym = reifiedSyms(paramOwner)(paramName)
361361
ref(sym)
362362
else {
363-
println(s"should not be here! ERROR: createReifiedValue: no reified sym found for type param ${paramName} in owner ${paramOwner.name}");
364-
report.error(s"ERROR: createReifiedValue: no reified sym found for type param ${paramName} in owner ${paramOwner.name}")
363+
println(s"AddReifiedTypes: should not be here! ERROR: createReifiedValue: no reified sym found for type param ${paramName} in owner ${paramOwner.name}");
364+
report.error(s"AddReifiedTypes: ERROR: createReifiedValue: no reified sym found for type param ${paramName} in owner ${paramOwner.name}")
365365
Literal(Constant(0.toByte)).withType(defn.ReifiedValueType)
366366
}
367367
else

compiler/src/dotty/tools/dotc/transform/ElimObjectAny.scala

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,58 @@ class ElimObjectAny extends MiniPhase with InfoTransformer{
3737
val newType = elimObjectAny(tree.tpe)
3838
if (newType ne tree.tpe) then tree.withType(newType)
3939
else tree
40-
// def changeObjectAnyToObject(tp: Type)(using Context): Type = {
41-
// tp match
42-
// case tr: TypeRef if tr.symbol == defn.ObjectAnySymbol =>
43-
// defn.ObjectType
44-
// case _ => tp
45-
// }
40+
41+
override def transformApply(tree: Apply)(using Context): Tree =
42+
tree.withType(elimObjectAny(tree.tpe))
43+
44+
override def transformSelect(tree: Select)(using Context): Tree =
45+
tree.withType(elimObjectAny(tree.tpe))
46+
47+
override def transformIdent(tree: Ident)(using Context): Tree =
48+
tree.withType(elimObjectAny(tree.tpe))
49+
50+
override def transformTyped(tree: Typed)(using Context): Tree =
51+
tree.withType(elimObjectAny(tree.tpe))
52+
53+
override def transformBlock(tree: Block)(using Context): Tree =
54+
tree.withType(elimObjectAny(tree.tpe))
55+
56+
override def transformIf(tree: If)(using Context): Tree =
57+
tree.withType(elimObjectAny(tree.tpe))
58+
59+
override def transformTypeApply(tree: TypeApply)(using Context): Tree =
60+
tree.withType(elimObjectAny(tree.tpe))
61+
62+
override def transformLiteral(tree: Literal)(using Context): Tree =
63+
tree.withType(elimObjectAny(tree.tpe))
64+
65+
override def transformThis(tree: This)(using Context): Tree =
66+
tree.withType(elimObjectAny(tree.tpe))
67+
68+
override def transformNew(tree: New)(using Context): Tree =
69+
tree.withType(elimObjectAny(tree.tpe))
70+
71+
override def transformSuper(tree: Super)(using Context): Tree =
72+
tree.withType(elimObjectAny(tree.tpe))
73+
74+
override def transformMatch(tree: Match)(using Context): Tree =
75+
tree.withType(elimObjectAny(tree.tpe))
76+
77+
override def transformTry(tree: Try)(using Context): Tree =
78+
tree.withType(elimObjectAny(tree.tpe))
79+
80+
override def transformReturn(tree: Return)(using Context): Tree =
81+
tree.withType(elimObjectAny(tree.tpe))
82+
83+
override def transformSeqLiteral(tree: SeqLiteral)(using Context): Tree =
84+
tree.withType(elimObjectAny(tree.tpe))
85+
86+
override def transformInlined(tree: Inlined)(using Context): Tree =
87+
tree.withType(elimObjectAny(tree.tpe))
88+
89+
override def transformAssign(tree: Assign)(using Context): Tree =
90+
tree.withType(elimObjectAny(tree.tpe))
91+
4692
}
4793

4894
object ElimObjectAny {
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package dotty.tools.dotc.transform
2+
3+
import dotty.tools.dotc.core.DenotTransformers.InfoTransformer
4+
import dotty.tools.dotc.transform.MegaPhase.MiniPhase
5+
import dotty.tools.dotc.core.Contexts.*
6+
import dotty.tools.dotc.core.Types.*
7+
import dotty.tools.dotc.core.Symbols.*
8+
import dotty.tools.dotc.core.Flags
9+
import dotty.tools.dotc.ast.tpd
10+
import dotty.tools.dotc.transform.ErasurePreservation.*
11+
import dotty.tools.dotc.core.Names.*
12+
import dotty.tools.dotc.core.Phases.*
13+
14+
class MoveReifiedParams extends MiniPhase with InfoTransformer{
15+
import tpd.*
16+
override def phaseName: String = "moveReifiedParams"
17+
override def description: String = "move reified parameters to the end of the parameter list"
18+
19+
final val DEBUG = false
20+
21+
override def transformInfo(tp: Type, sym: Symbol)(using Context): Type = tp match {
22+
case mt: MethodType if sym.is(Flags.Method)=>
23+
val zipped = mt.paramNames.zip(mt.paramInfos)
24+
val (reified, normal) = zipped.partition((name, _) => name.toString.startsWith("reified$"))
25+
val newNames = normal.map(_._1) ++ reified.map(_._1)
26+
val newInfos = normal.map(_._2) ++ reified.map(_._2)
27+
28+
if (reified.nonEmpty){
29+
if DEBUG then println(s"MoveReifiedParams: transformInfo : Reordering method parameters for ${sym} from ${mt.paramNames} to ${newNames}")
30+
mt.derivedLambdaType(newNames, newInfos, mt.resType)
31+
} else tp
32+
case _ => tp
33+
}
34+
35+
override def transformDefDef(tree: DefDef)(using Context): Tree = {
36+
val sym = tree.symbol
37+
val allParams = tree.paramss.flatten
38+
39+
val (reifiedParams, normalParams) = allParams.partition(_.name.toString.startsWith("reified$"))
40+
41+
if (reifiedParams.nonEmpty) {
42+
val newParams = normalParams ++ reifiedParams
43+
44+
val newTree = cpy.DefDef(tree)(paramss = List(newParams.asInstanceOf[ParamClause]))
45+
46+
// reorder MethodParameterReturnType attachment
47+
if (tree.hasAttachment(MethodParameterReturnType)) {
48+
val (count, paramTypes, retType) = tree.attachment(MethodParameterReturnType)
49+
val zipped = allParams.zip(paramTypes)
50+
val (reifiedT, normalT) = zipped.partition(_._1.name.toString.startsWith("reified$"))
51+
val newParamTypes = normalT.map(_._2) ++ reifiedT.map(_._2)
52+
53+
if DEBUG then println(s"MoveReifiedParams: transformDefDef: old attachment: ${tree.attachment(MethodParameterReturnType)}, new attachment: ${(count, newParamTypes, retType)}")
54+
newTree.putAttachment(MethodParameterReturnType, (count, newParamTypes, retType))
55+
}
56+
newTree
57+
} else tree
58+
}
59+
60+
override def transformApply(tree: Apply)(using Context): Tree =
61+
val sym = tree.fun.symbol
62+
if (sym.is(Flags.Method)) {
63+
// Collect ALL parameter names from the potentially curried/generic type
64+
val allParamNames = atPhase(erasurePhase) {
65+
collectParamNames(sym.info)
66+
}
67+
68+
val args = tree.args
69+
// Now we can compare the full flattened argument list with the full parameter name list
70+
if (args.length == allParamNames.length) {
71+
val zipped = args.zip(allParamNames)
72+
val (reifiedArgs, normalArgs) = zipped.partition(_._2.toString.startsWith("reified$"))
73+
74+
if (reifiedArgs.nonEmpty) {
75+
val newArgs = normalArgs.map(_._1) ++ reifiedArgs.map(_._1)
76+
if DEBUG then println(s"MoveReifiedParams: transformApply: Reordering method arguments for ${sym} from\n" +
77+
s" ${args.map(_.show)}\n" +
78+
s" to ${newArgs.map(_.show)}")
79+
cpy.Apply(tree)(tree.fun, newArgs)
80+
} else tree
81+
} else tree
82+
} else tree
83+
84+
def collectParamNames(tp: Type)(using Context): List[Name] = tp match {
85+
case pt: PolyType => collectParamNames(pt.resType)
86+
case mt: MethodType => mt.paramNames ++ collectParamNames(mt.resType)
87+
case _ => Nil
88+
}
89+
}

0 commit comments

Comments
 (0)