diff options
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/RefChecks.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index fb10d2b1b2..ffecaf5a39 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -598,8 +598,23 @@ abstract class RefChecks extends InfoTransform { .setPos(tree.pos) .setSymbol(sym.moduleClass) .setType(NoType); - if (sym.isStatic) List(transform(cdef)) - else { + if (sym.isStatic) { + if (!sym.allOverriddenSymbols.isEmpty) { + val factory = sym.owner.newMethod(sym.pos, sym.name) + .setFlag(sym.flags | STABLE).resetFlag(MODULE) + .setInfo(PolyType(List(), sym.moduleClass.tpe)) + sym.owner.info.decls.enter(factory) + val ddef = + atPhase(phase.next) { + localTyper.typed { + gen.mkModuleAccessDef(factory, sym.tpe) + } + } + transformTrees(List(cdef, ddef)) + } else { + List(transform(cdef)) + } + } else { val vdef = localTyper.typed { atPos(tree.pos) { @@ -611,7 +626,7 @@ abstract class RefChecks extends InfoTransform { atPhase(phase.next) { localTyper.typed { if (sym.owner.isTrait) gen.mkModuleAccessDcl(sym) - else gen.mkModuleAccessDef(sym, vdef.symbol) + else gen.mkCachedModuleAccessDef(sym, vdef.symbol) } } |