Skip to content

Commit e01fd46

Browse files
add MirroredElemHasDefaults refinement to product mirrors during typer
1 parent e7d69ef commit e01fd46

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

compiler/src/dotty/tools/dotc/typer/Synthesizer.scala

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -409,20 +409,27 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
409409
def makeProductMirror(pre: Type, cls: Symbol, tps: Option[List[Type]]): TreeWithErrors =
410410
val accessors = cls.caseAccessors
411411
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+
412417
val typeElems = tps.getOrElse(accessors.map(mirroredType.resultType.memberInfo(_).widenExpr))
413-
val nestedPairs = TypeOps.nestedPairs(typeElems)
418+
val typesElems = TypeOps.nestedPairs(typeElems)
419+
414420
val (monoType, elemsType) = mirroredType match
415421
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+
420425
checkRefinement(formal, tpnme.MirroredElemTypes, elemsType, span)
421426
checkRefinement(formal, tpnme.MirroredElemLabels, elemsLabels, span)
427+
checkRefinement(formal, tpnme.MirroredElemHasDefaults, elemsHasDefaults, span)
422428
val mirrorType = formal.constrained_& {
423429
mirrorCore(defn.Mirror_ProductClass, monoType, mirroredType, cls.name)
424430
.refinedWith(tpnme.MirroredElemTypes, TypeAlias(elemsType))
425431
.refinedWith(tpnme.MirroredElemLabels, TypeAlias(elemsLabels))
432+
.refinedWith(tpnme.MirroredElemHasDefaults, TypeAlias(elemsHasDefaults))
426433
}
427434
val mirrorRef =
428435
if cls.useCompanionAsProductMirror then companionPath(mirroredType, span)

0 commit comments

Comments
 (0)