aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/TypeComparer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-02-13 14:50:04 +0100
committerMartin Odersky <odersky@gmail.com>2014-02-13 14:50:04 +0100
commitc4bed34b009ffc54b1eac10ee75fba27040f1533 (patch)
tree956b51a53a1b0c5358cca63bf3f4ee47abb59c38 /src/dotty/tools/dotc/core/TypeComparer.scala
parent80acc2d331cf8359c00d9a15c8cc10d537be503a (diff)
downloaddotty-c4bed34b009ffc54b1eac10ee75fba27040f1533.tar.gz
dotty-c4bed34b009ffc54b1eac10ee75fba27040f1533.tar.bz2
dotty-c4bed34b009ffc54b1eac10ee75fba27040f1533.zip
Two performance optimizations
1) Split out wildApprox into separate function 2) Be more careful not to follow static prefix chains where not needed
Diffstat (limited to 'src/dotty/tools/dotc/core/TypeComparer.scala')
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala23
1 files changed, 11 insertions, 12 deletions
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index 1d2d4bac9..a8ad580a7 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -163,7 +163,8 @@ class TypeComparer(initctx: Context) extends DotClass {
*/
def approximation(param: PolyParam, fromBelow: Boolean): Type = {
val avoidParam = new TypeMap {
- override def apply(tp: Type) = mapOver {
+ override def stopAtStatic = true
+ def apply(tp: Type) = mapOver {
tp match {
case tp: RefinedType if param occursIn tp.refinedInfo => tp.parent
case _ => tp
@@ -269,18 +270,16 @@ class TypeComparer(initctx: Context) extends DotClass {
def compareNamed = tp1 match {
case tp1: NamedType =>
val sym1 = tp1.symbol
- val sym2 = tp2.symbol
- val pre1 = tp1.prefix
- val pre2 = tp2.prefix
-
- ( if (sym1 == sym2) (
- ctx.erasedTypes
+ ( if (sym1 == tp2.symbol) (
+ ctx.erasedTypes
|| sym1.isStaticOwner
- || isSubType(pre1, pre2)
- || pre1.isInstanceOf[ThisType] && pre2.isInstanceOf[ThisType]
- )
- else
- tp1.name == tp2.name && isSubType(pre1, pre2)
+ || { val pre1 = tp1.prefix
+ val pre2 = tp2.prefix
+ isSubType(pre1, pre2) ||
+ pre1.isInstanceOf[ThisType] && pre2.isInstanceOf[ThisType]
+ }
+ ) else
+ tp1.name == tp2.name && isSubType(tp1.prefix, tp2.prefix)
) || secondTryNamed(tp1, tp2)
case _ =>
secondTry(tp1, tp2)