diff options
author | Antonio Cunei <antonio.cunei@epfl.ch> | 2011-11-07 16:43:06 +0000 |
---|---|---|
committer | Antonio Cunei <antonio.cunei@epfl.ch> | 2011-11-07 16:43:06 +0000 |
commit | 529127bacaccbcf1f54062d635fc5a4b0c212c4f (patch) | |
tree | 86e982214d83c11ddea72b4f52f196fdbcb1a414 | |
parent | da929738ccfcf21cc3d8fdb9ce7734e59c6847f0 (diff) | |
download | scala-529127bacaccbcf1f54062d635fc5a4b0c212c4f.tar.gz scala-529127bacaccbcf1f54062d635fc5a4b0c212c4f.tar.bz2 scala-529127bacaccbcf1f54062d635fc5a4b0c212c4f.zip |
Backported r25904 and r25959.
-rw-r--r-- | src/compiler/scala/tools/nsc/interactive/Global.scala | 18 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 2 | ||||
-rw-r--r-- | test/files/pos/t5013/Bar_2.scala | 5 | ||||
-rw-r--r-- | test/files/pos/t5013/Foo_1.scala | 5 |
4 files changed, 26 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala index c7a4204222..1bbaef9912 100644 --- a/src/compiler/scala/tools/nsc/interactive/Global.scala +++ b/src/compiler/scala/tools/nsc/interactive/Global.scala @@ -834,6 +834,11 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") } } + def addNonShadowed(other: Members[M]) = { + for ((name, ms) <- other) + if (ms.nonEmpty && this(name).isEmpty) this(name) = ms + } + def allMembers: List[M] = values.toList.flatten } @@ -842,31 +847,38 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "") typedTreeAt(pos) // to make sure context is entered val context = doLocateContext(pos) val locals = new Members[ScopeMember] + val enclosing = new Members[ScopeMember] def addScopeMember(sym: Symbol, pre: Type, viaImport: Tree) = locals.add(sym, pre, false) { (s, st) => new ScopeMember(s, st, context.isAccessible(s, pre, false), viaImport) } + def localsToEnclosing() = { + enclosing.addNonShadowed(locals) + locals.clear() + } //print("add scope members") var cx = context while (cx != NoContext) { for (sym <- cx.scope) addScopeMember(sym, NoPrefix, EmptyTree) + localsToEnclosing() if (cx == cx.enclClass) { val pre = cx.prefix for (sym <- pre.members) addScopeMember(sym, pre, EmptyTree) + localsToEnclosing() } cx = cx.outer } //print("\nadd imported members") for (imp <- context.imports) { val pre = imp.qual.tpe - for (sym <- imp.allImportedSymbols) { + for (sym <- imp.allImportedSymbols) addScopeMember(sym, pre, imp.qual) - } + localsToEnclosing() } // println() - val result = locals.allMembers + val result = enclosing.allMembers // if (debugIDE) for (m <- result) println(m) result } diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index dfe07ed33b..76cdf2e9c8 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -145,7 +145,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT checkCompanionNameClashes(sym) val decls = sym.info.decls for (s <- decls.toList) { - if (s.privateWithin.isClass && !s.privateWithin.isModuleClass && + if (s.privateWithin.isClass && !s.isProtected && !s.privateWithin.isModuleClass && !s.hasFlag(EXPANDEDNAME) && !s.isConstructor) { decls.unlink(s) s.expandName(s.privateWithin) diff --git a/test/files/pos/t5013/Bar_2.scala b/test/files/pos/t5013/Bar_2.scala new file mode 100644 index 0000000000..9eac556a23 --- /dev/null +++ b/test/files/pos/t5013/Bar_2.scala @@ -0,0 +1,5 @@ +package b + +class Bar extends a.Foo { + println(x) // Error: Not found: value x +} diff --git a/test/files/pos/t5013/Foo_1.scala b/test/files/pos/t5013/Foo_1.scala new file mode 100644 index 0000000000..ee21112a3e --- /dev/null +++ b/test/files/pos/t5013/Foo_1.scala @@ -0,0 +1,5 @@ +package a + +class Foo { + protected[Foo] var x = 0 +} |