summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@typesafe.com>2015-05-04 11:17:59 +0200
committerLukas Rytz <lukas.rytz@typesafe.com>2015-05-04 11:17:59 +0200
commit6c75bc40c71d8688fb62759b6e1a23e5e0ba5e93 (patch)
tree2368ed2115504180cea8dd112bd73ec96e62d8af /src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
parent9e29061fb75a71c271c5e0a9824aabe93bc269fe (diff)
parent3bf208fd26e0ff272e9aaf9e35446daac4a99901 (diff)
downloadscala-6c75bc40c71d8688fb62759b6e1a23e5e0ba5e93.tar.gz
scala-6c75bc40c71d8688fb62759b6e1a23e5e0ba5e93.tar.bz2
scala-6c75bc40c71d8688fb62759b6e1a23e5e0ba5e93.zip
Merge pull request #4463 from retronym/topic/indylambda-emit-indy
Use LambdaMetafactory where possible for lambda creation.
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
index 1a24c668ba..53a1347a48 100644
--- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
+++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
@@ -303,6 +303,17 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
}
}
+ def specializedFunctionName(sym: Symbol, args: List[Type]) = exitingSpecialize {
+ require(isFunctionSymbol(sym), sym)
+ val env: TypeEnv = TypeEnv.fromSpecialization(sym, args)
+ specializedClass.get((sym, env)) match {
+ case Some(x) =>
+ x.name
+ case None =>
+ sym.name
+ }
+ }
+
/** Return the specialized name of 'sym' in the given environment. It
* guarantees the same result regardless of the map order by sorting
* type variables alphabetically.
@@ -315,10 +326,14 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
if (sym.isClass) env.keySet
else specializedTypeVars(sym).intersect(env.keySet)
)
+ specializedName(sym.name, tvars, env)
+ }
+
+ private def specializedName(name: Name, tvars: immutable.Set[Symbol], env: TypeEnv): TermName = {
val (methparams, others) = tvars.toList sortBy ("" + _.name) partition (_.owner.isMethod)
// debuglog("specName(" + sym + ") env: " + env + " tvars: " + tvars)
- specializedName(sym.name, methparams map env, others map env)
+ specializedName(name, methparams map env, others map env)
}
/** Specialize name for the two list of types. The first one denotes