@@ -335,25 +335,26 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
335
335
case Bind (_, pat) => project(pat)
336
336
case SeqLiteral (pats, _) => projectSeq(pats)
337
337
case UnApply (fun, _, pats) =>
338
- if (fun.symbol.owner == scalaSeqFactoryClass && fun.symbol.name == nme.unapplySeq)
339
- projectSeq(pats)
340
- else {
341
- var tp = fun.tpe.widen.finalResultType
342
- var arity = productArity(tp, fun.sourcePos)
343
- if (arity <= 0 ) {
344
- tp = fun.tpe.widen.finalResultType.select(nme.get).finalResultType.widen
345
- if (pats.length == 1 )
346
- return Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.map(project), irrefutable(fun))
347
- arity = productSelectorTypes(tp, fun.sourcePos).size
348
- }
338
+ if (fun.symbol.name == nme.unapplySeq)
339
+ if (fun.symbol.owner == scalaSeqFactoryClass)
340
+ projectSeq(pats)
341
+ 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
+ }
349
350
350
- if (arity > 0 && arity != pats.length )
351
- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.take(arity - 1 ).map(project) :+ projectSeq(pats.drop(arity - 1 )) , irrefutable(fun))
352
- else if (arity <= 0 && unapplySeqTypeElemTp(tp).exists)
353
- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq( pats) :: Nil , irrefutable(fun))
354
- else
355
- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.map(project), irrefutable(fun))
356
- }
351
+ if (elemTp.exists )
352
+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , irrefutable(fun))
353
+ else
354
+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.take(arity - 1 ).map(project) :+ projectSeq(pats.drop(arity - 1 )) , irrefutable(fun))
355
+ }
356
+ else
357
+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.map(project), irrefutable(fun))
357
358
case Typed (pat @ UnApply (_, _, _), _) => project(pat)
358
359
case Typed (expr, tpt) =>
359
360
Typ (erase(expr.tpe.stripAnnots), true )
@@ -436,27 +437,34 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
436
437
List ()
437
438
else {
438
439
val isUnapplySeq = unappSym.name == nme.unapplySeq
439
- val arity = productArity(mt.finalResultType, unappSym.sourcePos)
440
- if (arity > 0 && ! isUnapplySeq) {
441
- if (arity != argLen) {
442
- val sels = productSeqSelectors(mt.finalResultType, arity, unappSym.sourcePos)
440
+
441
+ 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
+
451
+ if (elemTp.exists) scalaListType.appliedTo(elemTp) :: Nil
452
+ else {
453
+ val sels = productSeqSelectors(resultTp, arity, unappSym.sourcePos)
443
454
sels.init :+ scalaListType.appliedTo(sels.last)
444
455
}
445
- else
446
- productSelectors(mt.finalResultType)
447
- .map(_.info.asSeenFrom(mt.finalResultType, mt.resultType.classSymbol).widenExpr)
448
456
}
449
457
else {
450
- val resTp = mt.finalResultType.select(nme.get).finalResultType.widen
451
- val arity = productArity(resTp, unappSym.sourcePos)
452
- if (isUnapplySeq && arity < 0 ) scalaListType.appliedTo(resTp.argTypes.head) :: Nil
453
- else if (argLen == 1 ) resTp :: Nil
454
- else if (arity > 0 && arity != argLen) {
455
- val sels = productSeqSelectors(resTp, arity, unappSym.sourcePos)
456
- sels.init :+ scalaListType.appliedTo(sels.last)
458
+ val arity = productArity(mt.finalResultType, unappSym.sourcePos)
459
+ if (arity > 0 )
460
+ productSelectors(mt.finalResultType)
461
+ .map(_.info.asSeenFrom(mt.finalResultType, mt.resultType.classSymbol).widenExpr)
462
+ else {
463
+ val resTp = mt.finalResultType.select(nme.get).finalResultType.widen
464
+ val arity = productArity(resTp, unappSym.sourcePos)
465
+ if (argLen == 1 ) resTp :: Nil
466
+ else productSelectors(resTp).map(_.info.asSeenFrom(resTp, resTp.classSymbol).widenExpr)
457
467
}
458
- else
459
- productSelectors(resTp).map(_.info.asSeenFrom(resTp, resTp.classSymbol).widenExpr)
460
468
}
461
469
}
462
470
0 commit comments