aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Definitions.scala
diff options
context:
space:
mode:
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]()