diff options
author | Martin Odersky <odersky@gmail.com> | 2017-02-01 21:30:23 +1100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-02-01 21:30:23 +1100 |
commit | c1a37e13befe5a57ff2452e3a3470b1e0d8adb54 (patch) | |
tree | 24547d53c9779c7a5ef8c2251bab6c7476a963bb /compiler | |
parent | d087448fdffff8f64a23d9db39445455cddc2fc6 (diff) | |
download | dotty-c1a37e13befe5a57ff2452e3a3470b1e0d8adb54.tar.gz dotty-c1a37e13befe5a57ff2452e3a3470b1e0d8adb54.tar.bz2 dotty-c1a37e13befe5a57ff2452e3a3470b1e0d8adb54.zip |
Fix-#1723: Avoid private leaks on completion
As #1723 demonstrates, doing this at PostTyper is too late.
Diffstat (limited to 'compiler')
3 files changed, 6 insertions, 11 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index 51f08a295..dad433c4e 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -733,11 +733,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle // no longer necessary. goto(end) setPos(start, tree) - - // This is also done in PostTyper but needs to be redone here - if (!sym.is(SyntheticOrPrivate) && sym.owner.isClass) { - sym.info = Checking.checkNoPrivateLeaks(sym, tree.pos) - } + Checking.avoidPrivateLeaks(sym, tree.pos) tree } diff --git a/compiler/src/dotty/tools/dotc/transform/PostTyper.scala b/compiler/src/dotty/tools/dotc/transform/PostTyper.scala index e7c0df1b9..8dff58dea 100644 --- a/compiler/src/dotty/tools/dotc/transform/PostTyper.scala +++ b/compiler/src/dotty/tools/dotc/transform/PostTyper.scala @@ -107,12 +107,6 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisTran private def transformMemberDef(tree: MemberDef)(implicit ctx: Context): Unit = { val sym = tree.symbol sym.transformAnnotations(transformAnnot) - // Has to be redone in TreeUnpickler - if (!sym.is(SyntheticOrPrivate) && sym.owner.isClass) { - val info1 = Checking.checkNoPrivateLeaks(sym, tree.pos) - if (info1 ne sym.info) - sym.copySymDenotation(info = info1).installAfter(thisTransformer) - } } private def transformSelect(tree: Select, targs: List[Tree])(implicit ctx: Context): Tree = { diff --git a/compiler/src/dotty/tools/dotc/typer/Checking.scala b/compiler/src/dotty/tools/dotc/typer/Checking.scala index 321c275d7..13c3b7617 100644 --- a/compiler/src/dotty/tools/dotc/typer/Checking.scala +++ b/compiler/src/dotty/tools/dotc/typer/Checking.scala @@ -343,6 +343,7 @@ object Checking { fail(i"$sym cannot have the same name as ${cls.showLocated} -- class definitions cannot be overridden") sym.setFlag(Private) // break the overriding relationship by making sym Private } + avoidPrivateLeaks(sym, sym.pos) } /** Check the type signature of the symbol `M` defined by `tree` does not refer @@ -412,6 +413,10 @@ object Checking { info } + def avoidPrivateLeaks(sym: Symbol, pos: Position)(implicit ctx: Context) = + if (!sym.is(SyntheticOrPrivate) && sym.owner.isClass) + sym.info = checkNoPrivateLeaks(sym, pos) + /** Verify classes extending AnyVal meet the requirements */ def checkDerivedValueClass(clazz: Symbol, stats: List[Tree])(implicit ctx: Context) = { def checkValueClassMember(stat: Tree) = stat match { |