aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Definitions.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-03-18 22:05:26 +0100
committerMartin Odersky <odersky@gmail.com>2013-03-18 22:05:26 +0100
commiteb2b6bf420b24ac0307e17fc9fec38e91012d1af (patch)
treea49d5b4f45f78ec96006b18816b69ed30c8a745e /src/dotty/tools/dotc/core/Definitions.scala
parent830e511b6b620716d3f550a199d0a5c52c95423a (diff)
downloaddotty-eb2b6bf420b24ac0307e17fc9fec38e91012d1af.tar.gz
dotty-eb2b6bf420b24ac0307e17fc9fec38e91012d1af.tar.bz2
dotty-eb2b6bf420b24ac0307e17fc9fec38e91012d1af.zip
More changes for higher-kinded types emulation.
Diffstat (limited to 'src/dotty/tools/dotc/core/Definitions.scala')
-rw-r--r--src/dotty/tools/dotc/core/Definitions.scala41
1 files changed, 26 insertions, 15 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala
index c728493dd..3d3a10d8e 100644
--- a/src/dotty/tools/dotc/core/Definitions.scala
+++ b/src/dotty/tools/dotc/core/Definitions.scala
@@ -136,6 +136,9 @@ class Definitions(implicit ctx: Context) {
// Annotation classes
lazy val AliasAnnot = requiredClass("dotty.annotation.internal.Alias")
lazy val ChildAnnot = requiredClass("dotty.annotation.internal.Child")
+ lazy val InvariantBetweenClass = requiredClass("dotty.annotation.internal.InvariantBetween")
+ lazy val CovariantBetweenClass = requiredClass("dotty.annotation.internal.CovariantBetween")
+ lazy val ContravariantBetweenClass = requiredClass("dotty.annotation.internal.ContravariantBetween")
lazy val ScalaSignatureAnnot = requiredClass("scala.reflect.ScalaSignature")
lazy val ScalaLongSignatureAnnot = requiredClass("scala.reflect.ScalaLongSignature")
lazy val DeprecatedAnnot = requiredClass("scala.deprecated")
@@ -202,16 +205,15 @@ class Definitions(implicit ctx: Context) {
lazy val PhantomClasses = Set[Symbol](AnyClass, AnyValClass, NullClass, NothingClass)
+ // ----- Higher kinds machinery ------------------------------------------
+
private var _hkTraits: Set[Symbol] = Set()
- private var _hkTraitOfArity: Map[Int, ClassSymbol] = Map()
- private var _hkParamNames: Set[Name] = Set()
- private var _hkParamArity: Map[Name, Int] = Map()
+ private var _hkTrait: Map[Int, ClassSymbol] = Map()
+ /** The set of all `HigherKinded_n` traits that are referred to in thos compilation run. */
def hkTraits: Set[Symbol] = _hkTraits
- def hkParamNames = _hkParamNames
- def hkParamArity = _hkParamArity
- /** A trait `HigherKinded[Lo_1,...,Lo_n,Hi_1,...,Hi_n]` that represents
+ /** A trait `HigherKinded_n[B1, ..., Bn]` that represents
* the bounds of a higher-kinded type.
*/
def hkTrait(n: Int): ClassSymbol = {
@@ -219,24 +221,33 @@ class Definitions(implicit ctx: Context) {
def complete(denot: SymDenotation): Unit = {
val cls = denot.asClass.classSymbol
val paramDecls = newScope
- for (i <- 0 until n) newSyntheticTypeParam(cls, paramDecls, "Lo"+i)
- for (i <- 0 until n) newSyntheticTypeParam(cls, paramDecls, "Hi"+i)
+ for (i <- 0 until n)
+ newSyntheticTypeParam(cls, paramDecls, "B"+i).setFlag(Covariant)
denot.info = ClassInfo(ScalaPackageClass.thisType, cls, List(ObjectClass.typeConstructor), paramDecls)
}
}
- _hkTraitOfArity get n match {
- case Some(cls) => cls
+ _hkTrait get n match {
+ case Some(cls) =>
+ cls
case None =>
- val cls = ctx.newClassSymbol(ScalaPackageClass, tpnme.higherKindedTraitName(n), Synthetic, completer).entered
+ val cls = ctx.newClassSymbol(
+ ScalaPackageClass,
+ tpnme.higherKindedTraitName(n),
+ Trait | Interface | Synthetic,
+ completer).entered
_hkTraits += cls
- _hkTraitOfArity = _hkTraitOfArity.updated(n, cls)
- val paramName = tpnme.higherKindedParamName(n)
- _hkParamNames += paramName
- _hkParamArity = _hkParamArity.updated(paramName, n)
+ _hkTrait = _hkTrait.updated(n, cls)
cls
}
}
+ /** The bounds trait corresponding to the given variance */
+ def hkBoundsClass(variance: Int) = variance match {
+ case 0 => InvariantBetweenClass
+ case 1 => CovariantBetweenClass
+ case -1 => ContravariantBetweenClass
+ }
+
// ----- Value class machinery ------------------------------------------
private[this] val _boxedClass = mutable.Map[Symbol, Symbol]()