@@ -20,6 +20,7 @@ import ProtoTypes._
2020import transform .SymUtils ._
2121import reporting .diagnostic .messages ._
2222import config .Printers .{exhaustivity => debug }
23+ import util .SourcePosition
2324
2425/** Space logic for checking exhaustivity and unreachability of pattern matching
2526 *
@@ -339,15 +340,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
339340 if (fun.symbol.owner == scalaSeqFactoryClass)
340341 projectSeq(pats)
341342 else {
342- val resultTp = fun.tpe.widen.finalResultType
343- var elemTp = unapplySeqTypeElemTp(resultTp)
344- var arity = productArity(resultTp, fun.sourcePos)
345- if (! elemTp.exists && arity <= 0 ) {
346- val resultTp = fun.tpe.widen.finalResultType.select(nme.get).finalResultType
347- elemTp = unapplySeqTypeElemTp(resultTp.widen)
348- arity = productSelectorTypes(resultTp, fun.sourcePos).size
349- }
350-
343+ val (arity, elemTp, resultTp) = unapplySeqInfo(fun.tpe.widen.finalResultType, fun.sourcePos)
351344 if (elemTp.exists)
352345 Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , irrefutable(fun))
353346 else
@@ -367,6 +360,18 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
367360 Empty
368361 }
369362
363+ private def unapplySeqInfo (resTp : Type , pos : SourcePosition )(implicit ctx : Context ): (Int , Type , Type ) = {
364+ var resultTp = resTp
365+ var elemTp = unapplySeqTypeElemTp(resultTp)
366+ var arity = productArity(resultTp, pos)
367+ if (! elemTp.exists && arity <= 0 ) {
368+ resultTp = resTp.select(nme.get).finalResultType
369+ elemTp = unapplySeqTypeElemTp(resultTp.widen)
370+ arity = productSelectorTypes(resultTp, pos).size
371+ }
372+ (arity, elemTp, resultTp)
373+ }
374+
370375 /* Erase pattern bound types with WildcardType */
371376 def erase (tp : Type ): Type = {
372377 def isPatternTypeSymbol (sym : Symbol ) = ! sym.isClass && sym.is(Case )
@@ -439,15 +444,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
439444 val isUnapplySeq = unappSym.name == nme.unapplySeq
440445
441446 if (isUnapplySeq) {
442- var resultTp = mt.finalResultType
443- var elemTp = unapplySeqTypeElemTp(resultTp)
444- var arity = productArity(resultTp, unappSym.sourcePos)
445- if (! elemTp.exists && arity <= 0 ) {
446- resultTp = mt.finalResultType.select(nme.get).finalResultType
447- elemTp = unapplySeqTypeElemTp(resultTp.widen)
448- arity = productSelectorTypes(resultTp, unappSym.sourcePos).size
449- }
450-
447+ val (arity, elemTp, resultTp) = unapplySeqInfo(mt.finalResultType, unappSym.sourcePos)
451448 if (elemTp.exists) scalaListType.appliedTo(elemTp) :: Nil
452449 else {
453450 val sels = productSeqSelectors(resultTp, arity, unappSym.sourcePos)
0 commit comments