diff options
author | Martin Odersky <odersky@gmail.com> | 2015-07-21 18:31:32 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-09-18 18:12:16 +0200 |
commit | 4148970a984de945c69f345381f0f03e84d7d6c2 (patch) | |
tree | 7b9427efb6604eebb5fa2ad503feb75592122007 /src | |
parent | 4aa1d5e1d9e4edfc1df6161504861840b24687ae (diff) | |
download | dotty-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')
-rw-r--r-- | src/dotty/tools/dotc/core/TypeApplications.scala | 8 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/TypeComparer.scala | 7 |
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() } } |