aboutsummaryrefslogtreecommitdiff
path: root/src/dotty
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-07-21 18:31:32 +0200
committerMartin Odersky <odersky@gmail.com>2015-09-18 18:12:16 +0200
commit4148970a984de945c69f345381f0f03e84d7d6c2 (patch)
tree7b9427efb6604eebb5fa2ad503feb75592122007 /src/dotty
parent4aa1d5e1d9e4edfc1df6161504861840b24687ae (diff)
downloaddotty-4148970a984de945c69f345381f0f03e84d7d6c2.tar.gz
dotty-4148970a984de945c69f345381f0f03e84d7d6c2.tar.bz2
dotty-4148970a984de945c69f345381f0f03e84d7d6c2.zip
Generalize eta reduction to partially applied types.
Now also allows to reduce something like ([T] => Map[T, String]) to Map[_, String]
Diffstat (limited to 'src/dotty')
-rw-r--r--src/dotty/tools/dotc/core/TypeApplications.scala8
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala7
2 files changed, 13 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/core/TypeApplications.scala b/src/dotty/tools/dotc/core/TypeApplications.scala
index 062867353..5d856495b 100644
--- a/src/dotty/tools/dotc/core/TypeApplications.scala
+++ b/src/dotty/tools/dotc/core/TypeApplications.scala
@@ -506,9 +506,12 @@ class TypeApplications(val self: Type) extends AnyVal {
tp.refinedInfo match {
case TypeAlias(TypeRef(RefinedThis(rt), rname))
if (rname == tparam.name) && (rt eq self) =>
+ // todo: add bounds
etaCore(tp.parent, otherParams)
case _ =>
- NoType
+ val pcore = etaCore(tp.parent, tparams)
+ if (pcore.exists) tp.derivedRefinedType(pcore, tp.refinedName, tp.refinedInfo)
+ else NoType
}
case _ =>
NoType
@@ -518,7 +521,8 @@ class TypeApplications(val self: Type) extends AnyVal {
case self @ RefinedType(parent, tpnme.hkApply) =>
val lc = parent.LambdaClass(forcing = false)
self.refinedInfo match {
- case TypeAlias(alias) if lc.exists => etaCore(alias, lc.typeParams.reverse)
+ case TypeAlias(alias) if lc.exists =>
+ etaCore(alias, lc.typeParams.reverse)
case _ => NoType
}
case _ => NoType
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index eb1dcacdd..c9b1e8794 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -1232,5 +1232,12 @@ class ExplainingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
override def copyIn(ctx: Context) = new ExplainingTypeComparer(ctx)
+ override def compareHK(projection: NamedType, other: Type, inOrder: Boolean) =
+ if (projection.name == tpnme.hkApply)
+ traceIndented(i"compareHK $projection, $other, $inOrder") {
+ super.compareHK(projection, other, inOrder)
+ }
+ else super.compareHK(projection, other, inOrder)
+
override def toString = "Subtype trace:" + { try b.toString finally b.clear() }
}