aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Definitions.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-06-12 14:50:05 +0200
committerMartin Odersky <odersky@gmail.com>2014-06-12 15:35:57 +0200
commit96196c9ffa9939acd7437103d1621dac96e9abc6 (patch)
treeca87d4f694e47e453ad4d791cff80adb4cf3bbe4 /src/dotty/tools/dotc/core/Definitions.scala
parent51563aee5478f90a0f86c29385f74d020b8995dd (diff)
downloaddotty-96196c9ffa9939acd7437103d1621dac96e9abc6.tar.gz
dotty-96196c9ffa9939acd7437103d1621dac96e9abc6.tar.bz2
dotty-96196c9ffa9939acd7437103d1621dac96e9abc6.zip
Names and definitions for Lambdas
Adding names and definitions for the Lambda scheme to hk types. Also add HigherKinded flag for HK type parameters and abstract types.
Diffstat (limited to 'src/dotty/tools/dotc/core/Definitions.scala')
-rw-r--r--src/dotty/tools/dotc/core/Definitions.scala62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala
index 6f34efc8b..3f567d87a 100644
--- a/src/dotty/tools/dotc/core/Definitions.scala
+++ b/src/dotty/tools/dotc/core/Definitions.scala
@@ -422,7 +422,7 @@ class Definitions {
def functionArity(tp: Type) = tp.dealias.argInfos.length - 1
// ----- Higher kinds machinery ------------------------------------------
-
+ // tbr
private var _hkTraits: Set[Symbol] = Set()
/** The set of HigherKindedXYZ traits encountered so far */
@@ -476,6 +476,66 @@ class Definitions {
hkTraitOfArity.getOrElseUpdate(vcs, createTrait)
}
+ // ----- LambdaXYZ traits ------------------------------------------
+
+ private var myLambdaTraits: Set[Symbol] = Set()
+
+ /** The set of HigherKindedXYZ traits encountered so far */
+ def lambdaTraits: Set[Symbol] = myLambdaTraits
+
+ private var lambdaTraitForVariances = mutable.Map[List[Int], ClassSymbol]()
+
+ /** The HigherKinded trait corresponding to symbols `boundSyms` (which are assumed
+ * to be the type parameters of a higher-kided type). This is a class symbol that
+ * would be generated by the following schema.
+ *
+ * class LambdaXYZ { type v_1 Arg1; ...; type v_N ArgN; type Apply }
+ *
+ * Here:
+ *
+ * - XYZ is a string of length N with one letter for each variant of a bound symbols,
+ * using `P` (positive variance), `N` (negative variance), `I` (invariant).
+ * - v_i are the variances of the bound symbols (i.e. +, -, or empty).
+ */
+ def lambdaTrait(vcs: List[Int]): ClassSymbol = {
+ assert(vcs.nonEmpty)
+
+ def varianceFlags(v: Int) = v match {
+ case -1 => Contravariant
+ case 0 => EmptyFlags
+ case 1 => Covariant
+ }
+
+ val completer = new LazyType {
+ def complete(denot: SymDenotation)(implicit ctx: Context): Unit = {
+ val cls = denot.asClass.classSymbol
+ val paramDecls = newScope
+ for (i <- 0 until vcs.length)
+ newTypeParam(cls, tpnme.lambdaArgName(i), varianceFlags(vcs(i)), paramDecls)
+ newTypeParam(cls, tpnme.Apply, EmptyFlags, paramDecls)
+ val parentTraitRefs =
+ for (i <- 0 until vcs.length if vcs(i) != 0)
+ yield lambdaTrait(vcs.updated(i, 0)).typeRef
+ denot.info = ClassInfo(
+ ScalaPackageClass.thisType, cls, ObjectClass.typeRef :: parentTraitRefs.toList, paramDecls)
+ }
+ }
+
+ val traitName = tpnme.lambdaTraitName(vcs)
+
+ def createTrait = {
+ val cls = newClassSymbol(
+ ScalaPackageClass,
+ traitName,
+ Trait | Interface | Synthetic,
+ completer)
+ myLambdaTraits += cls
+ cls
+ }
+
+ lambdaTraitForVariances.getOrElseUpdate(vcs, createTrait)
+ }
+
// ----- primitive value class machinery ------------------------------------------
lazy val ScalaNumericValueClasses: collection.Set[Symbol] = Set(