diff options
author | Martin Odersky <odersky@gmail.com> | 2014-06-12 14:50:05 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-06-12 15:35:57 +0200 |
commit | 96196c9ffa9939acd7437103d1621dac96e9abc6 (patch) | |
tree | ca87d4f694e47e453ad4d791cff80adb4cf3bbe4 /src/dotty/tools/dotc/core/Definitions.scala | |
parent | 51563aee5478f90a0f86c29385f74d020b8995dd (diff) | |
download | dotty-96196c9ffa9939acd7437103d1621dac96e9abc6.tar.gz dotty-96196c9ffa9939acd7437103d1621dac96e9abc6.tar.bz2 dotty-96196c9ffa9939acd7437103d1621dac96e9abc6.zip |
Names and definitions for Lambdas
Adding names and definitions for the Lambda scheme to hk types.
Also add HigherKinded flag for HK type parameters and abstract types.
Diffstat (limited to 'src/dotty/tools/dotc/core/Definitions.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/Definitions.scala | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala index 6f34efc8b..3f567d87a 100644 --- a/src/dotty/tools/dotc/core/Definitions.scala +++ b/src/dotty/tools/dotc/core/Definitions.scala @@ -422,7 +422,7 @@ class Definitions { def functionArity(tp: Type) = tp.dealias.argInfos.length - 1 // ----- Higher kinds machinery ------------------------------------------ - + // tbr private var _hkTraits: Set[Symbol] = Set() /** The set of HigherKindedXYZ traits encountered so far */ @@ -476,6 +476,66 @@ class Definitions { hkTraitOfArity.getOrElseUpdate(vcs, createTrait) } + // ----- LambdaXYZ traits ------------------------------------------ + + private var myLambdaTraits: Set[Symbol] = Set() + + /** The set of HigherKindedXYZ traits encountered so far */ + def lambdaTraits: Set[Symbol] = myLambdaTraits + + private var lambdaTraitForVariances = mutable.Map[List[Int], ClassSymbol]() + + /** The HigherKinded trait corresponding to symbols `boundSyms` (which are assumed + * to be the type parameters of a higher-kided type). This is a class symbol that + * would be generated by the following schema. + * + * class LambdaXYZ { type v_1 Arg1; ...; type v_N ArgN; type Apply } + * + * Here: + * + * - XYZ is a string of length N with one letter for each variant of a bound symbols, + * using `P` (positive variance), `N` (negative variance), `I` (invariant). + * - v_i are the variances of the bound symbols (i.e. +, -, or empty). + */ + def lambdaTrait(vcs: List[Int]): ClassSymbol = { + assert(vcs.nonEmpty) + + def varianceFlags(v: Int) = v match { + case -1 => Contravariant + case 0 => EmptyFlags + case 1 => Covariant + } + + val completer = new LazyType { + def complete(denot: SymDenotation)(implicit ctx: Context): Unit = { + val cls = denot.asClass.classSymbol + val paramDecls = newScope + for (i <- 0 until vcs.length) + newTypeParam(cls, tpnme.lambdaArgName(i), varianceFlags(vcs(i)), paramDecls) + newTypeParam(cls, tpnme.Apply, EmptyFlags, paramDecls) + val parentTraitRefs = + for (i <- 0 until vcs.length if vcs(i) != 0) + yield lambdaTrait(vcs.updated(i, 0)).typeRef + denot.info = ClassInfo( + ScalaPackageClass.thisType, cls, ObjectClass.typeRef :: parentTraitRefs.toList, paramDecls) + } + } + + val traitName = tpnme.lambdaTraitName(vcs) + + def createTrait = { + val cls = newClassSymbol( + ScalaPackageClass, + traitName, + Trait | Interface | Synthetic, + completer) + myLambdaTraits += cls + cls + } + + lambdaTraitForVariances.getOrElseUpdate(vcs, createTrait) + } + // ----- primitive value class machinery ------------------------------------------ lazy val ScalaNumericValueClasses: collection.Set[Symbol] = Set( |