diff options
-rw-r--r-- | src/dotty/tools/dotc/core/Definitions.scala | 3 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Applications.scala | 4 |
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 |