@@ -240,11 +240,11 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
240
240
* <parent> {
241
241
* MirroredMonoType = <monoType>
242
242
* MirroredType = <mirroredType>
243
- * MirroredLabel = <label> }
243
+ * MirroredLabel = <label>
244
244
* }
245
245
*/
246
- private def mirrorCore (parentClass : ClassSymbol , monoType : Type , mirroredType : Type , label : Name , formal : Type )(using Context ) =
247
- formal & parentClass.typeRef
246
+ private def mirrorCore (parentClass : ClassSymbol , monoType : Type , mirroredType : Type , label : Name )(using Context ) =
247
+ parentClass.typeRef
248
248
.refinedWith(tpnme.MirroredMonoType , TypeAlias (monoType))
249
249
.refinedWith(tpnme.MirroredType , TypeAlias (mirroredType))
250
250
.refinedWith(tpnme.MirroredLabel , TypeAlias (ConstantType (Constant (label.toString))))
@@ -269,6 +269,13 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
269
269
then report.error(
270
270
em " $name mismatch, expected: $expected, found: $actual. " , ctx.source.atSpan(span))
271
271
272
+ extension (formal : Type )
273
+ /** `tp := op; tp <:< formal; formal & tp` */
274
+ private def constrained_& (op : Context ?=> Type )(using Context ): Type =
275
+ val tp = op
276
+ tp <:< formal
277
+ formal & tp
278
+
272
279
private def mkMirroredMonoType (mirroredType : HKTypeLambda )(using Context ): Type =
273
280
val monoMap = new TypeMap :
274
281
def apply (t : Type ) = t match
@@ -300,10 +307,11 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
300
307
val elemsLabels = TypeOps .nestedPairs(elemLabels)
301
308
checkRefinement(formal, tpnme.MirroredElemTypes , elemsType, span)
302
309
checkRefinement(formal, tpnme.MirroredElemLabels , elemsLabels, span)
303
- val mirrorType =
304
- mirrorCore(defn.Mirror_ProductClass , monoType, mirroredType, cls.name, formal )
310
+ val mirrorType = formal.constrained_& {
311
+ mirrorCore(defn.Mirror_ProductClass , monoType, mirroredType, cls.name)
305
312
.refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
306
313
.refinedWith(tpnme.MirroredElemLabels , TypeAlias (elemsLabels))
314
+ }
307
315
val mirrorRef =
308
316
if cls.useCompanionAsProductMirror then companionPath(mirroredType, span)
309
317
else anonymousMirror(monoType, ExtendsProductMirror , span)
@@ -328,11 +336,15 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
328
336
else (cls.sourceModule, cls.sourceModule.reachableTermRef)
329
337
val singletonPath = pathFor(singletonRef).withSpan(span)
330
338
if singleton.info.classSymbol.is(Scala2x ) then // could be Scala 3 alias of Scala 2 case object.
331
- val mirrorType = mirrorCore(defn.Mirror_SingletonProxyClass , mirroredType, mirroredType, singleton.name, formal)
339
+ val mirrorType = formal.constrained_& {
340
+ mirrorCore(defn.Mirror_SingletonProxyClass , mirroredType, mirroredType, singleton.name)
341
+ }
332
342
val mirrorRef = New (defn.Mirror_SingletonProxyClass .typeRef, singletonPath :: Nil )
333
343
withNoErrors(mirrorRef.cast(mirrorType))
334
344
else
335
- val mirrorType = mirrorCore(defn.Mirror_SingletonClass , mirroredType, mirroredType, singleton.name, formal)
345
+ val mirrorType = formal.constrained_& {
346
+ mirrorCore(defn.Mirror_SingletonClass , mirroredType, mirroredType, singleton.name)
347
+ }
336
348
withNoErrors(singletonPath.cast(mirrorType))
337
349
else
338
350
val acceptableMsg = whyNotAcceptableType(mirroredType, cls)
@@ -408,9 +420,12 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
408
420
(mirroredType, elems)
409
421
410
422
val mirrorType =
411
- mirrorCore(defn.Mirror_SumClass , monoType, mirroredType, cls.name, formal)
423
+ val labels = TypeOps .nestedPairs(elemLabels)
424
+ formal.constrained_& {
425
+ mirrorCore(defn.Mirror_SumClass , monoType, mirroredType, cls.name)
412
426
.refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
413
- .refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels)))
427
+ .refinedWith(tpnme.MirroredElemLabels , TypeAlias (labels))
428
+ }
414
429
val mirrorRef =
415
430
if cls.useCompanionAsSumMirror then companionPath(mirroredType, span)
416
431
else anonymousMirror(monoType, ExtendsSumMirror , span)
@@ -419,7 +434,7 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
419
434
withErrors(i " type $mirroredType is not a generic sum because $acceptableMsg" )
420
435
else if ! clsIsGenericSum then
421
436
withErrors(i " $cls is not a generic sum because ${cls.whyNotGenericSum}" )
422
- else
437
+ else
423
438
EmptyTreeNoError
424
439
end sumMirror
425
440
0 commit comments