diff options
author | Martin Odersky <odersky@gmail.com> | 2010-03-08 13:34:57 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2010-03-08 13:34:57 +0000 |
commit | aff35a066a44b32ec343efe46c013424468cc6b4 (patch) | |
tree | c5e2196a731616878258ee9cd24127a9ea86a699 | |
parent | b6c6e8f35342409ace8cb33d4b0ff6c9f8862850 (diff) | |
download | scala-aff35a066a44b32ec343efe46c013424468cc6b4.tar.gz scala-aff35a066a44b32ec343efe46c013424468cc6b4.tar.bz2 scala-aff35a066a44b32ec343efe46c013424468cc6b4.zip |
Closes #3026. Review by extempore.
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala | 14 | ||||
-rwxr-xr-x | test/files/run/t2946/Parsers.scala | 4 | ||||
-rwxr-xr-x | test/files/run/t2946/ResponseCommon.scala | 14 | ||||
-rwxr-xr-x | test/files/run/t2946/Test.scala | 7 |
4 files changed, 34 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala index 5b1093d7c9..518602fe87 100644 --- a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala +++ b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala @@ -105,12 +105,9 @@ abstract class ExplicitOuter extends InfoTransform def transformInfo(sym: Symbol, tp: Type): Type = tp match { case MethodType(params, restpe1) => val restpe = transformInfo(sym, restpe1) - if (sym.owner.isTrait && ((sym hasFlag SUPERACCESSOR) || sym.isModule)) { // 5 + if (sym.owner.isTrait && ((sym hasFlag (ACCESSOR | SUPERACCESSOR)) || sym.isModule)) { // 5 sym.makeNotPrivate(sym.owner) } - // moved form the term transformer - if (sym.owner.isTrait && (sym hasFlag (ACCESSOR | SUPERACCESSOR))) - sym.makeNotPrivate(sym.owner); //(2) if (sym.owner.isTrait && (sym hasFlag PROTECTED)) sym setFlag notPROTECTED // 6 if (sym.isClassConstructor && isInner(sym.owner)) { // 1 val p = sym.newValueParameter(sym.pos, "arg" + nme.OUTER) @@ -154,7 +151,14 @@ abstract class ExplicitOuter extends InfoTransform if (restp eq restp1) tp else PolyType(tparams, restp1) case _ => - tp + // Local fields of traits need to be unconditionally unprivatized. + // Reason: Those fields might need to be unprivatized if referenced by an inner class. + // On the other hand, mixing in the trait into a separately compiled + // class needs to have a common naming scheme, independently of whether + // the field was accessed from an inner class or not. See #2946 + if (sym.owner.isTrait && (sym hasFlag LOCAL)) + sym.makeNotPrivate(sym.owner) + tp } /** A base class for transformers that maintain <code>outerParam</code> diff --git a/test/files/run/t2946/Parsers.scala b/test/files/run/t2946/Parsers.scala new file mode 100755 index 0000000000..c0961034c4 --- /dev/null +++ b/test/files/run/t2946/Parsers.scala @@ -0,0 +1,4 @@ +class Parser { + def parse(t: Any): Unit = { + } +} diff --git a/test/files/run/t2946/ResponseCommon.scala b/test/files/run/t2946/ResponseCommon.scala new file mode 100755 index 0000000000..fa9d8acccb --- /dev/null +++ b/test/files/run/t2946/ResponseCommon.scala @@ -0,0 +1,14 @@ +trait ResponseCommon extends Parser { + private[this] var paramsParser: Parser = null + def withParamsParser(parser: Parser) = {paramsParser = parser; this} + + class Foo { + println(paramsParser) + } + + override abstract def parse(t: Any): Unit = t match { + case ("params", value: List[_]) => value.foreach {paramsParser.parse(_)} + case _ => super.parse(t) + } +} + diff --git a/test/files/run/t2946/Test.scala b/test/files/run/t2946/Test.scala new file mode 100755 index 0000000000..e9d9896a0e --- /dev/null +++ b/test/files/run/t2946/Test.scala @@ -0,0 +1,7 @@ +class Test extends Parser with ResponseCommon + +object Test { + def main(args: Array[String]) { + new Test + } +} |