summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2012-08-07 08:54:20 -0700
committerAdriaan Moors <adriaan.moors@epfl.ch>2012-08-07 08:54:20 -0700
commitd8b35a11d67c2a597f1d93456b341a650b542520 (patch)
tree42fdf4842376594a91301e6f7674b5b5d51e3cf1 /src
parentbd71c84adcaafb21de8801d547a49aacfd4956cc (diff)
parent90533942f06553178d2d453434f5836503e565b2 (diff)
downloadscala-d8b35a11d67c2a597f1d93456b341a650b542520.tar.gz
scala-d8b35a11d67c2a597f1d93456b341a650b542520.tar.bz2
scala-d8b35a11d67c2a597f1d93456b341a650b542520.zip
Merge pull request #1077 from odersky/topic/inline
Makes all private variables accessed from an @inline method non-private.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
index 13cbfacb61..6fba6dcc39 100644
--- a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
+++ b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
@@ -46,13 +46,13 @@ abstract class ExplicitOuter extends InfoTransform
private def haveSameOuter(parent: Type, clazz: Symbol) = parent match {
case TypeRef(pre, sym, _) =>
val owner = clazz.owner
-
+
//println(s"have same outer $parent $clazz $sym ${sym.owner} $owner $pre")
sym.isClass && owner.isClass &&
- (owner isSubClass sym.owner) &&
+ (owner isSubClass sym.owner) &&
owner.thisType =:= pre
-
+
case _ => false
}
@@ -497,8 +497,18 @@ abstract class ExplicitOuter extends InfoTransform
else atPos(tree.pos)(outerPath(outerValue, currentClass.outerClass, sym)) // (5)
case Select(qual, name) =>
- if (currentClass != sym.owner) // (3)
+ /** return closest enclosing method, unless shadowed by an enclosing class;
+ * no use of closures here in the interest of speed.
+ */
+ def closestEnclMethod(from: Symbol): Symbol =
+ if (from.isSourceMethod) from
+ else if (from.isClass) NoSymbol
+ else closestEnclMethod(from.owner)
+
+ if (currentClass != sym.owner ||
+ (closestEnclMethod(currentOwner) hasAnnotation ScalaInlineClass))
sym.makeNotPrivate(sym.owner)
+
val qsym = qual.tpe.widen.typeSymbol
if (sym.isProtected && //(4)
(qsym.isTrait || !(qual.isInstanceOf[Super] || (qsym isSubClass currentClass))))