@@ -47,7 +47,8 @@ abstract class AccessProxies {
47
47
if (passReceiverAsArg(accessor.name))
48
48
(argss.head.head.select(accessed), tps.takeRight(numTypeParams), argss.tail)
49
49
else
50
- (ref(TermRef (cls.thisType, accessed)), tps, argss)
50
+ (if (accessed.isStatic) ref(accessed) else ref(TermRef (cls.thisType, accessed)),
51
+ tps, argss)
51
52
val rhs =
52
53
if (accessor.name.isSetterName &&
53
54
forwardedArgss.nonEmpty && forwardedArgss.head.nonEmpty) // defensive conditions
@@ -70,6 +71,11 @@ abstract class AccessProxies {
70
71
def accessorNameKind : ClassifiedNameKind
71
72
def needsAccessor (sym : Symbol )(implicit ctx : Context ): Boolean
72
73
74
+ def ifNoHost (reference : RefTree )(implicit ctx : Context ): Tree = {
75
+ assert(false , " no host found for $reference with ${reference.symbol.showLocated} from ${ctx.owner}" )
76
+ reference
77
+ }
78
+
73
79
/** A fresh accessor symbol */
74
80
private def newAccessorSymbol (owner : Symbol , name : TermName , info : Type , pos : Position )(implicit ctx : Context ): TermSymbol = {
75
81
val sym = ctx.newSymbol(owner, name, Synthetic | Method , info, coord = pos).entered
@@ -125,18 +131,14 @@ abstract class AccessProxies {
125
131
def useAccessor (reference : RefTree )(implicit ctx : Context ): Tree = {
126
132
val accessed = reference.symbol.asTerm
127
133
var accessorClass = hostForAccessorOf(accessed : Symbol )
128
- if (! accessorClass.exists) {
129
- val curCls = ctx.owner.enclosingClass
130
- transforms.println( i " ${curCls.ownersIterator.toList} %, % " )
131
- ctx.error( i " illegal access to protected ${ accessed.showLocated} from $curCls " ,
132
- reference.pos )
133
- accessorClass = curCls
134
+ if (accessorClass.exists) {
135
+ val accessorName = accessorNameKind(accessed.name)
136
+ val accessorInfo =
137
+ accessed.info.ensureMethodic.asSeenFrom(accessorClass.thisType, accessed.owner)
138
+ val accessor = accessorSymbol(accessorClass, accessorName, accessorInfo, accessed )
139
+ rewire(reference, accessor)
134
140
}
135
- val accessorName = accessorNameKind(accessed.name)
136
- val accessorInfo =
137
- accessed.info.ensureMethodic.asSeenFrom(accessorClass.thisType, accessed.owner)
138
- val accessor = accessorSymbol(accessorClass, accessorName, accessorInfo, accessed)
139
- rewire(reference, accessor)
141
+ else ifNoHost(reference)
140
142
}
141
143
142
144
/** Replace tree with a reference to an accessor if needed */
@@ -156,6 +158,12 @@ object AccessProxies {
156
158
/** Where an accessor for the `accessed` symbol should be placed.
157
159
* This is the closest enclosing class that has `accessed` as a member.
158
160
*/
159
- def hostForAccessorOf (accessed : Symbol )(implicit ctx : Context ): Symbol =
160
- ctx.owner.ownersIterator.findSymbol(_.derivesFrom(accessed.owner))
161
+ def hostForAccessorOf (accessed : Symbol )(implicit ctx : Context ): Symbol = {
162
+ def recur (cls : Symbol ): Symbol =
163
+ if (! cls.exists) NoSymbol
164
+ else if (cls.derivesFrom(accessed.owner)) cls
165
+ else if (cls.companionModule.moduleClass == accessed.owner) accessed.owner
166
+ else recur(cls.owner)
167
+ recur(ctx.owner)
168
+ }
161
169
}
0 commit comments