Skip to content

Commit

Permalink
Rework MatchType recursion in collectParts (scala#19867)
Browse files Browse the repository at this point in the history
  • Loading branch information
dwijnand authored Mar 6, 2024
2 parents c36c390 + f0cd565 commit cf968a3
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 7 deletions.
8 changes: 1 addition & 7 deletions compiler/src/dotty/tools/dotc/typer/Implicits.scala
Original file line number Diff line number Diff line change
Expand Up @@ -661,15 +661,9 @@ trait ImplicitRunInfo:
case t: TypeLambda =>
for p <- t.paramRefs do partSeen += p
traverseChildren(t)
case t: MatchType =>
traverseChildren(t)
traverse(t.normalized)
case MatchType.InDisguise(mt)
if !t.isInstanceOf[LazyRef] // skip recursive applications (eg. Tuple.Map)
=>
traverse(mt)
case t =>
traverseChildren(t)
traverse(t.normalized)
catch case ex: Throwable => handleRecursive("collectParts of", t.show, ex)

def apply(tp: Type): collection.Set[Type] =
Expand Down
17 changes: 17 additions & 0 deletions tests/pos/i17395-spec.ordered.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
trait ThingWithPart { type Part }
type PartField[A] = ThingWithPart { type Part = A }
type ExtractPart[B] = B match { case PartField[a] => a }

trait TC[C]
object TC:
def tcForOptionPart[D](implicit tc: TC[ExtractPart[D]]): TC[Option[ExtractPart[D]]] = new {}

class Value
object Value:
implicit val tcValue: TC[Value] = new {}

class ValuePartHolder extends ThingWithPart { type Part = Value }

class Test:
def t1: Unit =
val tc = TC.tcForOptionPart[ValuePartHolder]
23 changes: 23 additions & 0 deletions tests/pos/i19857.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
sealed trait DFTypeAny

sealed trait DFTuple[T <: NonEmptyTuple] extends DFTypeAny

sealed trait DFBit extends DFTypeAny

sealed trait DFValOf[T]

type Of[T] <: DFTypeAny = T match
case DFTypeAny => T & DFTypeAny
case Product => FromProduct[T]

type JUSTVAL[T] = DFValOf[Of[T]]

type FromProduct[T <: Product] <: DFTypeAny = T match
case NonEmptyTuple => DFTuple[Tuple.Map[T, JUSTVAL]]

trait Width2[T]

object Width2:
inline given [T]: Width2[T] = new Width2[T] {}

val x = summon[Width2[Of[(DFBit, DFBit)]]]

0 comments on commit cf968a3

Please sign in to comment.