@@ -1070,6 +1070,26 @@ class Namer { typer: Typer =>
10701070 else Yes
10711071 }
10721072
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+
10731093 /** Add a forwarder with name `alias` or its type name equivalent to `mbr`,
10741094 * provided `mbr` is accessible and of the right implicit/non-implicit kind.
10751095 */
@@ -1125,20 +1145,18 @@ class Namer { typer: Typer =>
11251145 forwarder.info = avoidPrivateLeaks(forwarder)
11261146 forwarder.addAnnotations(sym.annotations)
11271147
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)
11421160 end addForwarder
11431161
11441162 def addForwardersNamed (name : TermName , alias : TermName , span : Span ): Unit =
@@ -1162,11 +1180,15 @@ class Namer { typer: Typer =>
11621180 def isCaseClassSynthesized (mbr : Symbol ) =
11631181 fromCaseClass && defn.caseClassSynthesized.contains(mbr)
11641182 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
11701192 val alias = mbr.name.toTermName
11711193 if mbr.symbol.is(Given ) then
11721194 if ! seen.contains(alias) && mbr.matchesImportBound(givenBound) then
0 commit comments