@@ -143,8 +143,8 @@ abstract class Duplicators extends Analyzer {
143
143
else
144
144
sym
145
145
146
- private def invalidate (tree : Tree ) {
147
- debuglog(" attempting to invalidate " + tree.symbol + " , owner - " + ( if (tree.symbol ne null ) tree.symbol.owner else " <NULL> " ) )
146
+ private def invalidate (tree : Tree , owner : Symbol = NoSymbol ) {
147
+ debuglog(" attempting to invalidate " + tree.symbol)
148
148
if (tree.isDef && tree.symbol != NoSymbol ) {
149
149
debuglog(" invalid " + tree.symbol)
150
150
invalidSyms(tree.symbol) = tree
@@ -158,18 +158,20 @@ abstract class Duplicators extends Analyzer {
158
158
newsym.setInfo(fixType(ldef.symbol.info))
159
159
ldef.symbol = newsym
160
160
debuglog(" newsym: " + newsym + " info: " + newsym.info)
161
-
161
+
162
162
case vdef @ ValDef (mods, name, _, rhs) if mods.hasFlag(Flags .LAZY ) =>
163
163
debuglog(" ValDef " + name + " sym.info: " + vdef.symbol.info)
164
164
invalidSyms(vdef.symbol) = vdef
165
- val newsym = vdef.symbol.cloneSymbol(context.owner)
165
+ val newowner = if (owner != NoSymbol ) owner else context.owner
166
+ val newsym = vdef.symbol.cloneSymbol(newowner)
166
167
newsym.setInfo(fixType(vdef.symbol.info))
167
168
vdef.symbol = newsym
168
- debuglog(" newsym: " + newsym + " info: " + newsym.info)
169
-
169
+ debuglog(" newsym: " + newsym + " info: " + newsym.info + " , owner: " + newsym.owner + " , " + newsym.owner.isClass)
170
+ if (newsym.owner.isClass) newsym.owner.info.decls enter newsym
171
+
170
172
case DefDef (_, name, tparams, vparamss, _, rhs) =>
171
173
// invalidate parameters
172
- invalidate (tparams ::: vparamss.flatten)
174
+ invalidateAll (tparams ::: vparamss.flatten)
173
175
tree.symbol = NoSymbol
174
176
175
177
case _ =>
@@ -178,14 +180,14 @@ abstract class Duplicators extends Analyzer {
178
180
}
179
181
}
180
182
181
- private def invalidate (stats : List [Tree ]) {
182
- stats foreach invalidate
183
+ private def invalidateAll (stats : List [Tree ], owner : Symbol = NoSymbol ) {
184
+ stats. foreach( invalidate(_, owner))
183
185
}
184
186
185
187
def retypedMethod (ddef : DefDef , oldThis : Symbol , newThis : Symbol ): Tree = {
186
188
oldClassOwner = oldThis
187
189
newClassOwner = newThis
188
- invalidate (ddef.tparams)
190
+ invalidateAll (ddef.tparams)
189
191
mforeach(ddef.vparamss) { vdef =>
190
192
invalidate(vdef)
191
193
vdef.tpe = null
@@ -239,15 +241,15 @@ abstract class Duplicators extends Analyzer {
239
241
240
242
case Block (stats, res) =>
241
243
debuglog(" invalidating block" )
242
- invalidate (stats)
244
+ invalidateAll (stats)
243
245
invalidate(res)
244
246
tree.tpe = null
245
247
super .typed(tree, mode, pt)
246
248
247
249
case ClassDef (_, _, _, tmpl @ Template (parents, _, stats)) =>
248
- // log("invalidating classdef " + tree.tpe )
250
+ // log("invalidating classdef " + tree)
249
251
tmpl.symbol = tree.symbol.newLocalDummy(tree.pos)
250
- invalidate (stats)
252
+ invalidateAll (stats, tree.symbol )
251
253
tree.tpe = null
252
254
super .typed(tree, mode, pt)
253
255
0 commit comments