Skip to content

Commit 48ab2ea

Browse files
committed
use do not force symbols
1 parent cebd776 commit 48ab2ea

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

compiler/src/dotty/tools/dotc/core/TypeOps.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,4 +872,12 @@ object TypeOps:
872872

873873
end healPrefix
874874

875+
/** lift the prefix of an applied type, without normalisation or forcing */
876+
def appliedTypePrefix(tpe: Type): Type =
877+
tpe match
878+
case AppliedType(tycon, _) => appliedTypePrefix(tycon)
879+
case tpe: NamedType => tpe.prefix
880+
case tpe: ThisType => tpe.tref.prefix
881+
case _ => NoPrefix
882+
875883
end TypeOps

compiler/src/dotty/tools/dotc/typer/Synthesizer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
236236
monoMap(mirroredType.resultType)
237237

238238
private def productMirror(mirroredType: Type, formal: Type, span: Span)(using Context): Tree =
239-
val pre = mirroredType.normalizedPrefix
239+
val pre = TypeOps.appliedTypePrefix(mirroredType)
240240
mirroredType match
241241
case AndType(tp1, tp2) =>
242242
productMirror(tp1, formal, span).orElse(productMirror(tp2, formal, span))
@@ -285,7 +285,7 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
285285
end productMirror
286286

287287
private def sumMirror(mirroredType: Type, formal: Type, span: Span)(using Context): Tree =
288-
val pre = mirroredType.normalizedPrefix
288+
val pre = TypeOps.appliedTypePrefix(mirroredType)
289289
val cls = mirroredType.classSymbol
290290
val useCompanion = cls.useCompanionAsMirror
291291
val declScope = if useCompanion then cls.linkedClass else ctx.owner
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import scala.deriving.Mirror
2+
3+
class Outer { self =>
4+
5+
object Inner {
6+
sealed trait Item { thisItem => // both children and parent share a common sub-prefix
7+
8+
val mItem = summon[Mirror.Of[thisItem.type]]
9+
type derivedA = Tuple.Head[mItem.MirroredElemTypes]
10+
val mA = summon[Mirror.Of[derivedA]]
11+
12+
}
13+
14+
case object A extends self.Inner.Item
15+
case object B extends self.Inner.Item
16+
}
17+
18+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import scala.deriving.Mirror
2+
3+
def local = {
4+
5+
object Bar {
6+
case object A extends Foo.Item
7+
}
8+
9+
object Foo {
10+
11+
sealed trait Item { thisItem => // both children and parent share a common sub-prefix
12+
13+
val mItem = summon[Mirror.Of[thisItem.type]]
14+
type derivedA = Tuple.Head[mItem.MirroredElemTypes]
15+
val mA = summon[Mirror.Of[derivedA]]
16+
17+
}
18+
}
19+
20+
}

0 commit comments

Comments
 (0)