aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-12-02 15:42:56 +0100
committerMartin Odersky <odersky@gmail.com>2015-12-06 16:09:21 +0100
commit2abcd02d2a2067ba78430262664f5d3ab9b61d00 (patch)
tree4b9682b86fd860b8ca65aa88b0e14f41dfc7c7df /src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala
parent67d28339d91f912c2894a05110d713f077458feb (diff)
downloaddotty-2abcd02d2a2067ba78430262664f5d3ab9b61d00.tar.gz
dotty-2abcd02d2a2067ba78430262664f5d3ab9b61d00.tar.bz2
dotty-2abcd02d2a2067ba78430262664f5d3ab9b61d00.zip
Use new adaptArgs for Scala2Unpickler
Also: fix adaptArgs and LambdaTrait to make it work.
Diffstat (limited to 'src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala')
-rw-r--r--src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala46
1 files changed, 1 insertions, 45 deletions
diff --git a/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala b/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala
index cf7b487bb..747d73ea9 100644
--- a/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala
+++ b/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala
@@ -21,6 +21,7 @@ import typer.Mode
import PickleBuffer._
import scala.reflect.internal.pickling.PickleFormat._
import Decorators._
+import TypeApplications._
import classfile.ClassfileParser
import scala.collection.{ mutable, immutable }
import scala.collection.mutable.ListBuffer
@@ -142,51 +143,6 @@ object Scala2Unpickler {
denot.info = ClassInfo( // final info
denot.owner.thisType, denot.classSymbol, parentRefs, declsInRightOrder, ost)
}
-
- /** Adapt arguments to type parameters so that variance of type lambda arguments
- * agrees with variance of corresponding higherkinded type parameters. Example:
- *
- * class Companion[+CC[X]]
- * Companion[List]
- *
- * with adaptArgs, this will expand to
- *
- * Companion[[X] => List[X]]
- *
- * instead of
- *
- * Companion[[+X] => List[X]]
- *
- * even though `List` is covariant. This adaptation is necessary to ignore conflicting
- * variances in overriding members that have types of hk-type parameters such as `Companion[GenTraversable]`
- * or `Companion[ListBuffer]`. Without the adaptation we would end up with
- *
- * Companion[[+X] => GenTraversable[X]]
- * Companion[[X] => List[X]]
- *
- * and the second is not a subtype of the first. So if we have overridding memebrs of the two
- * types we get an error.
- */
- def adaptArgs(tparams: List[Symbol], args: List[Type])(implicit ctx: Context): List[Type] = tparams match {
- case tparam :: tparams1 =>
- val boundLambda = tparam.infoOrCompleter match {
- case TypeBounds(_, hi) => hi.LambdaClass(forcing = false)
- case _ => NoSymbol
- }
- def adaptArg(arg: Type): Type = arg match {
- case arg: TypeRef if arg.symbol.isLambdaTrait =>
- assert(arg.symbol.typeParams.length == boundLambda.typeParams.length)
- arg.prefix.select(boundLambda)
- case arg: RefinedType =>
- arg.derivedRefinedType(adaptArg(arg.parent), arg.refinedName, arg.refinedInfo)
- case _ =>
- arg
- }
- val arg = args.head
- val adapted = if (boundLambda.exists) adaptArg(arg) else arg
- adapted :: adaptArgs(tparams1, args.tail)
- case nil => args
- }
}
/** Unpickle symbol table information descending from a class and/or module root