Skip to content

Commit 3df75d5

Browse files
committed
Fix ordering of specialized names and type parameterized apply
1 parent 22cffc2 commit 3df75d5

File tree

2 files changed

+37
-32
lines changed

2 files changed

+37
-32
lines changed

compiler/src/dotty/tools/dotc/core/NameOps.scala

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -291,23 +291,24 @@ object NameOps {
291291
case nme.clone_ => nme.clone_
292292
}
293293

294-
def specializedFor(classTargs: List[Types.Type], classTargsNames: List[Name], methodTargs: List[Types.Type], methodTarsNames: List[Name])(implicit ctx: Context): name.ThisName = {
295-
296-
def typeToTag(tp: Types.Type): Name = {
297-
tp.classSymbol match {
298-
case t if t eq defn.IntClass => nme.specializedTypeNames.Int
299-
case t if t eq defn.BooleanClass => nme.specializedTypeNames.Boolean
300-
case t if t eq defn.ByteClass => nme.specializedTypeNames.Byte
301-
case t if t eq defn.LongClass => nme.specializedTypeNames.Long
302-
case t if t eq defn.ShortClass => nme.specializedTypeNames.Short
303-
case t if t eq defn.FloatClass => nme.specializedTypeNames.Float
304-
case t if t eq defn.UnitClass => nme.specializedTypeNames.Void
305-
case t if t eq defn.DoubleClass => nme.specializedTypeNames.Double
306-
case t if t eq defn.CharClass => nme.specializedTypeNames.Char
307-
case _ => nme.specializedTypeNames.Object
308-
}
294+
private def typeToTag(tp: Types.Type)(implicit ctx: Context): Name =
295+
tp.classSymbol match {
296+
case t if t eq defn.IntClass => nme.specializedTypeNames.Int
297+
case t if t eq defn.BooleanClass => nme.specializedTypeNames.Boolean
298+
case t if t eq defn.ByteClass => nme.specializedTypeNames.Byte
299+
case t if t eq defn.LongClass => nme.specializedTypeNames.Long
300+
case t if t eq defn.ShortClass => nme.specializedTypeNames.Short
301+
case t if t eq defn.FloatClass => nme.specializedTypeNames.Float
302+
case t if t eq defn.UnitClass => nme.specializedTypeNames.Void
303+
case t if t eq defn.DoubleClass => nme.specializedTypeNames.Double
304+
case t if t eq defn.CharClass => nme.specializedTypeNames.Char
305+
case _ => nme.specializedTypeNames.Object
309306
}
310307

308+
/** This method is to be used on type parameters from a class, since this
309+
* method does sorting based on their names
310+
*/
311+
def specializedFor(classTargs: List[Types.Type], classTargsNames: List[Name], methodTargs: List[Types.Type], methodTarsNames: List[Name])(implicit ctx: Context): name.ThisName = {
311312
val methodTags: Seq[Name] = (methodTargs zip methodTarsNames).sortBy(_._2).map(x => typeToTag(x._1))
312313
val classTags: Seq[Name] = (classTargs zip classTargsNames).sortBy(_._2).map(x => typeToTag(x._1))
313314

@@ -316,6 +317,18 @@ object NameOps {
316317
classTags.fold(nme.EMPTY)(_ ++ _) ++ nme.specializedTypeNames.suffix)
317318
}
318319

320+
/** Use this method if you are **not** creating specialized name from type
321+
* parameters. The order of names will be:
322+
*
323+
* `<return type><first type><second type><...>`
324+
*/
325+
def specializedFor(args: List[Types.Type], ret: Types.Type)(implicit ctx: Context): name.ThisName =
326+
name.fromName {
327+
name ++ nme.specializedTypeNames.prefix ++
328+
nme.specializedTypeNames.separator ++ typeToTag(ret) ++
329+
args.map(typeToTag).fold(nme.EMPTY)(_ ++ _) ++ nme.specializedTypeNames.suffix
330+
}
331+
319332
/** If name length exceeds allowable limit, replace part of it by hash */
320333
def compactified(implicit ctx: Context): TermName = termName(compactify(name.toString))
321334
}

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

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ class SpecializedApplyMethods extends MiniPhaseTransform with InfoTransformer {
3030

3131
private def init()(implicit ctx: Context): Unit = if (func0Applys eq null) {
3232
def specApply(sym: Symbol, ret: Type, args: List[Type])(implicit ctx: Context) = {
33-
val all = args :+ ret
34-
val name = nme.apply.specializedFor(all, all.map(_.typeSymbol.name), Nil, Nil)
33+
val name = nme.apply.specializedFor(args, ret)
3534
ctx.newSymbol(sym, name, Flags.Method, MethodType(args, ret))
3635
}
3736

@@ -164,20 +163,13 @@ class SpecializedApplyMethods extends MiniPhaseTransform with InfoTransformer {
164163
else Nil
165164

166165
if (additionalSymbols eq Nil) tree
167-
else {
168-
val newBody: List[Tree] = tree.body ++ additionalSymbols.map { applySym =>
169-
polyDefDef(applySym.asTerm, tparams => vparamss => {
170-
val prefix = This(owner.asClass).select(nme.apply).appliedToTypes(vparamss.head.map(_.tpe))
171-
val argTypess = prefix.tpe.widen.paramTypess
172-
173-
val argss = Collections.map2(vparamss, argTypess) { (vparams, argTypes) =>
174-
Collections.map2(vparams, argTypes) { (vparam, argType) => vparam.ensureConforms(argType) }
175-
}
176-
prefix.appliedToArgss(argss).ensureConforms(applySym.info.finalResultType)
177-
})
178-
}
179-
180-
cpy.Template(tree)(body = newBody)
181-
}
166+
else cpy.Template(tree)(body = tree.body ++ additionalSymbols.map { apply =>
167+
DefDef(apply.asTerm, { vparamss =>
168+
This(owner.asClass)
169+
.select(nme.apply)
170+
.appliedToArgss(vparamss)
171+
.ensureConforms(apply.info.finalResultType)
172+
})
173+
})
182174
}
183175
}

0 commit comments

Comments
 (0)