From 753c534b1b2014d252e7562a39c3cd1cc16c8e76 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 13 Nov 2013 14:56:07 +0100 Subject: widen if unstable prefix --- src/dotty/tools/dotc/core/Decorators.scala | 7 +++++++ src/dotty/tools/dotc/core/Flags.scala | 4 ++++ src/dotty/tools/dotc/core/TypeComparer.scala | 10 +++++----- 3 files changed, 16 insertions(+), 5 deletions(-) (limited to 'src/dotty') diff --git a/src/dotty/tools/dotc/core/Decorators.scala b/src/dotty/tools/dotc/core/Decorators.scala index 7888d2f8c..eb287f411 100644 --- a/src/dotty/tools/dotc/core/Decorators.scala +++ b/src/dotty/tools/dotc/core/Decorators.scala @@ -98,6 +98,13 @@ object Decorators { (xs1 eq xs.tail)) xs else x1 :: xs1 } + + final def hasSameLengthAs[U](ys: List[U]): Boolean = { + @tailrec def loop(xs: List[T], ys: List[U]): Boolean = + if (xs.isEmpty) ys.isEmpty + else ys.nonEmpty && loop(xs.tail, ys.tail) + loop(xs, ys) + } } implicit class ListOfListDecorator[T](val xss: List[List[T]]) extends AnyVal { diff --git a/src/dotty/tools/dotc/core/Flags.scala b/src/dotty/tools/dotc/core/Flags.scala index 956b67ffb..70761ebf3 100644 --- a/src/dotty/tools/dotc/core/Flags.scala +++ b/src/dotty/tools/dotc/core/Flags.scala @@ -451,6 +451,10 @@ object Flags { /** An abstract class or a trait */ final val AbstractOrTrait = Abstract | Trait + /** A local symbol, or one which has an expanded name (type parameters go from one to the other). + */ + final val LocalOrExpanded = Local | ExpandedName + /** Labeled `private` or `protected[local]` */ final val PrivateOrLocal = Private | Local diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala index 241c0e899..42ecb7a2a 100644 --- a/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/src/dotty/tools/dotc/core/TypeComparer.scala @@ -310,7 +310,7 @@ class TypeComparer(initctx: Context) extends DotClass { case tp1 @ MethodType(_, formals2) => tp1.signature == tp2.signature && /*(if (newMatch) subsumeParams(formals1, formals2, tp1.isJava, tp2.isJava) - else */matchingParams(formals1, formals2, tp1.isJava, tp2.isJava)) && + else */matchingParams(formals1, formals2, tp1.isJava, tp2.isJava) && tp1.isImplicit == tp2.isImplicit && // needed? isSubType(tp1.resultType, tp2.resultType.subst(tp2, tp1)) case _ => @@ -674,8 +674,8 @@ class TypeComparer(initctx: Context) extends DotClass { } case tp1 @ MethodType(names1, formals1) => tp2 match { - case tp2 @ MethodType(names2, formals2) -/* if newMatch && (tp1.isImplicit == tp2.isImplicit) && formals1.hasSameLengthAs(formals2) => +/* case tp2 @ MethodType(names2, formals2) + if newMatch && (tp1.isImplicit == tp2.isImplicit) && formals1.hasSameLengthAs(formals2) => tp1.derivedMethodType( mergeNames(names1, names2, nme.syntheticParamName), (formals1 zipWithConserve formals2)(_ | _), @@ -748,8 +748,8 @@ class TypeComparer(initctx: Context) extends DotClass { } case tp1 @ MethodType(names1, formals1) => tp2 match { - case tp2 @ MethodType(names2, formals2) -/* if newMatch && (tp1.isImplicit == tp2.isImplicit) && formals1.hasSameLengthAs(formals2) => +/* case tp2 @ MethodType(names2, formals2) + if newMatch && (tp1.isImplicit == tp2.isImplicit) && formals1.hasSameLengthAs(formals2) => tp1.derivedMethodType( mergeNames(names1, names2, nme.syntheticParamName), (formals1 zipWithConserve formals2)(_ & _), -- cgit v1.2.3