Skip to content

Commit 1a26208

Browse files
committed
Address review
1 parent a964e04 commit 1a26208

File tree

2 files changed

+19
-19
lines changed

2 files changed

+19
-19
lines changed

compiler/src/dotty/tools/dotc/transform/patmat/Space.scala

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import ProtoTypes._
2020
import transform.SymUtils._
2121
import reporting.diagnostic.messages._
2222
import config.Printers.{exhaustivity => debug}
23+
import util.SourcePosition
2324

2425
/** Space logic for checking exhaustivity and unreachability of pattern matching
2526
*
@@ -339,15 +340,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
339340
if (fun.symbol.owner == scalaSeqFactoryClass)
340341
projectSeq(pats)
341342
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)
351344
if (elemTp.exists)
352345
Prod(erase(pat.tpe.stripAnnots), fun.tpe, fun.symbol, projectSeq(pats) :: Nil, irrefutable(fun))
353346
else
@@ -367,6 +360,18 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
367360
Empty
368361
}
369362

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+
370375
/* Erase pattern bound types with WildcardType */
371376
def erase(tp: Type): Type = {
372377
def isPatternTypeSymbol(sym: Symbol) = !sym.isClass && sym.is(Case)
@@ -439,15 +444,7 @@ class SpaceEngine(implicit ctx: Context) extends SpaceLogic {
439444
val isUnapplySeq = unappSym.name == nme.unapplySeq
440445

441446
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)
451448
if (elemTp.exists) scalaListType.appliedTo(elemTp) :: Nil
452449
else {
453450
val sels = productSeqSelectors(resultTp, arity, unappSym.sourcePos)

docs/docs/reference/changed-features/pattern-matching.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,7 @@ def foo(f: Foo) = f match {
219219
case Foo(name, ns : _*) =>
220220
case Foo(name, x, y, ns : _*) =>
221221
}
222-
```
222+
```
223+
224+
There are plans for further simplification, in particular to factor out *Product
225+
Pattern* and *Name Based Pattern* into a single type of extractor.

0 commit comments

Comments
 (0)