diff options
author | Martin Odersky <odersky@gmail.com> | 2013-06-07 22:45:56 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-06-07 22:46:26 +0200 |
commit | 4124ff23501eb8d30f0aa873bb3ea79115812f82 (patch) | |
tree | d387acd52a0655a3bf6ce3f6d309972de0ae8f99 /src/dotty/tools/dotc/core/Definitions.scala | |
parent | 27ce72f1b30a06f56782d88c6c4f96d261d4a44e (diff) | |
download | dotty-4124ff23501eb8d30f0aa873bb3ea79115812f82.tar.gz dotty-4124ff23501eb8d30f0aa873bb3ea79115812f82.tar.bz2 dotty-4124ff23501eb8d30f0aa873bb3ea79115812f82.zip |
Integrated new treatment of higher-kinded types with Unpickler.
Could drop quite a bit of code in the process.
Diffstat (limited to 'src/dotty/tools/dotc/core/Definitions.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/Definitions.scala | 81 |
1 files changed, 27 insertions, 54 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala index ae8b7887f..9d7f84449 100644 --- a/src/dotty/tools/dotc/core/Definitions.scala +++ b/src/dotty/tools/dotc/core/Definitions.scala @@ -289,39 +289,10 @@ class Definitions(implicit ctx: Context) { // ----- Higher kinds machinery ------------------------------------------ private var _hkTraits: Set[Symbol] = Set() - private var _hkTrait: Map[Int, ClassSymbol] = Map() - /** The set of all `HigherKinded_n` traits that are referred to in thos compilation run. */ + /** The set of HigherKindedXYZ traits encountered so far */ def hkTraits: Set[Symbol] = _hkTraits - /** A trait `HigherKinded_n[B1, ..., Bn]` that represents - * the bounds of a higher-kinded type. - */ - 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, "B"+i).setFlag(Covariant) - denot.info = ClassInfo(ScalaPackageClass.thisType, cls, List(ObjectClass.typeConstructor), paramDecls) - } - } - _hkTrait get n match { - case Some(cls) => - cls - case None => - val cls = ctx.newClassSymbol( - ScalaPackageClass, - tpnme.higherKindedTraitName(n), - Trait | Interface | Synthetic, - completer).entered - _hkTraits += cls - _hkTrait = _hkTrait.updated(n, cls) - cls - } - } - private var hkTraitOfArity = mutable.Map[List[Int], ClassSymbol]() /** The HigherKinded trait corresponding to symbols `boundSyms` (which are assumed @@ -337,45 +308,47 @@ class Definitions(implicit ctx: Context) { * - v_i are the variances of the bound symbols (i.e. +, -, or empty). * - _$hk$i are hgiher-kinded parameter names, which are special treated in type application. */ - def hkTrait(boundSyms: List[Symbol]) = { + def hkTrait(variances: List[Int]) = { + + def varianceSuffix(v: Int) = v match { + case -1 => "N" + case 0 => "I" + case 1 => "P" + } + + def varianceFlags(v: Int)= v match { + case -1 => Contravariant + case 0 => Covariant + case 1 => EmptyFlags + } val completer = new LazyType { def complete(denot: SymDenotation): Unit = { val cls = denot.asClass.classSymbol val paramDecls = newScope - for ((bsym, i) <- boundSyms.zipWithIndex) - newTypeParam(cls, tpnme.higherKindedParamName(i), bsym.flags & VarianceFlags, paramDecls) + for ((v, i) <- variances.zipWithIndex) + newTypeParam(cls, tpnme.higherKindedParamName(i), varianceFlags(v), paramDecls) denot.info = ClassInfo(ScalaPackageClass.thisType, cls, List(ObjectClass.typeConstructor), paramDecls) } } - def varianceSuffix(v: Int) = v match { - case -1 => "N" - case 0 => "I" - case 1 => "P" - } - - val variances = boundSyms map (_.variance) val traitName = - tpnme.higherKindedTraitName(boundSyms.length) ++ (variances map varianceSuffix).mkString - - def createTrait = ctx.newClassSymbol( - ScalaPackageClass, - traitName, - Trait | Interface | Synthetic, - completer).entered + tpnme.higherKindedTraitName(variances.length) ++ (variances map varianceSuffix).mkString + + def createTrait = { + val cls = ctx.newClassSymbol( + ScalaPackageClass, + traitName, + Trait | Interface | Synthetic, + completer).entered + _hkTraits += cls + cls + } hkTraitOfArity.getOrElseUpdate(variances, createTrait) } - /** 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 ------------------------------------------ lazy val ScalaValueClasses: collection.Set[Symbol] = Set( |