@@ -295,6 +295,21 @@ object SpaceEngine {
295
295
isEmptyTp <:< ConstantType (Constant (true ))
296
296
}
297
297
}
298
+
299
+ /** Is the unapplySeq irrefutable?
300
+ * @param unapp The unapplySeq function reference
301
+ */
302
+ def isIrrefutableUnapplySeq (unapp : tpd.Tree , patSize : Int )(implicit ctx : Context ): Boolean = {
303
+ val unappResult = unapp.tpe.widen.finalResultType
304
+ unappResult.isRef(defn.SomeClass ) ||
305
+ (unapp.symbol.is(Synthetic ) && unapp.symbol.owner.linkedClass.is(Case )) || // scala2 compatibility
306
+ unapplySeqTypeElemTp(unappResult).exists ||
307
+ isProductSeqMatch(unappResult, patSize) ||
308
+ {
309
+ val isEmptyTp = extractorMemberType(unappResult, nme.isEmpty, unapp.sourcePos)
310
+ isEmptyTp <:< ConstantType (Constant (true ))
311
+ }
312
+ }
298
313
}
299
314
300
315
/** Scala implementation of space logic */
@@ -348,9 +363,9 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
348
363
else {
349
364
val (arity, elemTp, resultTp) = unapplySeqInfo(fun.tpe.widen.finalResultType, fun.sourcePos)
350
365
if (elemTp.exists)
351
- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , isIrrefutableUnapply (fun, - 1 ))
366
+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , isIrrefutableUnapplySeq (fun, pats.size ))
352
367
else
353
- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.take(arity - 1 ).map(project) :+ projectSeq(pats.drop(arity - 1 )), full = true )
368
+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.take(arity - 1 ).map(project) :+ projectSeq(pats.drop(arity - 1 )), isIrrefutableUnapplySeq(fun, pats.size) )
354
369
}
355
370
else
356
371
Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.map(project), isIrrefutableUnapply(fun, pats.length))
0 commit comments