@@ -14,6 +14,7 @@ import NameKinds.ClassifiedNameKind
1414import ast .Trees ._
1515import util .Property
1616import util .Positions .Position
17+ import config .Printers .transforms
1718
1819/** A utility class for generating access proxies. Currently used for
1920 * inline accessors and protected accessors.
@@ -56,9 +57,11 @@ abstract class AccessProxies {
5657 def needsAccessor (sym : Symbol )(implicit ctx : Context ): Boolean
5758
5859 /** A fresh accessor symbol */
59- def newAccessorSymbol (accessed : Symbol , name : TermName , info : Type )(implicit ctx : Context ): TermSymbol =
60- ctx.newSymbol(accessed.owner.enclosingSubClass, name, Synthetic | Method ,
61- info, coord = accessed.pos).entered
60+ def newAccessorSymbol (owner : Symbol , name : TermName , info : Type , pos : Position )(implicit ctx : Context ): TermSymbol = {
61+ val sym = ctx.newSymbol(owner, name, Synthetic | Method , info, coord = pos).entered
62+ if (sym.allOverriddenSymbols.exists(! _.is(Deferred ))) sym.setFlag(Override )
63+ sym
64+ }
6265
6366 /** Create an accessor unless one exists already, and replace the original
6467 * access with a reference to the accessor.
@@ -73,14 +76,30 @@ abstract class AccessProxies {
7376
7477 def refersToAccessed (sym : Symbol ) = accessedBy.get(sym) == Some (accessed)
7578
76- val accessorInfo =
79+ val accessorClass = {
80+ def owningClass (start : Symbol ) =
81+ start.ownersIterator.findSymbol(_.derivesFrom(accessed.owner))
82+ val curCls = ctx.owner.enclosingClass
83+ var owner = owningClass(curCls) // `orElse` owningClass(curCls.linkedClass)
84+ if (! owner.exists) {
85+ transforms.println(i " ${curCls.ownersIterator.toList}%, % " )
86+ ctx.error(i " illegal access to protected ${accessed.showLocated} from $curCls" , reference.pos)
87+ owner = curCls
88+ }
89+ owner
90+ }
91+
92+ val accessorRawInfo =
7793 if (onLHS) MethodType (accessed.info :: Nil , defn.UnitType )
7894 else accessed.info.ensureMethodic
95+ val accessorInfo =
96+ accessorRawInfo.asSeenFrom(accessorClass.thisType, accessed.owner)
7997 val accessorName = nameKind(accessed.name)
98+
8099 val accessorSymbol =
81- accessed.owner .info.decl(accessorName).suchThat(refersToAccessed).symbol
100+ accessorClass .info.decl(accessorName).suchThat(refersToAccessed).symbol
82101 .orElse {
83- val acc = newAccessorSymbol(accessed , accessorName, accessorInfo)
102+ val acc = newAccessorSymbol(accessorClass , accessorName, accessorInfo, accessed.pos )
84103 accessedBy(acc) = accessed
85104 acc
86105 }
0 commit comments