Skip to content

Commit f72209f

Browse files
committed
Respect export alias for default arg forwarder
1 parent 2d0e373 commit f72209f

File tree

2 files changed

+30
-12
lines changed

2 files changed

+30
-12
lines changed

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

+12-12
Original file line numberDiff line numberDiff line change
@@ -1175,20 +1175,21 @@ class Namer { typer: Typer =>
11751175
Yes
11761176
}
11771177

1178-
def foreachDefaultGetterOf(sym: TermSymbol, op: TermSymbol => Unit): Unit =
1178+
def foreachDefaultGetterOf(sym: TermSymbol, alias: TermName)(op: (TermSymbol, TermName) => Unit): Unit =
11791179
var n = 0
1180-
val methodName =
1181-
if sym.name == nme.apply && sym.is(Synthetic) && sym.owner.companionClass.is(Case) then
1182-
// The synthesized `apply` methods of case classes use the constructor's default getters
1183-
nme.CONSTRUCTOR
1184-
else sym.name
1180+
// The synthesized `apply` methods of case classes use the constructor's default getters
1181+
val useConstructor = sym.name == nme.apply && sym.is(Synthetic) && sym.owner.companionClass.is(Case)
1182+
val methodName = if useConstructor then nme.CONSTRUCTOR else sym.name
1183+
val aliasedName = if useConstructor then nme.CONSTRUCTOR else alias
1184+
val useAliased = !useConstructor && methodName != aliasedName
11851185
for params <- sym.paramSymss; param <- params do
11861186
if param.isTerm then
11871187
if param.is(HasDefault) then
11881188
val getterName = DefaultGetterName(methodName, n)
11891189
val getter = pathType.member(getterName).symbol
11901190
assert(getter.exists, i"$path does not have a default getter named $getterName")
1191-
op(getter.asTerm)
1191+
val targetName = if useAliased then DefaultGetterName(aliasedName, n) else getterName
1192+
op(getter.asTerm, targetName)
11921193
n += 1
11931194

11941195
/** Add a forwarder with name `alias` or its type name equivalent to `mbr`,
@@ -1310,9 +1311,8 @@ class Namer { typer: Typer =>
13101311
})
13111312
buf += ddef.withSpan(span)
13121313
if hasDefaults then
1313-
foreachDefaultGetterOf(sym.asTerm,
1314-
getter => addForwarder(
1315-
getter.name.asTermName, getter.asSeenFrom(path.tpe), span))
1314+
foreachDefaultGetterOf(sym.asTerm, alias): (getter, getterName) =>
1315+
addForwarder(getterName, getter.asSeenFrom(path.tpe), span)
13161316

13171317
// adding annotations and flags at the parameter level
13181318
// TODO: This probably needs to be filtered to avoid adding some annotation
@@ -1367,13 +1367,13 @@ class Namer { typer: Typer =>
13671367
addWildcardForwardersNamed(alias, span)
13681368

13691369
def addForwarders(sels: List[untpd.ImportSelector], seen: List[TermName]): Unit = sels match
1370-
case sel :: sels1 =>
1370+
case sel :: sels =>
13711371
if sel.isWildcard then
13721372
addWildcardForwarders(seen, sel.span)
13731373
else
13741374
if !sel.isUnimport then
13751375
addForwardersNamed(sel.name, sel.rename, sel.span)
1376-
addForwarders(sels1, sel.name :: seen)
1376+
addForwarders(sels, sel.name :: seen)
13771377
case _ =>
13781378

13791379
/** Avoid a clash of export forwarder `forwarder` with other forwarders in `forwarders`.

tests/run/i19587.scala

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
case class Foo(bar: String, baz: Int)
2+
object Foo:
3+
def withDefaults(bar: String = "", baz: Int = 42) = Foo(bar, baz)
4+
5+
object Test1:
6+
export Foo.withDefaults
7+
8+
object Test2:
9+
export Foo.withDefaults as fooWithDefaults
10+
11+
@main def Test =
12+
// this works
13+
assert:
14+
Test1.withDefaults("test1") == Foo("test1", 42)
15+
16+
// this doesn't work
17+
assert:
18+
Test2.fooWithDefaults("test2") == Foo("test2", 42)

0 commit comments

Comments
 (0)