Skip to content

Commit 247917c

Browse files
Adapt mirror synthesis for old classes
1 parent 8194afb commit 247917c

File tree

3 files changed

+14
-3
lines changed

3 files changed

+14
-3
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import Constants.Constant
1616
import Annotations.Annotation
1717
import Phases.*
1818
import ast.tpd.Literal
19+
import dotty.tools.tasty.TastyHeaderUnpickler.TastyVersion
1920
import transform.Mixin
2021

2122
import dotty.tools.dotc.transform.sjs.JSSymUtils.sjsNeedsField
@@ -115,6 +116,15 @@ class SymUtils:
115116

116117
def isGenericProduct(using Context): Boolean = whyNotGenericProduct.isEmpty
117118

119+
/** Is a case class for which mirrors support access to default arguments.
120+
*/
121+
def mirrorSupportsDefaultArguments(using Context): Boolean =
122+
!self.is(JavaDefined) && !self.is(Scala2x) && self.isClass && {
123+
// val tastyVersion: TastyVersion = ???
124+
// tastyVersion.major == 28 && tastyVersion.minor >= 4
125+
true // TODO
126+
}
127+
118128
/** Is this an old style implicit conversion?
119129
* @param directOnly only consider explicitly written methods
120130
* @param forImplicitClassOnly only consider methods generated from implicit classes

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -666,8 +666,8 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
666666
addParent(defn.Mirror_ProductClass.typeRef)
667667
addMethod(nme.fromProduct, MethodType(defn.ProductClass.typeRef :: Nil, monoType.typeRef), cls,
668668
fromProductBody(_, _, optInfo).ensureConforms(monoType.typeRef)) // t4758.scala or i3381.scala are examples where a cast is needed
669-
if cls.primaryConstructor.hasDefaultParams then overrideMethod(nme.defaultArgument,
670-
MethodType(defn.IntType :: Nil, defn.AnyType), cls, defaultArgumentBody(_, _, optInfo))
669+
if cls.mirrorSupportsDefaultArguments && cls.primaryConstructor.hasDefaultParams then overrideMethod(
670+
nme.defaultArgument, MethodType(defn.IntType :: Nil, defn.AnyType), cls, defaultArgumentBody(_, _, optInfo))
671671
}
672672
def makeSumMirror(cls: Symbol, optInfo: Option[MirrorImpl.OfSum]) = {
673673
addParent(defn.Mirror_SumClass.typeRef)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,8 @@ class Synthesizer(typer: Typer)(using @constructorOnly c: Context):
411411
val elemLabels = accessors.map(acc => ConstantType(Constant(acc.name.toString)))
412412
val elemsLabels = TypeOps.nestedPairs(elemLabels)
413413

414-
val elemHasDefaults = accessors.map(acc => ConstantType(Constant(acc.is(HasDefault))))
414+
val supportsDefaults = cls.mirrorSupportsDefaultArguments
415+
val elemHasDefaults = accessors.map(acc => ConstantType(Constant(supportsDefaults && acc.is(HasDefault))))
415416
val elemsHasDefaults = TypeOps.nestedPairs(elemHasDefaults)
416417

417418
val typeElems = tps.getOrElse(accessors.map(mirroredType.resultType.memberInfo(_).widenExpr))

0 commit comments

Comments
 (0)