Skip to content

Commit f648faa

Browse files
committed
Namer: set privateWithin at symbol creation time
First step towards making `privateWithin` force less.
1 parent ccde318 commit f648faa

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

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

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -311,32 +311,31 @@ class Namer { typer: Typer =>
311311
else name
312312
}
313313

314-
/** If effective owner is a package `p`, widen `private` to `private[p]` */
315-
def widenToplevelPrivate(sym: Symbol): Unit = {
316-
var owner = sym.effectiveOwner
317-
if (owner.is(Package)) {
318-
sym.resetFlag(Private)
319-
sym.privateWithin = owner
320-
}
321-
}
322-
323314
/** Create new symbol or redefine existing symbol under lateCompile. */
324315
def createOrRefine[S <: Symbol](
325-
tree: MemberDef, name: Name, flags: FlagSet, infoFn: S => Type,
316+
tree: MemberDef, name: Name, flags: FlagSet, owner: Symbol, infoFn: S => Type,
326317
symFn: (FlagSet, S => Type, Symbol) => S): Symbol = {
327318
val prev =
328319
if (lateCompile && ctx.owner.is(Package)) ctx.effectiveScope.lookup(name)
329320
else NoSymbol
321+
322+
var flags1 = flags
323+
var privateWithin = privateWithinClass(tree.mods)
324+
val effectiveOwner = owner.skipWeakOwner
325+
if (flags.is(Private) && effectiveOwner.is(Package)) {
326+
// If effective owner is a package p, widen private to private[p]
327+
flags1 = flags1 &~ Private
328+
privateWithin = effectiveOwner
329+
}
330+
330331
val sym =
331332
if (prev.exists) {
332-
prev.flags = flags
333+
prev.flags = flags1
333334
prev.info = infoFn(prev.asInstanceOf[S])
334-
prev.privateWithin = privateWithinClass(tree.mods)
335+
prev.privateWithin = privateWithin
335336
prev
336337
}
337-
else symFn(flags, infoFn, privateWithinClass(tree.mods))
338-
if (sym.is(Private))
339-
widenToplevelPrivate(sym)
338+
else symFn(flags1, infoFn, privateWithin)
340339
recordSym(sym, tree)
341340
}
342341

@@ -345,7 +344,7 @@ class Namer { typer: Typer =>
345344
val name = checkNoConflict(tree.name).asTypeName
346345
val flags = checkFlags(tree.mods.flags &~ DelegateOrImplicit)
347346
val cls =
348-
createOrRefine[ClassSymbol](tree, name, flags,
347+
createOrRefine[ClassSymbol](tree, name, flags, ctx.owner,
349348
cls => adjustIfModule(new ClassCompleter(cls, tree)(ctx), tree),
350349
ctx.newClassSymbol(ctx.owner, name, _, _, _, tree.nameSpan, ctx.source.file))
351350
cls.completer.asInstanceOf[ClassCompleter].init()
@@ -381,7 +380,7 @@ class Namer { typer: Typer =>
381380
}
382381
val info = adjustIfModule(completer, tree)
383382
createOrRefine[Symbol](tree, name, flags | deferred | method | higherKinded,
384-
_ => info,
383+
ctx.owner, _ => info,
385384
(fs, _, pwithin) => ctx.newSymbol(ctx.owner, name, fs, info, pwithin, tree.nameSpan))
386385
case tree: Import =>
387386
recordSym(ctx.newImportSymbol(ctx.owner, new Completer(tree), tree.span), tree)

0 commit comments

Comments
 (0)