diff options
author | Martin Odersky <odersky@gmail.com> | 2013-03-18 22:05:26 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-03-18 22:05:26 +0100 |
commit | eb2b6bf420b24ac0307e17fc9fec38e91012d1af (patch) | |
tree | a49d5b4f45f78ec96006b18816b69ed30c8a745e /src/dotty/tools/dotc/core/Definitions.scala | |
parent | 830e511b6b620716d3f550a199d0a5c52c95423a (diff) | |
download | dotty-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.scala | 41 |
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]() |