Skip to content

Commit 572471f

Browse files
committed
Change scheme to widen toplevel private
Doing it while desugaring does not always work since definitions might already have been indexed before desugaring happens, in which case the symbol gets duplicated. We do the widening in Namer instead.
1 parent 8278568 commit 572471f

File tree

4 files changed

+14
-9
lines changed

4 files changed

+14
-9
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,13 +1047,7 @@ object desugar {
10471047
else {
10481048
val sourceName = ctx.source.file.name.takeWhile(_ != '.')
10491049
val groupName = (sourceName ++ str.TOPLEVEL_SUFFIX).toTermName
1050-
val widenedStats = nestedStats.map {
1051-
case stat: MemberDef if stat.mods.is(Private) =>
1052-
stat.withMods((stat.mods &~ Private).withPrivateWithin(pdef.pid.name.toTypeName))
1053-
case stat =>
1054-
stat
1055-
}
1056-
val grouped = ModuleDef(groupName, Template(emptyConstructor, Nil, Nil, EmptyValDef, widenedStats))
1050+
val grouped = ModuleDef(groupName, Template(emptyConstructor, Nil, Nil, EmptyValDef, nestedStats))
10571051
cpy.PackageDef(pdef)(pdef.pid, topStats :+ grouped)
10581052
}
10591053
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,15 @@ class Namer { typer: Typer =>
310310
else name
311311
}
312312

313+
/** If effective owner is a package `p`, widen `private` to `private[p]` */
314+
def widenToplevelPrivate(sym: Symbol): Unit = {
315+
var owner = sym.effectiveOwner
316+
if (owner.is(Package)) {
317+
sym.resetFlag(Private)
318+
sym.privateWithin = owner
319+
}
320+
}
321+
313322
/** Create new symbol or redefine existing symbol under lateCompile. */
314323
def createOrRefine[S <: Symbol](
315324
tree: MemberDef, name: Name, flags: FlagSet, infoFn: S => Type,
@@ -325,6 +334,8 @@ class Namer { typer: Typer =>
325334
prev
326335
}
327336
else symFn(flags, infoFn, privateWithinClass(tree.mods))
337+
if (sym.is(Private))
338+
widenToplevelPrivate(sym)
328339
recordSym(sym, tree)
329340
}
330341

tests/neg/toplevel-privates/A.scala renamed to tests/neg/toplevel-privates/A_1.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package p22
1+
package p
22

33
private val x = 10
44

55
val y = x
66

7-
private[p22] val xx = 10
7+
private[p] val xx = 10
88

99
val yy = xx
1010

0 commit comments

Comments
 (0)