@@ -275,12 +275,15 @@ object SpaceEngine {
275275 /** Is the unapply irrefutable?
276276 * @param unapp The unapply function reference
277277 */
278- def isIrrefutableUnapply (unapp : tpd.Tree )(implicit ctx : Context ): Boolean = {
278+ def isIrrefutableUnapply (unapp : tpd.Tree , patSize : Int )(implicit ctx : Context ): Boolean = {
279279 val unappResult = unapp.tpe.widen.finalResultType
280280 unappResult.isRef(defn.SomeClass ) ||
281- unappResult =:= ConstantType (Constant (true )) ||
282- (unapp.symbol.is(Synthetic ) && unapp.symbol.owner.linkedClass.is(Case )) ||
283- productArity(unappResult) > 0
281+ unappResult <:< ConstantType (Constant (true )) ||
282+ (unapp.symbol.is(Synthetic ) && unapp.symbol.owner.linkedClass.is(Case )) || // scala2 compatibility
283+ (patSize != - 1 && productArity(unappResult) == patSize) || {
284+ val isEmptyTp = extractorMemberType(unappResult, nme.isEmpty, unapp.sourcePos)
285+ isEmptyTp <:< ConstantType (Constant (true ))
286+ }
284287 }
285288}
286289
@@ -348,16 +351,15 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
348351 else {
349352 val (arity, elemTp, resultTp) = unapplySeqInfo(fun.tpe.widen.finalResultType, fun.sourcePos)
350353 if (elemTp.exists)
351- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , isIrrefutableUnapply(fun))
354+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil , isIrrefutableUnapply(fun, - 1 ))
352355 else
353- Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.take(arity - 1 ).map(project) :+ projectSeq(pats.drop(arity - 1 )),isIrrefutableUnapply(fun) )
356+ Prod (erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, pats.take(arity - 1 ).map(project) :+ projectSeq(pats.drop(arity - 1 )), full = true )
354357 }
355358 else
356- Prod (erase(pat.tpe.stripAnnots), erase(fun.tpe), fun.symbol, pats.map(project), isIrrefutableUnapply(fun))
357- case Typed (expr @ Ident (nme.WILDCARD ), tpt) =>
359+ Prod (erase(pat.tpe.stripAnnots), erase(fun.tpe), fun.symbol, pats.map(project), isIrrefutableUnapply(fun, pats.length))
360+ case Typed (pat @ UnApply (_, _, _), _) => project(pat)
361+ case Typed (expr, _) =>
358362 Typ (erase(expr.tpe.stripAnnots), true )
359- case Typed (pat, _) =>
360- project(pat)
361363 case This (_) =>
362364 Typ (pat.tpe.stripAnnots, false )
363365 case EmptyTree => // default rethrow clause of try/catch, check tests/patmat/try2.scala
0 commit comments