aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/Definitions.scala3
-rw-r--r--src/dotty/tools/dotc/typer/Applications.scala4
2 files changed, 5 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala
index ebd99ad6c..96e4f0138 100644
--- a/src/dotty/tools/dotc/core/Definitions.scala
+++ b/src/dotty/tools/dotc/core/Definitions.scala
@@ -318,6 +318,9 @@ class Definitions(implicit ctx: Context) {
arity <= MaxTupleArity && (tp isRef TupleClass(arity))
}
+ def isProductSubType(tp: Type) =
+ (tp derivesFrom ProductClass) && tp.baseClasses.exists(ProductClasses contains _)
+
def isFunctionType(tp: Type) = {
val arity = tp.dealias.typeArgs.length - 1
0 <= arity && arity <= MaxFunctionArity && (tp isRef FunctionClass(arity))
diff --git a/src/dotty/tools/dotc/typer/Applications.scala b/src/dotty/tools/dotc/typer/Applications.scala
index 4202e05e1..ad6bdd787 100644
--- a/src/dotty/tools/dotc/typer/Applications.scala
+++ b/src/dotty/tools/dotc/typer/Applications.scala
@@ -612,13 +612,13 @@ trait Applications extends Compatibility { self: Typer =>
}
def seqSelector = defn.RepeatedParamType.appliedTo(unapplyResult.elemType :: Nil)
def getSelectors(tp: Type): List[Type] =
- if (tp derivesFrom defn.ProductClass) productSelectors(tp) else tp :: Nil
+ if (defn.isProductSubType(tp)) productSelectors(tp) else tp :: Nil
def getTp = extractorMemberType(unapplyResult, nme.get)
// println(s"unapply $unapplyResult ${extractorMemberType(unapplyResult, nme.isDefined)}")
if (extractorMemberType(unapplyResult, nme.isDefined) isRef defn.BooleanClass) {
if (getTp.exists) return getSelectors(getTp)
- else if (unapplyResult derivesFrom defn.ProductClass) return productSelectors(unapplyResult)
+ else if (defn.isProductSubType(unapplyResult)) return productSelectors(unapplyResult)
}
if (unapplyResult derivesFrom defn.SeqClass) seqSelector :: Nil
else if (unapplyResult isRef defn.BooleanClass) Nil