summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2010-06-03 15:24:04 +0000
committerIulian Dragos <jaguarul@gmail.com>2010-06-03 15:24:04 +0000
commit043889d581d9b4403764bdf407dae0405dcc6818 (patch)
tree4a864eb8ea4350240dc2decf2bd3e456a827143f /src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
parentcb6db4169a6ccd3566bac8dfaf1be99ba1dbf7e3 (diff)
downloadscala-043889d581d9b4403764bdf407dae0405dcc6818.tar.gz
scala-043889d581d9b4403764bdf407dae0405dcc6818.tar.bz2
scala-043889d581d9b4403764bdf407dae0405dcc6818.zip
Closes #3499, double definition with specialized.
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
index c4ce7fe6e2..32b8969828 100644
--- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
+++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
@@ -212,11 +212,11 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
*/
private def specializedName(sym: Symbol, env: TypeEnv): Name = {
val tvars = if (sym.isClass) env.keySet
- else specializedTypeVars(sym.info).intersect(env.keySet)
+ else specializedTypeVars(sym).intersect(env.keySet)
val (methparams, others) = tvars.toList.partition(_.owner.isMethod)
val tvars1 = methparams sortBy (_.name.toString)
val tvars2 = others sortBy (_.name.toString)
- if (settings.debug.value) log("specName(" + sym + ") env " + env)
+ if (settings.debug.value) log("specName(%s) env: %s tvars: %s ".format(sym, env, (tvars1, tvars2)))
specializedName(sym.name, tvars1 map env, tvars2 map env)
}
@@ -324,8 +324,10 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
*/
def specializedTypeVars(tpe: Type): immutable.Set[Symbol] = tpe match {
case TypeRef(pre, sym, args) =>
- if ( sym.isTypeParameter && sym.hasAnnotation(SpecializedClass)
- || (sym.isTypeSkolem && sym.deSkolemize.hasAnnotation(SpecializedClass)))
+ if (sym.isAliasType)
+ specializedTypeVars(tpe.normalize)
+ else if ( sym.isTypeParameter && sym.hasAnnotation(SpecializedClass)
+ || (sym.isTypeSkolem && sym.deSkolemize.hasAnnotation(SpecializedClass)))
immutable.ListSet.empty + sym
else if (sym == definitions.ArrayClass)
specializedTypeVars(args)
@@ -655,12 +657,13 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
if (sym.hasFlag(PRIVATE)) sym.resetFlag(PRIVATE).setFlag(PROTECTED)
val specMember = subst(outerEnv)(specializedOverload(owner, sym, spec))
typeEnv(specMember) = typeEnv(sym) ++ outerEnv ++ spec
+ if (settings.debug.value) log("added specialized overload: %s in env: %s".format(specMember, typeEnv(specMember)))
overloads(sym) = Overload(specMember, spec) :: overloads(sym)
specMember
}
if (sym.isMethod) {
-// log("specializeMember " + sym + " with own stps: " + specializedTypes(sym.info.typeParams))
+ if (settings.debug.value) log("specializeMember %s with tps: %s stvars(sym): %s".format(sym, tps, specializedTypeVars(sym)))
val tps1 = if (sym.isConstructor) tps filter (tp => sym.info.paramTypes.contains(tp)) else tps
val tps2 = tps1 intersect specializedTypeVars(sym).toList
if (!sym.isDeferred) concreteSpecMethods += sym