aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/Decorators.scala7
-rw-r--r--src/dotty/tools/dotc/core/Flags.scala4
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala10
3 files changed, 16 insertions, 5 deletions
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)(_ & _),