@@ -241,8 +241,8 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
241
241
* MirroredLabel = <label> }
242
242
* }
243
243
*/
244
- private def mirrorCore (parentClass : ClassSymbol , monoType : Type , mirroredType : Type , label : Name , formal : Type )(using Context ) =
245
- formal & parentClass.typeRef
244
+ private def mirrorCore (parentClass : ClassSymbol , monoType : Type , mirroredType : Type , label : Name )(using Context ) =
245
+ parentClass.typeRef
246
246
.refinedWith(tpnme.MirroredMonoType , TypeAlias (monoType))
247
247
.refinedWith(tpnme.MirroredType , TypeAlias (mirroredType))
248
248
.refinedWith(tpnme.MirroredLabel , TypeAlias (ConstantType (Constant (label.toString))))
@@ -267,6 +267,13 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
267
267
then report.error(
268
268
em " $name mismatch, expected: $expected, found: $actual. " , ctx.source.atSpan(span))
269
269
270
+ extension (formal : Type )
271
+ /** `tp := op; tp <:< formal; formal & tp` */
272
+ private def constrained_& (op : Context ?=> Type )(using Context ): Type =
273
+ val tp = op
274
+ tp <:< formal
275
+ formal & tp
276
+
270
277
private def mkMirroredMonoType (mirroredType : HKTypeLambda )(using Context ): Type =
271
278
val monoMap = new TypeMap :
272
279
def apply (t : Type ) = t match
@@ -311,10 +318,11 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
311
318
val elemsLabels = TypeOps .nestedPairs(elemLabels)
312
319
checkRefinement(formal, tpnme.MirroredElemTypes , elemsType, span)
313
320
checkRefinement(formal, tpnme.MirroredElemLabels , elemsLabels, span)
314
- val mirrorType =
315
- mirrorCore(defn.Mirror_ProductClass , monoType, mirroredType, cls.name, formal )
321
+ val mirrorType = formal.constrained_& {
322
+ mirrorCore(defn.Mirror_ProductClass , monoType, mirroredType, cls.name)
316
323
.refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
317
324
.refinedWith(tpnme.MirroredElemLabels , TypeAlias (elemsLabels))
325
+ }
318
326
val mirrorRef =
319
327
if (genAnonyousMirror(cls)) anonymousMirror(monoType, ExtendsProductMirror , span)
320
328
else companionPath(mirroredType, span)
@@ -329,11 +337,15 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
329
337
val module = mirroredType.termSymbol
330
338
val modulePath = pathFor(mirroredType).withSpan(span)
331
339
if module.info.classSymbol.is(Scala2x ) then
332
- val mirrorType = mirrorCore(defn.Mirror_SingletonProxyClass , mirroredType, mirroredType, module.name, formal)
340
+ val mirrorType = formal.constrained_& {
341
+ mirrorCore(defn.Mirror_SingletonProxyClass , mirroredType, mirroredType, module.name)
342
+ }
333
343
val mirrorRef = New (defn.Mirror_SingletonProxyClass .typeRef, modulePath :: Nil )
334
344
mirrorRef.cast(mirrorType)
335
345
else
336
- val mirrorType = mirrorCore(defn.Mirror_SingletonClass , mirroredType, mirroredType, module.name, formal)
346
+ val mirrorType = formal.constrained_& {
347
+ mirrorCore(defn.Mirror_SingletonClass , mirroredType, mirroredType, module.name)
348
+ }
337
349
modulePath.cast(mirrorType)
338
350
else
339
351
val cls = mirroredType.classSymbol
@@ -404,9 +416,12 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
404
416
(mirroredType, elems)
405
417
406
418
val mirrorType =
407
- mirrorCore(defn.Mirror_SumClass , monoType, mirroredType, cls.name, formal)
419
+ val labels = TypeOps .nestedPairs(elemLabels)
420
+ formal.constrained_& {
421
+ mirrorCore(defn.Mirror_SumClass , monoType, mirroredType, cls.name)
408
422
.refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
409
- .refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels)))
423
+ .refinedWith(tpnme.MirroredElemLabels , TypeAlias (labels))
424
+ }
410
425
val mirrorRef =
411
426
if useCompanion then companionPath(mirroredType, span)
412
427
else anonymousMirror(monoType, ExtendsSumMirror , span)
0 commit comments