@@ -240,11 +240,11 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
240240 * <parent> {
241241 * MirroredMonoType = <monoType>
242242 * MirroredType = <mirroredType>
243- * MirroredLabel = <label> }
243+ * MirroredLabel = <label>
244244 * }
245245 */
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
248248 .refinedWith(tpnme.MirroredMonoType , TypeAlias (monoType))
249249 .refinedWith(tpnme.MirroredType , TypeAlias (mirroredType))
250250 .refinedWith(tpnme.MirroredLabel , TypeAlias (ConstantType (Constant (label.toString))))
@@ -269,6 +269,13 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
269269 then report.error(
270270 em " $name mismatch, expected: $expected, found: $actual. " , ctx.source.atSpan(span))
271271
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+
272279 private def mkMirroredMonoType (mirroredType : HKTypeLambda )(using Context ): Type =
273280 val monoMap = new TypeMap :
274281 def apply (t : Type ) = t match
@@ -300,10 +307,11 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
300307 val elemsLabels = TypeOps .nestedPairs(elemLabels)
301308 checkRefinement(formal, tpnme.MirroredElemTypes , elemsType, span)
302309 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)
305312 .refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
306313 .refinedWith(tpnme.MirroredElemLabels , TypeAlias (elemsLabels))
314+ }
307315 val mirrorRef =
308316 if cls.useCompanionAsProductMirror then companionPath(mirroredType, span)
309317 else anonymousMirror(monoType, ExtendsProductMirror , span)
@@ -328,11 +336,15 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
328336 else (cls.sourceModule, cls.sourceModule.reachableTermRef)
329337 val singletonPath = pathFor(singletonRef).withSpan(span)
330338 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+ }
332342 val mirrorRef = New (defn.Mirror_SingletonProxyClass .typeRef, singletonPath :: Nil )
333343 withNoErrors(mirrorRef.cast(mirrorType))
334344 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+ }
336348 withNoErrors(singletonPath.cast(mirrorType))
337349 else
338350 val acceptableMsg = whyNotAcceptableType(mirroredType, cls)
@@ -408,9 +420,12 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
408420 (mirroredType, elems)
409421
410422 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)
412426 .refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
413- .refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels)))
427+ .refinedWith(tpnme.MirroredElemLabels , TypeAlias (labels))
428+ }
414429 val mirrorRef =
415430 if cls.useCompanionAsSumMirror then companionPath(mirroredType, span)
416431 else anonymousMirror(monoType, ExtendsSumMirror , span)
@@ -419,7 +434,7 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
419434 withErrors(i " type $mirroredType is not a generic sum because $acceptableMsg" )
420435 else if ! clsIsGenericSum then
421436 withErrors(i " $cls is not a generic sum because ${cls.whyNotGenericSum}" )
422- else
437+ else
423438 EmptyTreeNoError
424439 end sumMirror
425440
0 commit comments