aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Definitions.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-03-17 20:12:16 +0100
committerMartin Odersky <odersky@gmail.com>2013-03-17 20:12:16 +0100
commit52d740d120cd197ee816aa0a06732ccdb5d5ab29 (patch)
tree6c6e7120ff879f72e8f7fa95b72ea5b7cdbe321c /src/dotty/tools/dotc/core/Definitions.scala
parent1d029f5f8f90a909ed140f7ef5cf656fafd9fc27 (diff)
downloaddotty-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.scala36
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]()