@@ -1096,6 +1096,17 @@ class Namer { typer: Typer =>
1096
1096
else Yes
1097
1097
}
1098
1098
1099
+ def foreachDefaultGetterOf (sym : TermSymbol , op : TermSymbol => Unit ): Unit =
1100
+ var n = 0
1101
+ for params <- sym.paramSymss; param <- params do
1102
+ if param.isTerm then
1103
+ if param.is(HasDefault ) then
1104
+ val getterName = DefaultGetterName (sym.name, n)
1105
+ val getter = path.tpe.member(DefaultGetterName (sym.name, n)).symbol
1106
+ assert(getter.exists, i " $path does not have a default getter named $getterName" )
1107
+ op(getter.asTerm)
1108
+ n += 1
1109
+
1099
1110
/** Add a forwarder with name `alias` or its type name equivalent to `mbr`,
1100
1111
* provided `mbr` is accessible and of the right implicit/non-implicit kind.
1101
1112
*/
@@ -1118,6 +1129,7 @@ class Namer { typer: Typer =>
1118
1129
1119
1130
if canForward(mbr) == CanForward .Yes then
1120
1131
val sym = mbr.symbol
1132
+ val hasDefaults = sym.hasDefaultParams // compute here to ensure HasDefaultParams and NoDefaultParams flags are set
1121
1133
val forwarder =
1122
1134
if mbr.isType then
1123
1135
val forwarderName = checkNoConflict(alias.toTypeName, isPrivate = false , span)
@@ -1142,28 +1154,29 @@ class Namer { typer: Typer =>
1142
1154
(StableRealizable , ExprType (path.tpe.select(sym)))
1143
1155
else
1144
1156
(EmptyFlags , mbr.info.ensureMethodic)
1145
- var mbrFlags = Exported | Method | Final | maybeStable | sym.flags & RetainedExportFlags
1157
+ var flagMask = RetainedExportFlags
1158
+ if sym.isTerm then flagMask |= HasDefaultParams | NoDefaultParams
1159
+ var mbrFlags = Exported | Method | Final | maybeStable | sym.flags & flagMask
1146
1160
if sym.is(ExtensionMethod ) then mbrFlags |= ExtensionMethod
1147
1161
val forwarderName = checkNoConflict(alias, isPrivate = false , span)
1148
1162
newSymbol(cls, forwarderName, mbrFlags, mbrInfo, coord = span)
1149
1163
1150
1164
forwarder.info = avoidPrivateLeaks(forwarder)
1151
- forwarder.addAnnotations(sym.annotations)
1152
-
1153
- val forwarderDef =
1154
- if (forwarder.isType) tpd.TypeDef (forwarder.asType)
1155
- else {
1156
- import tpd ._
1157
- val ref = path.select(sym.asTerm)
1158
- val ddef = tpd.DefDef (forwarder.asTerm, prefss =>
1159
- ref.appliedToArgss(adaptForwarderParams(Nil , sym.info, prefss))
1160
- )
1161
- if forwarder.isInlineMethod then
1162
- PrepareInlineable .registerInlineInfo(forwarder, ddef.rhs)
1163
- ddef
1164
- }
1165
+ forwarder.addAnnotations(sym.annotations.filterConserve(_.symbol != defn.BodyAnnot ))
1165
1166
1166
- buf += forwarderDef.withSpan(span)
1167
+ if forwarder.isType then
1168
+ buf += tpd.TypeDef (forwarder.asType).withSpan(span)
1169
+ else
1170
+ import tpd ._
1171
+ val ref = path.select(sym.asTerm)
1172
+ val ddef = tpd.DefDef (forwarder.asTerm, prefss =>
1173
+ ref.appliedToArgss(adaptForwarderParams(Nil , sym.info, prefss)))
1174
+ if forwarder.isInlineMethod then
1175
+ PrepareInlineable .registerInlineInfo(forwarder, ddef.rhs)
1176
+ buf += ddef.withSpan(span)
1177
+ if hasDefaults then
1178
+ foreachDefaultGetterOf(sym.asTerm,
1179
+ getter => addForwarder(getter.name.asTermName, getter, span))
1167
1180
end addForwarder
1168
1181
1169
1182
def addForwardersNamed (name : TermName , alias : TermName , span : Span ): Unit =
@@ -1187,11 +1200,15 @@ class Namer { typer: Typer =>
1187
1200
def isCaseClassSynthesized (mbr : Symbol ) =
1188
1201
fromCaseClass && defn.caseClassSynthesized.contains(mbr)
1189
1202
for mbr <- path.tpe.membersBasedOnFlags(required = EmptyFlags , excluded = PrivateOrSynthetic ) do
1190
- if ! mbr.symbol.isSuperAccessor && ! isCaseClassSynthesized(mbr.symbol) then
1191
- // Scala 2 superaccessors have neither Synthetic nor Artfact set, so we
1192
- // need to filter them out here (by contrast, Scala 3 superaccessors are Artifacts)
1193
- // Symbols from base traits of case classes that will get synthesized implementations
1194
- // at PostTyper are also excluded.
1203
+ if ! mbr.symbol.isSuperAccessor
1204
+ // Scala 2 superaccessors have neither Synthetic nor Artfact set, so we
1205
+ // need to filter them out here (by contrast, Scala 3 superaccessors are Artifacts)
1206
+ // Symbols from base traits of case classes that will get synthesized implementations
1207
+ // at PostTyper are also excluded.
1208
+ && ! isCaseClassSynthesized(mbr.symbol)
1209
+ && ! mbr.symbol.name.is(DefaultGetterName )
1210
+ // default getters are exported with the members they belong to
1211
+ then
1195
1212
val alias = mbr.name.toTermName
1196
1213
if mbr.symbol.is(Given ) then
1197
1214
if ! seen.contains(alias) && mbr.matchesImportBound(givenBound) then
0 commit comments