Skip to content

Commit b0e542c

Browse files
test mirror is resynthesized when default arguments are added or changed
1 parent e82974a commit b0e542c

File tree

9 files changed

+17
-7
lines changed

9 files changed

+17
-7
lines changed

compiler/src/dotty/tools/dotc/core/SymbolLoaders.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ class TastyLoader(val tastyFile: AbstractFile) extends SymbolLoader {
431431
moduleRoot.classSymbol.rootTreeOrProvider = unpickler
432432
checkTastyUUID(tastyFile, tastyBytes)
433433

434-
// TODO with checkTastyUUID
434+
// TODO merge with checkTastyUUID
435435
val TastyHeader(_, maj, min, exp, _) = new TastyHeaderUnpickler(tastyBytes).readFullHeader()
436436
classRoot.classSymbol.tastyVersion = TastyVersion(maj, min, exp)
437437
moduleRoot.classSymbol.tastyVersion = TastyVersion(maj, min, exp)

compiler/src/dotty/tools/dotc/core/Symbols.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ object Symbols {
405405
private var myTree: TreeOrProvider = tpd.EmptyTree
406406

407407
// TODO private and getter/setter
408-
var tastyVersion: TastyVersion = TastyVersion.current // overwritten when loading from Tasty
408+
var tastyVersion: TastyVersion = TastyVersion.current // overwritten in TastyLoader
409409

410410
/** If this is a top-level class and `-Yretain-trees` (or `-from-tasty`) is set.
411411
* Returns the TypeDef tree (possibly wrapped inside PackageDefs) for this class, otherwise EmptyTree.

compiler/src/dotty/tools/dotc/transform/SymUtils.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ object SymUtils:
108108

109109
def isGenericProduct(using Context): Boolean = whyNotGenericProduct.isEmpty
110110

111-
def mirrorCanSupportDefaults: Boolean = self.isClass && self.asClass.tastyVersion.gteq(TastyVersion(28, 4, 1)) // TODO? cst
111+
/** Is a case class for which mirrors support access to default arguments.
112+
*/
113+
def mirrorSupportsDefaults: Boolean = self.isClass && self.asClass.tastyVersion.gteq(TastyVersion(28, 4, 1)) // TODO? cst somewhere
112114

113115
/** Is this an old style implicit conversion?
114116
* @param directOnly only consider explicitly written methods

compiler/src/dotty/tools/dotc/transform/SyntheticMembers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
671671
addParent(defn.Mirror_ProductClass.typeRef)
672672
addMethod(nme.fromProduct, MethodType(defn.ProductClass.typeRef :: Nil, monoType.typeRef), cls,
673673
fromProductBody(_, _, optInfo).ensureConforms(monoType.typeRef)) // t4758.scala or i3381.scala are examples where a cast is needed
674-
if cls.mirrorCanSupportDefaults && cls.primaryConstructor.hasDefaultParams then overrideMethod(
674+
if cls.mirrorSupportsDefaults && cls.primaryConstructor.hasDefaultParams then overrideMethod(
675675
nme.defaultArgument, MethodType(defn.IntType :: Nil, defn.AnyType), cls, defaultArgumentBody(_, _, optInfo))
676676
}
677677
def makeSumMirror(cls: Symbol, optInfo: Option[MirrorImpl.OfSum]) = {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
417417
val elemsLabels = TypeOps.nestedPairs(elemLabels)
418418

419419
val elemHasDefaults = accessors.map(acc =>
420-
ConstantType(Constant(cls.mirrorCanSupportDefaults && acc.is(HasDefault))))
420+
ConstantType(Constant(cls.mirrorSupportsDefaults && acc.is(HasDefault))))
421421
val elemsHasDefaults = TypeOps.nestedPairs(elemHasDefaults)
422422

423423
val typeElems = tps.getOrElse(accessors.map(mirroredType.resultType.memberInfo(_).widenExpr))
@@ -476,7 +476,7 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
476476
// case class `cls` changes. See `sbt-test/source-dependencies/mirror-product`.
477477
val rec = ctx.compilationUnit.depRecorder
478478
rec.addClassDependency(cls, DependencyByMemberRef)
479-
rec.addUsedName(cls.primaryConstructor) // TODO test when only adding default
479+
rec.addUsedName(cls.primaryConstructor)
480480
makeProductMirror(pre, cls, None)
481481
else withErrors(i"$cls is not a generic product because ${cls.whyNotGenericProduct}")
482482
case Left(msg) =>

sbt-test/scala3-compat/defaultArgument-mirrors-3.3/app/Main.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ package app {
4040
summon[OldMirrors.mOldFoo.MirroredElemHasDefaults <:< Tuple] // old mirrors do not have refinment
4141

4242
// OldBar: anon mirror => could implement defaultArgument
43-
// AR but should stay consistent with other mirrors of other old case classes
43+
// AR but should stay consistent with other mirrors for other old case classes
4444

4545
assert(NewMirrors.mOldBar ne lib.OldBar)
4646
assert(!foundDefaultArgument(NewMirrors.mOldBar))
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
case class MyProduct(x: Int)
2+
case class WillGetDefault(x: Int)
3+
case class WillChangeDefault(x: Int = 1)

sbt-test/source-dependencies/mirror-product/Test.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@ transparent inline def foo[T](using m: Mirror.Of[T]): Int =
66
case _: (Int *: EmptyTuple) => 1
77
case _: (Int *: String *: EmptyTuple) => 2
88

9+
def getDefault[T](using m: Mirror.ProductOf[T]): Any = m.defaultArgument(0)
10+
911
@main def Test =
1012
assert(foo[MyProduct] == 2)
13+
assert(getDefault[WillGetDefault] == 1)
14+
assert(getDefault[WillChangeDefault] == 2)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
case class MyProduct(x: Int, y: String)
2+
case class WillGetDefault(x: Int = 1)
3+
case class WillChangeDefault(x: Int = 2)

0 commit comments

Comments
 (0)