diff options
author | Martin Odersky <odersky@gmail.com> | 2013-03-17 20:12:16 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-03-17 20:12:16 +0100 |
commit | 52d740d120cd197ee816aa0a06732ccdb5d5ab29 (patch) | |
tree | 6c6e7120ff879f72e8f7fa95b72ea5b7cdbe321c /src/dotty/tools/dotc/core/Definitions.scala | |
parent | 1d029f5f8f90a909ed140f7ef5cf656fafd9fc27 (diff) | |
download | dotty-52d740d120cd197ee816aa0a06732ccdb5d5ab29.tar.gz dotty-52d740d120cd197ee816aa0a06732ccdb5d5ab29.tar.bz2 dotty-52d740d120cd197ee816aa0a06732ccdb5d5ab29.zip |
Added emulation of higher-kinded types.
Also improvements to toString.
Diffstat (limited to 'src/dotty/tools/dotc/core/Definitions.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/Definitions.scala | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala index ded45548d..471510e6f 100644 --- a/src/dotty/tools/dotc/core/Definitions.scala +++ b/src/dotty/tools/dotc/core/Definitions.scala @@ -22,7 +22,7 @@ class Definitions(implicit ctx: Context) { private def newSyntheticTypeParam(cls: ClassSymbol, scope: MutableScope, suffix: String = "T0") = { val tname = suffix.toTypeName.expandedName(cls) - val tparam = ctx.newSymbol(cls, tname, TypeParamCreationFlags, TypeBounds.empty) + val tparam = ctx.newSymbol(cls, tname, TypeParamCreationFlags | ExpandedName, TypeBounds.empty) scope.enter(tparam) } @@ -202,6 +202,40 @@ class Definitions(implicit ctx: Context) { lazy val PhantomClasses = Set[Symbol](AnyClass, AnyValClass, NullClass, NothingClass) + 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() + + def hkTraits: Set[Symbol] = _hkTraits + def hkParamNames = _hkParamNames + def hkParamArity = _hkParamArity + + def hkTrait(n: Int): ClassSymbol = { + val completer = new LazyType { + def complete(denot: SymDenotation): Unit = { + val cls = denot.asClass.classSymbol + val paramDecls = newScope + for (i <- 0 until n) { + newSyntheticTypeParam(cls, paramDecls, "Lo"+i) + newSyntheticTypeParam(cls, paramDecls, "Hi"+i) + } + denot.info = ClassInfo(ScalaPackageClass.thisType, cls, List(ObjectClass.typeConstructor), paramDecls) + } + } + _hkTraitOfArity get n match { + case Some(cls) => cls + case None => + val cls = ctx.newClassSymbol(ScalaPackageClass, tpnme.higherKindedTraitName(n), Synthetic, completer).entered + _hkTraits += cls + _hkTraitOfArity = _hkTraitOfArity.updated(n, cls) + val paramName = tpnme.higherKindedParamName(n) + _hkParamNames += paramName + _hkParamArity = _hkParamArity.updated(paramName, n) + cls + } + } + // ----- Value class machinery ------------------------------------------ private[this] val _boxedClass = mutable.Map[Symbol, Symbol]() |