File tree 3 files changed +64
-1
lines changed
compiler/src/dotty/tools/dotc/typer
3 files changed +64
-1
lines changed Original file line number Diff line number Diff line change @@ -273,7 +273,13 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
273
273
val cls = mirroredType.classSymbol
274
274
val useCompanion = cls.useCompanionAsSumMirror
275
275
276
- if cls.isGenericSum(if useCompanion then cls.linkedClass else ctx.owner) then
276
+ def acceptable (tp : Type ): Boolean = tp match
277
+ case tp : TermRef => false
278
+ case tp : TypeProxy => acceptable(tp.underlying)
279
+ case OrType (tp1, tp2) => acceptable(tp1) && acceptable(tp2)
280
+ case _ => tp.classSymbol eq cls
281
+
282
+ if acceptable(mirroredType) && cls.isGenericSum(if useCompanion then cls.linkedClass else ctx.owner) then
277
283
val elemLabels = cls.children.map(c => ConstantType (Constant (c.name.toString)))
278
284
279
285
def solve (sym : Symbol ): Type = sym match
Original file line number Diff line number Diff line change
1
+ import scala .util .NotGiven
2
+ import scala .compiletime .*
3
+ import scala .deriving .Mirror
4
+
5
+ enum Color :
6
+ case Red , Green , Blue
7
+ end Color
8
+
9
+ enum Bar :
10
+ case A (i : Int )
11
+ case B (b : Boolean )
12
+ case C (s : String )
13
+
14
+ object Singletons {
15
+ object A
16
+ object B
17
+ }
18
+
19
+ type SumOfK1 [F [_]] = Mirror .Sum { type MirroredType [T ] = F [T ] }
20
+
21
+ class refined extends scala.annotation.RefiningAnnotation
22
+
23
+ object Test {
24
+
25
+ def main (args : Array [String ]): Unit = {
26
+ summon[Mirror .ProductOf [Color ]] // error
27
+ summon[Mirror .SumOf [Color .Red .type ]] // error
28
+ summon[Mirror .SumOf [Color .Red .type | Color .Green .type ]] // error
29
+ summon[Mirror .SumOf [Bar .A | Bar .B ]] // error
30
+ summon[Mirror .SumOf [Singletons .A .type | Singletons .B .type ]] // error
31
+ summon[SumOfK1 [[X ] =>> Bar ]]
32
+ summon[SumOfK1 [[X ] =>> Bar .A | Bar .B ]] // error
33
+ summon[SumOfK1 [[X ] =>> (Bar .A | Bar .B ) @ refined]] // error
34
+ object opaques {
35
+ opaque type Query [X ] = (Bar .A | Bar .B ) @ refined
36
+ }
37
+ summon[SumOfK1 [opaques.Query ]] // error
38
+ summon[SumOfK1 [[X ] =>> (Bar .A @ refined) | Bar .B ]] // error
39
+ }
40
+ }
Original file line number Diff line number Diff line change
1
+ import scala .util .NotGiven
2
+ import scala .compiletime .*
3
+ import scala .deriving .Mirror
4
+
5
+ enum Color :
6
+ case Red , Green , Blue
7
+ end Color
8
+
9
+ object Test {
10
+
11
+ def main (args : Array [String ]): Unit = {
12
+ summon[Mirror .Of [Color .Red .type ]]
13
+ summon[Mirror .Of [Color ]]
14
+ summon[Mirror .ProductOf [Color .Red .type ]]
15
+ summon[Mirror .SumOf [Color ]]
16
+ }
17
+ }
You can’t perform that action at this time.
0 commit comments