aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-02-01 21:30:23 +1100
committerMartin Odersky <odersky@gmail.com>2017-02-01 21:30:23 +1100
commitc1a37e13befe5a57ff2452e3a3470b1e0d8adb54 (patch)
tree24547d53c9779c7a5ef8c2251bab6c7476a963bb /compiler/src/dotty
parentd087448fdffff8f64a23d9db39445455cddc2fc6 (diff)
downloaddotty-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/src/dotty')
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala6
-rw-r--r--compiler/src/dotty/tools/dotc/transform/PostTyper.scala6
-rw-r--r--compiler/src/dotty/tools/dotc/typer/Checking.scala5
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 {