@@ -241,8 +241,8 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
241241 * MirroredLabel = <label> }
242242 * }
243243 */
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
246246 .refinedWith(tpnme.MirroredMonoType , TypeAlias (monoType))
247247 .refinedWith(tpnme.MirroredType , TypeAlias (mirroredType))
248248 .refinedWith(tpnme.MirroredLabel , TypeAlias (ConstantType (Constant (label.toString))))
@@ -267,6 +267,13 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
267267 then report.error(
268268 em " $name mismatch, expected: $expected, found: $actual. " , ctx.source.atSpan(span))
269269
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+
270277 private def mkMirroredMonoType (mirroredType : HKTypeLambda )(using Context ): Type =
271278 val monoMap = new TypeMap :
272279 def apply (t : Type ) = t match
@@ -311,10 +318,11 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
311318 val elemsLabels = TypeOps .nestedPairs(elemLabels)
312319 checkRefinement(formal, tpnme.MirroredElemTypes , elemsType, span)
313320 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)
316323 .refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
317324 .refinedWith(tpnme.MirroredElemLabels , TypeAlias (elemsLabels))
325+ }
318326 val mirrorRef =
319327 if (genAnonyousMirror(cls)) anonymousMirror(monoType, ExtendsProductMirror , span)
320328 else companionPath(mirroredType, span)
@@ -329,11 +337,15 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
329337 val module = mirroredType.termSymbol
330338 val modulePath = pathFor(mirroredType).withSpan(span)
331339 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+ }
333343 val mirrorRef = New (defn.Mirror_SingletonProxyClass .typeRef, modulePath :: Nil )
334344 mirrorRef.cast(mirrorType)
335345 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+ }
337349 modulePath.cast(mirrorType)
338350 else
339351 val cls = mirroredType.classSymbol
@@ -404,9 +416,12 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
404416 (mirroredType, elems)
405417
406418 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)
408422 .refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
409- .refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels)))
423+ .refinedWith(tpnme.MirroredElemLabels , TypeAlias (labels))
424+ }
410425 val mirrorRef =
411426 if useCompanion then companionPath(mirroredType, span)
412427 else anonymousMirror(monoType, ExtendsSumMirror , span)
0 commit comments