@@ -1064,11 +1064,23 @@ class Namer { typer: Typer =>
1064
1064
/** The forwarders defined by export `exp` */
1065
1065
private def exportForwarders (exp : Export )(using Context ): List [tpd.MemberDef ] =
1066
1066
val buf = new mutable.ListBuffer [tpd.MemberDef ]
1067
- val Export (expr, selectors ) = exp
1067
+ val Export (expr, selectors0 ) = exp
1068
1068
if expr.isEmpty then
1069
1069
report.error(em " Export selector must have prefix and `.` " , exp.srcPos)
1070
1070
return Nil
1071
1071
1072
+ val renamed = mutable.Set [Name ]()
1073
+ val selectors = selectors0 map {
1074
+ case sel @ ImportSelector (imported, id @ Ident (alias), bound) if alias != nme.WILDCARD =>
1075
+ if renamed.contains(alias) then
1076
+ report.error(i " duplicate rename target " , id.srcPos)
1077
+ cpy.ImportSelector (sel)(imported, EmptyTree , bound).asInstanceOf [ImportSelector ]
1078
+ else
1079
+ renamed += alias
1080
+ sel
1081
+ case sel => sel
1082
+ }
1083
+
1072
1084
val path = typedAheadExpr(expr, AnySelectionProto )
1073
1085
checkLegalExportPath(path, selectors)
1074
1086
lazy val wildcardBound = importBound(selectors, isGiven = false )
@@ -1083,6 +1095,8 @@ class Namer { typer: Typer =>
1083
1095
Skip
1084
1096
else if cls.derivesFrom(sym.owner) && (sym.owner == cls || ! sym.is(Deferred )) then
1085
1097
No (i " is already a member of $cls" )
1098
+ else if renamed.contains(sym.name.toTermName) then
1099
+ No (i " clashes with a renamed export " )
1086
1100
else if sym.is(Override ) then
1087
1101
sym.allOverriddenSymbols.find(
1088
1102
other => cls.derivesFrom(other.owner) && ! other.is(Deferred )
0 commit comments