@@ -1070,6 +1070,26 @@ class Namer { typer: Typer =>
1070
1070
else Yes
1071
1071
}
1072
1072
1073
+ def defaultGetters (sym : TermSymbol ): List [Symbol ] =
1074
+ def recur (params : List [Symbol ], paramss : List [List [Symbol ]], n : Int ): List [Symbol ] =
1075
+ params match
1076
+ case param :: params1 =>
1077
+ def otherGetters =
1078
+ recur(params1, paramss, if param.isType then n else n + 1 )
1079
+ if param.is(HasDefault ) then
1080
+ val getterName = DefaultGetterName (sym.name, n)
1081
+ val getter = path.tpe.member(DefaultGetterName (sym.name, n)).symbol
1082
+ assert(getter.exists, i " $path does not have a default getter named $getterName" )
1083
+ getter :: otherGetters
1084
+ else
1085
+ otherGetters
1086
+ case Nil =>
1087
+ paramss match
1088
+ case params1 :: paramss1 => recur(params1, paramss1, n)
1089
+ case Nil => Nil
1090
+ recur(Nil , sym.paramSymss, 0 )
1091
+ .showing(i " default getters of $sym, ${sym.paramSymss.nestedMap(_.flagsString)} = $result" )
1092
+
1073
1093
/** Add a forwarder with name `alias` or its type name equivalent to `mbr`,
1074
1094
* provided `mbr` is accessible and of the right implicit/non-implicit kind.
1075
1095
*/
@@ -1125,20 +1145,18 @@ class Namer { typer: Typer =>
1125
1145
forwarder.info = avoidPrivateLeaks(forwarder)
1126
1146
forwarder.addAnnotations(sym.annotations)
1127
1147
1128
- val forwarderDef =
1129
- if (forwarder.isType) tpd.TypeDef (forwarder.asType)
1130
- else {
1131
- import tpd ._
1132
- val ref = path.select(sym.asTerm)
1133
- val ddef = tpd.DefDef (forwarder.asTerm, prefss =>
1134
- ref.appliedToArgss(adaptForwarderParams(Nil , sym.info, prefss))
1135
- )
1136
- if forwarder.isInlineMethod then
1137
- PrepareInlineable .registerInlineInfo(forwarder, ddef.rhs)
1138
- ddef
1139
- }
1140
-
1141
- buf += forwarderDef.withSpan(span)
1148
+ if forwarder.isType then
1149
+ buf += tpd.TypeDef (forwarder.asType).withSpan(span)
1150
+ else
1151
+ import tpd ._
1152
+ val ref = path.select(sym.asTerm)
1153
+ val ddef = tpd.DefDef (forwarder.asTerm, prefss =>
1154
+ ref.appliedToArgss(adaptForwarderParams(Nil , sym.info, prefss)))
1155
+ if forwarder.isInlineMethod then
1156
+ PrepareInlineable .registerInlineInfo(forwarder, ddef.rhs)
1157
+ buf += ddef.withSpan(span)
1158
+ for getter <- defaultGetters(sym.asTerm) do
1159
+ addForwarder(getter.name.asTermName, getter, span)
1142
1160
end addForwarder
1143
1161
1144
1162
def addForwardersNamed (name : TermName , alias : TermName , span : Span ): Unit =
@@ -1162,11 +1180,15 @@ class Namer { typer: Typer =>
1162
1180
def isCaseClassSynthesized (mbr : Symbol ) =
1163
1181
fromCaseClass && defn.caseClassSynthesized.contains(mbr)
1164
1182
for mbr <- path.tpe.membersBasedOnFlags(required = EmptyFlags , excluded = PrivateOrSynthetic ) do
1165
- if ! mbr.symbol.isSuperAccessor && ! isCaseClassSynthesized(mbr.symbol) then
1166
- // Scala 2 superaccessors have neither Synthetic nor Artfact set, so we
1167
- // need to filter them out here (by contrast, Scala 3 superaccessors are Artifacts)
1168
- // Symbols from base traits of case classes that will get synthesized implementations
1169
- // at PostTyper are also excluded.
1183
+ if ! mbr.symbol.isSuperAccessor
1184
+ // Scala 2 superaccessors have neither Synthetic nor Artfact set, so we
1185
+ // need to filter them out here (by contrast, Scala 3 superaccessors are Artifacts)
1186
+ // Symbols from base traits of case classes that will get synthesized implementations
1187
+ // at PostTyper are also excluded.
1188
+ && ! isCaseClassSynthesized(mbr.symbol)
1189
+ && ! mbr.symbol.name.is(DefaultGetterName )
1190
+ // default getters are exported with the members they belong to
1191
+ then
1170
1192
val alias = mbr.name.toTermName
1171
1193
if mbr.symbol.is(Given ) then
1172
1194
if ! seen.contains(alias) && mbr.matchesImportBound(givenBound) then
0 commit comments