@@ -409,20 +409,27 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
409
409
def makeProductMirror (pre : Type , cls : Symbol , tps : Option [List [Type ]]): TreeWithErrors =
410
410
val accessors = cls.caseAccessors
411
411
val elemLabels = accessors.map(acc => ConstantType (Constant (acc.name.toString)))
412
+ val elemsLabels = TypeOps .nestedPairs(elemLabels)
413
+
414
+ val elemHasDefaults = accessors.map(acc => ConstantType (Constant (acc.is(HasDefault ))))
415
+ val elemsHasDefaults = TypeOps .nestedPairs(elemHasDefaults)
416
+
412
417
val typeElems = tps.getOrElse(accessors.map(mirroredType.resultType.memberInfo(_).widenExpr))
413
- val nestedPairs = TypeOps .nestedPairs(typeElems)
418
+ val typesElems = TypeOps .nestedPairs(typeElems)
419
+
414
420
val (monoType, elemsType) = mirroredType match
415
421
case mirroredType : HKTypeLambda =>
416
- (mkMirroredMonoType(mirroredType), mirroredType.derivedLambdaType(resType = nestedPairs))
417
- case _ =>
418
- (mirroredType, nestedPairs)
419
- val elemsLabels = TypeOps .nestedPairs(elemLabels)
422
+ (mkMirroredMonoType(mirroredType), mirroredType.derivedLambdaType(resType = typesElems))
423
+ case _ => (mirroredType, typesElems)
424
+
420
425
checkRefinement(formal, tpnme.MirroredElemTypes , elemsType, span)
421
426
checkRefinement(formal, tpnme.MirroredElemLabels , elemsLabels, span)
427
+ checkRefinement(formal, tpnme.MirroredElemHasDefaults , elemsHasDefaults, span)
422
428
val mirrorType = formal.constrained_& {
423
429
mirrorCore(defn.Mirror_ProductClass , monoType, mirroredType, cls.name)
424
430
.refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
425
431
.refinedWith(tpnme.MirroredElemLabels , TypeAlias (elemsLabels))
432
+ .refinedWith(tpnme.MirroredElemHasDefaults , TypeAlias (elemsHasDefaults))
426
433
}
427
434
val mirrorRef =
428
435
if cls.useCompanionAsProductMirror then companionPath(mirroredType, span)
0 commit comments