Skip to content

Commit 72bf1ca

Browse files
authored
Merge pull request #3239 from dotty-staging/fix-#3213
Fix #3213: Make PolyTypes generative
2 parents da6d7c6 + ff03ed5 commit 72bf1ca

File tree

2 files changed

+45
-54
lines changed

2 files changed

+45
-54
lines changed

compiler/src/dotty/tools/dotc/core/Types.scala

+29-54
Original file line numberDiff line numberDiff line change
@@ -2599,57 +2599,8 @@ object Types {
25992599
final override def toString = s"$prefixString($paramNames, $paramInfos, $resType)"
26002600
}
26012601

2602-
abstract class HKLambda extends CachedProxyType with LambdaType {
2603-
final override def underlying(implicit ctx: Context) = resType
2604-
2605-
final override def computeHash = doHash(paramNames, resType, paramInfos)
2606-
2607-
// Defined here instead of in LambdaType for efficiency
2608-
final override def equals(that: Any) = that match {
2609-
case that: HKLambda =>
2610-
paramNames == that.paramNames &&
2611-
paramInfos == that.paramInfos &&
2612-
resType == that.resType &&
2613-
companion.eq(that.companion)
2614-
case _ =>
2615-
false
2616-
}
2617-
2618-
final override def eql(that: Type) = that match {
2619-
case that: HKLambda =>
2620-
paramNames.equals(that.paramNames) &&
2621-
paramInfos.equals(that.paramInfos) &&
2622-
resType.equals(that.resType) &&
2623-
companion.eq(that.companion)
2624-
case _ =>
2625-
false
2626-
}
2627-
}
2628-
2629-
abstract class MethodOrPoly extends CachedGroundType with LambdaType with MethodicType {
2630-
final override def computeHash = doHash(paramNames, resType, paramInfos)
2631-
2632-
// Defined here instead of in LambdaType for efficiency
2633-
final override def equals(that: Any) = that match {
2634-
case that: MethodOrPoly =>
2635-
paramNames == that.paramNames &&
2636-
paramInfos == that.paramInfos &&
2637-
resType == that.resType &&
2638-
companion.eq(that.companion)
2639-
case _ =>
2640-
false
2641-
}
2642-
2643-
final override def eql(that: Type) = that match {
2644-
case that: MethodOrPoly =>
2645-
paramNames.eqElements(that.paramNames) &&
2646-
paramInfos.eqElements(that.paramInfos) &&
2647-
resType.eq(that.resType) &&
2648-
companion.eq(that.companion)
2649-
case _ =>
2650-
false
2651-
}
2652-
}
2602+
trait HKLambda extends LambdaType
2603+
trait MethodOrPoly extends LambdaType with MethodicType
26532604

26542605
trait TermLambda extends LambdaType { thisLambdaType =>
26552606
import DepStatus._
@@ -2752,7 +2703,7 @@ object Types {
27522703
abstract case class MethodType(paramNames: List[TermName])(
27532704
paramInfosExp: MethodType => List[Type],
27542705
resultTypeExp: MethodType => Type)
2755-
extends MethodOrPoly with TermLambda with NarrowCached { thisMethodType =>
2706+
extends CachedGroundType with MethodOrPoly with TermLambda with NarrowCached { thisMethodType =>
27562707
import MethodType._
27572708

27582709
type This = MethodType
@@ -2764,6 +2715,28 @@ object Types {
27642715
def computeSignature(implicit ctx: Context): Signature =
27652716
resultSignature.prepend(paramInfos, isJava)
27662717

2718+
final override def computeHash = doHash(paramNames, resType, paramInfos)
2719+
2720+
final override def equals(that: Any) = that match {
2721+
case that: MethodType =>
2722+
paramNames == that.paramNames &&
2723+
paramInfos == that.paramInfos &&
2724+
resType == that.resType &&
2725+
companion.eq(that.companion)
2726+
case _ =>
2727+
false
2728+
}
2729+
2730+
final override def eql(that: Type) = that match {
2731+
case that: MethodType =>
2732+
paramNames.eqElements(that.paramNames) &&
2733+
paramInfos.eqElements(that.paramInfos) &&
2734+
resType.eq(that.resType) &&
2735+
companion.eq(that.companion)
2736+
case _ =>
2737+
false
2738+
}
2739+
27672740
protected def prefixString = "MethodType"
27682741
}
27692742

@@ -2936,7 +2909,7 @@ object Types {
29362909
*/
29372910
class HKTypeLambda(val paramNames: List[TypeName])(
29382911
paramInfosExp: HKTypeLambda => List[TypeBounds], resultTypeExp: HKTypeLambda => Type)
2939-
extends HKLambda with TypeLambda {
2912+
extends UncachedProxyType with HKLambda with TypeLambda {
29402913
type This = HKTypeLambda
29412914
def companion = HKTypeLambda
29422915

@@ -2946,6 +2919,8 @@ object Types {
29462919
assert(resType.isInstanceOf[TermType], this)
29472920
assert(paramNames.nonEmpty)
29482921

2922+
final override def underlying(implicit ctx: Context) = resType
2923+
29492924
protected def prefixString = "HKTypeLambda"
29502925
}
29512926

@@ -2954,7 +2929,7 @@ object Types {
29542929
*/
29552930
class PolyType(val paramNames: List[TypeName])(
29562931
paramInfosExp: PolyType => List[TypeBounds], resultTypeExp: PolyType => Type)
2957-
extends MethodOrPoly with TypeLambda {
2932+
extends UncachedGroundType with MethodOrPoly with TypeLambda {
29582933

29592934
type This = PolyType
29602935
def companion = PolyType

tests/pos/i2981.scala

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
trait HList
2+
trait HNil extends HList
3+
4+
trait FromTraversable[Out <: HList]
5+
object FromTraversable {
6+
implicit def hnilFromTraversable[T]: FromTraversable[HNil] =
7+
new FromTraversable[HNil]{}
8+
}
9+
10+
object Filter {
11+
def apply[A <: HList, O <: HList]()(implicit ftA: FromTraversable[A],
12+
ftO: FromTraversable[O]): Unit = ()
13+
}
14+
object Main {
15+
def main = Filter[HNil, HNil]()
16+
}

0 commit comments

Comments
 (0)