@@ -284,6 +284,21 @@ object SpaceEngine {
284
284
isEmptyTp <:< ConstantType (Constant (true ))
285
285
}
286
286
}
287
+
288
+ /** Is the unapplySeq irrefutable?
289
+ * @param unapp The unapplySeq function reference
290
+ */
291
+ def isIrrefutableUnapplySeq (unapp : tpd.Tree , patSize : Int )(implicit ctx : Context ): Boolean = {
292
+ val unappResult = unapp.tpe.widen.finalResultType
293
+ unappResult.isRef(defn.SomeClass ) ||
294
+ (unapp.symbol.is(Synthetic ) && unapp.symbol.owner.linkedClass.is(Case )) || // scala2 compatibility
295
+ unapplySeqTypeElemTp(unappResult).exists ||
296
+ isProductSeqMatch(unappResult, patSize) ||
297
+ {
298
+ val isEmptyTp = extractorMemberType(unappResult, nme.isEmpty, unapp.sourcePos)
299
+ isEmptyTp <:< ConstantType (Constant (true ))
300
+ }
301
+ }
287
302
}
288
303
289
304
/** Scala implementation of space logic */
@@ -336,9 +351,9 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
336
351
else {
337
352
val (arity, elemTp, resultTp) = unapplySeqInfo(fun.tpe.widen.finalResultType, fun.sourcePos)
338
353
if (elemTp.exists)
339
- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , isIrrefutableUnapply (fun, - 1 ))
354
+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , isIrrefutableUnapplySeq (fun, pats.size ))
340
355
else
341
- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.take(arity - 1 ).map(project) :+ projectSeq(pats.drop(arity - 1 )), full = true )
356
+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.take(arity - 1 ).map(project) :+ projectSeq(pats.drop(arity - 1 )), isIrrefutableUnapplySeq(fun, pats.size) )
342
357
}
343
358
else
344
359
Prod (erase(pat.tpe.stripAnnots), erase(fun.tpe), fun.symbol, pats.map(project), isIrrefutableUnapply(fun, pats.length))
0 commit comments