@@ -219,6 +219,12 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
219
219
case _ => true
220
220
loop(formal)
221
221
222
+ private def checkRefinement (formal : Type , name : TypeName , expected : Type , span : Span )(using Context ): Unit =
223
+ val actual = formal.lookupRefined(name)
224
+ if actual.exists && ! (expected =:= actual)
225
+ then report.error(
226
+ em " $name mismatch, expected: $expected, found: $actual. " , ctx.source.atSpan(span))
227
+
222
228
private def mkMirroredMonoType (mirroredType : HKTypeLambda )(using Context ): Type =
223
229
val monoMap = new TypeMap :
224
230
def apply (t : Type ) = t match
@@ -260,10 +266,13 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
260
266
case _ =>
261
267
val elems = TypeOps .nestedPairs(accessors.map(mirroredType.memberInfo(_).widenExpr))
262
268
(mirroredType, elems)
269
+ val elemsLabels = TypeOps .nestedPairs(elemLabels)
270
+ checkRefinement(formal, tpnme.MirroredElemTypes , elemsType, span)
271
+ checkRefinement(formal, tpnme.MirroredElemLabels , elemsLabels, span)
263
272
val mirrorType =
264
273
mirrorCore(defn.Mirror_ProductClass , monoType, mirroredType, cls.name, formal)
265
274
.refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
266
- .refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels) ))
275
+ .refinedWith(tpnme.MirroredElemLabels , TypeAlias (elemsLabels ))
267
276
val mirrorRef =
268
277
if (cls.is(Scala2x )) anonymousMirror(monoType, ExtendsProductMirror , span)
269
278
else companionPath(mirroredType, span)
0 commit comments