@@ -20,6 +20,7 @@ import ProtoTypes._
20
20
import transform .SymUtils ._
21
21
import reporting .diagnostic .messages ._
22
22
import config .Printers .{exhaustivity => debug }
23
+ import util .SourcePosition
23
24
24
25
/** Space logic for checking exhaustivity and unreachability of pattern matching
25
26
*
@@ -339,15 +340,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
339
340
if (fun.symbol.owner == scalaSeqFactoryClass)
340
341
projectSeq(pats)
341
342
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)
351
344
if (elemTp.exists)
352
345
Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , irrefutable(fun))
353
346
else
@@ -367,6 +360,18 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
367
360
Empty
368
361
}
369
362
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
+
370
375
/* Erase pattern bound types with WildcardType */
371
376
def erase (tp : Type ): Type = {
372
377
def isPatternTypeSymbol (sym : Symbol ) = ! sym.isClass && sym.is(Case )
@@ -439,15 +444,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
439
444
val isUnapplySeq = unappSym.name == nme.unapplySeq
440
445
441
446
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)
451
448
if (elemTp.exists) scalaListType.appliedTo(elemTp) :: Nil
452
449
else {
453
450
val sels = productSeqSelectors(resultTp, arity, unappSym.sourcePos)
0 commit comments