diff options
author | Paul Phillips <paulp@improving.org> | 2013-06-03 17:42:15 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2013-06-03 17:42:15 -0700 |
commit | 1472dadd03496aa89624c81ded01edeb71420cc3 (patch) | |
tree | 9d25317ecd880de24c8a4218c88320813e855132 /src | |
parent | f89f2d969fa0ed0a6bf036a1f6a9cad8267a7265 (diff) | |
parent | d2faeb9ae60389668f1b5f45eb91c73127401e40 (diff) | |
download | scala-1472dadd03496aa89624c81ded01edeb71420cc3.tar.gz scala-1472dadd03496aa89624c81ded01edeb71420cc3.tar.bz2 scala-1472dadd03496aa89624c81ded01edeb71420cc3.zip |
Merge pull request #2609 from retronym/ticket/7507
SI-7507 Fix lookup of private[this] member in presence of self type.
Diffstat (limited to 'src')
-rw-r--r-- | src/reflect/scala/reflect/internal/Types.scala | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala index ee584bed2c..fc3f5de77f 100644 --- a/src/reflect/scala/reflect/internal/Types.scala +++ b/src/reflect/scala/reflect/internal/Types.scala @@ -1172,6 +1172,14 @@ trait Types extends api.Types { self: SymbolTable => continue = false val bcs0 = baseClasses var bcs = bcs0 + // omit PRIVATE LOCALS unless selector class is contained in class owning the def. + def admitPrivateLocal(owner: Symbol): Boolean = { + val selectorClass = this match { + case tt: ThisType => tt.sym // SI-7507 the first base class is not necessarily the selector class. + case _ => bcs0.head + } + selectorClass.hasTransOwner(owner) + } while (!bcs.isEmpty) { val decls = bcs.head.info.decls var entry = decls.lookupEntry(name) @@ -1181,10 +1189,10 @@ trait Types extends api.Types { self: SymbolTable => if ((flags & required) == required) { val excl = flags & excluded if (excl == 0L && - (// omit PRIVATE LOCALS unless selector class is contained in class owning the def. + ( (bcs eq bcs0) || (flags & PrivateLocal) != PrivateLocal || - (bcs0.head.hasTransOwner(bcs.head)))) { + admitPrivateLocal(bcs.head))) { if (name.isTypeName || stableOnly && sym.isStable) { if (Statistics.canEnable) Statistics.popTimer(typeOpsStack, start) if (suspension ne null) suspension foreach (_.suspended = false) |