Skip to content

Commit 2b045cc

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 4d82464 commit 2b045cc

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
@@ -979,13 +979,7 @@ object desugar {
979979
else {
980980
val sourceName = ctx.source.file.name.takeWhile(_ != '.')
981981
val groupName = (sourceName ++ str.TOPLEVEL_SUFFIX).toTermName
982-
val widenedStats = nestedStats.map {
983-
case stat: MemberDef if stat.mods.is(Private) =>
984-
stat.withMods((stat.mods &~ Private).withPrivateWithin(pdef.pid.name.toTypeName))
985-
case stat =>
986-
stat
987-
}
988-
val grouped = ModuleDef(groupName, Template(emptyConstructor, Nil, Nil, EmptyValDef, widenedStats))
982+
val grouped = ModuleDef(groupName, Template(emptyConstructor, Nil, Nil, EmptyValDef, nestedStats))
989983
cpy.PackageDef(pdef)(pdef.pid, topStats :+ grouped)
990984
}
991985
}

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)